
    bO                        d dl Z d dlZd dlZd dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	 d e
e          vrej        e_        ej        e_        dZdZd	Zd
 Z G d de          Z G d d          Z G d d          Z G d d          Z G d d          Z G d d          Z G d d          Z G d d          Z G d d          Z G d d          Z G d d           Zi d! eej                  d" eej                   d# eej!                  d$ eej"                  d% eej#                  d& eej$                  d' eej%                  d( eej&                  d) eej'                  d* e            d+ eej(                  d, eej)                  d- eej*         e                      d. eej+                  d/ e            d0 eej,                  d1 eej-                  i d2 eej.                  d3 eej/                  d4 eej0                  d5 eej1                  d6 eej2                  d7 eej3                  d8 eej4                  d9 eej5                  d: eej6                  d; eej7                  d< eej8                  d= eej9                  d> eej:                  d? eej;                  d@ eej<                  dA eej=                  dB eej>                  i dC eej?                  dD eej@                  dE eejA                  dF eejB                  dG eejC                  dH eejD                  dI eejE                  dJ eejF                  dK eejG                  dL eejH                  dM eejI                  dN eejJ                  dO eejK                  dP eejL                  dQ eejM                  dR eejN         e                      dS eejN         e                       eejO         e                       eejP         e                       eejQ         e                       eejR         e                       eejS                   eejT                   eejU                   eejV                   eejW                   eejX                   eejY                   eejZ                   eej[                   eej\         e                       eej]                  dTZ^dU Z_d\dWZ`dX Zad]dYZbdZ Zcd[ ZddS )^    N   magic)pb)pb2dictencodebytes         c                     | dz
  |dz
  z  dz   S Nr    )xys     6/usr/lib/python3/dist-packages/pycriu/images/images.pyround_upr   ?   s    !eA!#$    c                       e Zd Zd ZdS )MagicExceptionc                     || _         d S Nr   )selfr   s     r   __init__zMagicException.__init__D   s    


r   N)__name__
__module____qualname__r   r   r   r   r   r   C   s#            r   r   c                   <    e Zd ZdZd
dZddZddZd Zd Zd	 Z	dS )entry_handlerzp
    Generic class to handle loading/dumping criu images
    entries from/to bin format to/from dict(json).
    Nc                 "    || _         || _        dS )z=
        Sets payload class and extra handler class.
        N)payloadextra_handler)r   r    r!   s      r   r   zentry_handler.__init__P   s     *r   Fc                    g }	 i }|                                  }|                    d          }|dk    rnt          j        d|          \  }|                    |                    |                     t          j        ||          }| j        rP|r0d }	| j                            ||          }
d |	|
          z  |d<   n| j                            ||          |d<   |	                    |           |S )z
        Convert criu image entries from binary format to dict(json).
        Takes a file-like object and returns a list with entries in
        dict(json) format.
        Tr
   r   ic                 v    dD ]2}| dk     r%t          |           | k    r	d| |fz  c S d| |fz  c S | dz  } 3d| z  S )N) KMGTPEZg      @z%d%sBz%.1f%sBz%.1fYB)int)numunits     r   human_readablez*entry_handler.load.<locals>.human_readableo   sh    $K * *D"V||#&s88s??+2c4[+@$@$@$@+4T{+B$B$B$B6MCC'#~-r   z... <%s>extra)
r    readstructunpackParseFromStringr   r!   skiploadappend)r   fpretty
no_payloadentriesentrypbuffbufsizer0   pl_sizes              r   r7   zentry_handler.loadW   s    	"E LLNNE&&))CczzM#s++ED!!!&&,,///OE622E ! G G. . . #055a??G%/..2I2I%IE'NN%)%7%<%<Q%F%FE'NNN5!!!?	"B r   c                 V    t          j        |          }|                     ||          S )zD
        Same as load(), but takes a string as an argument.
        ioBytesIOr7   r   sr:   r9   s       r   loadszentry_handler.loads   s%     JqMMyyF###r   c                    |D ]}|                     dd          }|                                 }t          j        ||           |                                }t          |          }|                    t          j        d|                     |                    |           | j	        r|r| j	        
                    |||           dS )z
        Convert criu image entries from dict(json) format to binary.
        Takes a list of entries and a file-like object to write entries
        in binary format to.
        r1   Nr#   )popr    r   dict2pbSerializeToStringlenwriter3   packr!   dump)r   r<   r9   r=   r1   r>   pb_strr@   s           r   rP   zentry_handler.dump   s      	9 	9EIIgt,,E LLNNEOE5))),,..Fv;;DGGFKT**+++GGFOOO ! 9e 9"''q%888	9 	9r   c                 ~    t          j        d          }|                     ||           |                                S )zf
        Same as dump(), but doesn't take file-like object and just
        returns a string.
        r%   rD   rE   rP   r2   r   r<   r9   s      r   dumpszentry_handler.dumps   s2    
 JrNN		'1vvxxr   c                     d}	 |                     d          }|dk    rn3t          j        d|          \  }|                    |d           |dz  }O|S )zI
        Counts the number of top-level object in the image file
        r   Tr
   r%   r#   r   )r2   r3   r4   seek)r   r9   r<   r?   r@   s        r   countzentry_handler.count   sb     	&&))CbyyM#s++EDFF4OOOqLG	 r   r   FFF)
r   r   r   __doc__r   r7   rH   rP   rU   rX   r   r   r   r   r   J   s         
+ + + +) ) ) )V$ $ $ $9 9 9*      r   r   c                   4    e Zd ZdZd	dZd
dZd Zd Zd ZdS )pagemap_handlerz
    Special entry handler for pagemap.img, which is unique in a way
    that it has a header of pagemap_head type followed by entries
    of pagemap_entry type.
    Fc                 `   g }t          j                    }	 |                    d          }|dk    rn{t          j        d|          \  }|                    |                    |                     |                    t          j        ||                     t          j                    }|S )NTr
   r   r#   )	r   pagemap_headr2   r3   r4   r5   r8   r   pagemap_entry)r   r9   r:   r;   r<   r>   r?   r@   s           r   r7   zpagemap_handler.load   s    !!	'&&))CczzM#s++ED!!!&&,,///NN7?5&99:::$&&E	' r   c                 V    t          j        |          }|                     ||          S r   rC   rF   s       r   rH   zpagemap_handler.loads   #    JqMMyyF###r   c                 F   t          j                    }|D ]}t          j        ||           |                                }t          |          }|                    t          j        d|                     |                    |           t          j	                    }d S )Nr#   )
r   r_   r   rK   rL   rM   rN   r3   rO   r`   r   r<   r9   r>   itemrQ   r@   s          r   rP   zpagemap_handler.dump   s    !! 	' 	'DOD%(((,,..Fv;;DGGFKT**+++GGFOOO$&&EE	' 	'r   c                 ~    t          j        d          }|                     ||           |                                S Nr%   rS   rT   s      r   rU   zpagemap_handler.dumps   0    JrNN		'1vvxxr   c                 L    t          d                               |          dz
  S r   )r   rX   )r   r9   s     r   rX   zpagemap_handler.count   s#    T""((++a//r   NrY   rZ   )	r   r   r   r[   r7   rH   rP   rU   rX   r   r   r   r]   r]      ss             $ $ $ $	' 	' 	'  
0 0 0 0 0r   r]   c                   *    e Zd ZddZddZd Zd ZdS )	ghost_file_handlerFc                 J   g }t          j                    }|                    d          }t          j        d|          \  }|                    |                    |                     t          j        ||          }|j        r(|                    |           	 t          j	                    }	|                    d          }t          |          dk    rnt          j        d|          \  }|	                    |                    |                     t          j        |	|          }
|r&|                    |	j
        t          j                   nBt          j        |                    |	j
                                                d          |
d<   |                    |
           nt|r!|                    dt          j                   n<t          j        |                                                              d          |d<   |                    |           |S )Nr
   r#   Tr   utf-8r1   )r   ghost_file_entryr2   r3   r4   r5   r   chunksr8   ghost_chunk_entryrM   rW   osSEEK_CURbase64r   decodeSEEK_END)r   r9   r:   r;   r<   gfr?   r@   g_entrygcr=   s              r   r7   zghost_file_handler.load   s    ""ffQiic3''
166$<<(((/"f--9 	$NN7###&)++ffQiis88q==c3//""166$<<000F33 XFF262;////%+%7rv%G%G%N%Nw%W%WE'Nu%%%&   Pq"+&&&&#)#5affhh#?#?#F#Fw#O#O NN7###r   c                 V    t          j        |          }|                     ||          S r   rC   rF   s       r   rH   zghost_file_handler.loads  rb   r   c           	         t          j                    }|                    d          }t          j        ||           |                                }t          |          }|                    t          j	        d|                     |                    |           |j
        r|D ]}t          j                    }t          j        ||           |                                }t          |          }|                    t          j	        d|                     |                    |           t          j        dk    rF|                    t          j        t                               |d                                        |                    t          j        |d                              d S t          j        dk    rG|                    t          j        t                               |d                                        d S |                    t          j        |d                              d S )Nr   r#      r   r1   )r   rn   rJ   r   rK   rL   rM   rN   r3   rO   ro   rp   sysversion_infors   decodebytesstrencoderd   s          r   rP   zghost_file_handler.dump  s   #%%{{1~~e$$$((**6{{	C&&'''	< 	; 
? 
?,..e,,,00226{{C..///$v--GGF.szz$w-/H/HIIJJJJGGF.tG}==>>>>
? 
?  6))*3::d7m+D+DEEFFFFF*4=99:::::r   c                 ~    t          j        d          }|                     ||           |                                S rg   rS   rT   s      r   rU   zghost_file_handler.dumps*  rh   r   NrY   rZ   )r   r   r   r7   rH   rP   rU   r   r   r   rk   rk      s[           B$ $ $ $; ; ;6    r   rk   c                        e Zd Zd Zd Zd ZdS )pipes_data_extra_handlerc                     |j         }|                    |          }t          j        |                              d          S Nrm   )bytesr2   rs   r   rt   r   r9   ploadr@   datas        r   r7   zpipes_data_extra_handler.load7  s7    {vvd||!$''..w777r   c                     t           j        dk    r-t          j        t                              |                    }nt          j        |          }|                    |           d S Nr{   r}   r~   rs   r   r   r   rN   r   r1   r9   r   r   s        r   rP   zpipes_data_extra_handler.dump<  Q    v%%%cjj&7&788DD%e,,D	r   c                 Z    |                     |j        t          j                   |j        S r   rW   r   rq   rr   r   r9   r   s      r   r6   zpipes_data_extra_handler.skipC  "    	u{BK((({r   Nr   r   r   r7   rP   r6   r   r   r   r   r   6  sA        8 8 8
      r   r   c                        e Zd Zd Zd Zd ZdS )sk_queues_extra_handlerc                     |j         }|                    |          }t          j        |                              d          S r   )lengthr2   rs   r   rt   r   s        r   r7   zsk_queues_extra_handler.loadI  s7    |vvd||!$''..w777r   c                     t           j        dk    r-t          j        t                              |                    }nt          j        |          }|                    |           d S r   r   )r   r1   r9   _unusedr   s        r   rP   zsk_queues_extra_handler.dumpN  r   r   c                 Z    |                     |j        t          j                   |j        S r   )rW   r   rq   rr   r   s      r   r6   zsk_queues_extra_handler.skipU  s"    	u|R[)))|r   Nr   r   r   r   r   r   H  sA        8 8 8
      r   r   c                        e Zd Zd Zd Zd ZdS )tcp_stream_extra_handlerc                    i }|                     |j                  }|                     |j                  }t          j        |                              d          |d<   t          j        |                              d          |d<   |S )Nrm   inqoutq)r2   inq_lenoutq_lenrs   r   rt   )r   r9   r>   dr   r   s         r   r7   ztcp_stream_extra_handler.load[  sv    ffU]##vven%%%c**11'::%&t,,33G<<&	r   c                    t           j        dk    ret          j        t                              |d                             }t          j        t                              |d                             }n4t          j        |d                   }t          j        |d                   }|                    |           |                    |           d S )Nr{   r   r   r   )r   r1   r9   r   r   r   s         r   rP   ztcp_stream_extra_handler.dumpf  s    v%%$SZZe%=%=>>C%cjjv&?&?@@DD$U5\22C%eFm44D		r   c                 `    |                     dt          j                   |j        |j        z   S )Nr   )rW   rq   ru   r   r   )r   r9   r>   s      r   r6   ztcp_stream_extra_handler.skipq  s'    	q"+}u~--r   Nr   r   r   r   r   r   Z  sA        	 	 		 	 	. . . . .r   r   c                        e Zd Zd Zd Zd ZdS )bpfmap_data_extra_handlerc                     |j         |j        z   }|                    |          }t          j        |                              d          S r   )
keys_bytesvalues_bytesr2   rs   r   rt   r   s        r   r7   zbpfmap_data_extra_handler.loadv  s@    %"44vvd||!$''..w777r   c                 X    t          j        |          }|                    |           d S r   )rs   r   rN   r   s        r   rP   zbpfmap_data_extra_handler.dump{  s%    !%((	r   c                 Z    |                     |j        t          j                   |j        S r   r   r   s      r   r6   zbpfmap_data_extra_handler.skip  r   r   Nr   r   r   r   r   r   u  sA        8 8 8
      r   r   c                        e Zd Zd Zd Zd ZdS )ipc_sem_set_handlerc                    t          j         |          }t          |d         z  }t          |t                    }t	          j        d          }|j        t          k    rt          d          |                    |                    |                     |	                    ||z
  d           |
                                S )NnsemsHArray size mismatchr   )r   
sizeof_u16r   
sizeof_u64arrayitemsize	Exception	frombytesr2   rW   tolist)r   r9   r>   r=   r@   roundedrG   s          r   r7   zipc_sem_set_handler.load  s    &&E'N*4,,K:##1222	AFF4LL!!!	w~q!!!xxzzr   c                    t          j         |          }t          |d         z  }t          |t                    }t	          j        d          }|j        t          k    rt          d          |                    |           t          |          |d         k    rt          d          |	                    |
                                           |	                    d||z
  z             d S )Nr   r   r   zNumber of semaphores mismatch    )r   r   r   r   r   r   r   fromlistrM   rN   tobytes)r   r1   r9   r>   r=   r@   r   rG   s           r   rP   zipc_sem_set_handler.dump  s    &&E'N*4,,K:##1222	

5q66U7^##;<<<				4()))))r   c                     t          j         |          }t          |d         z  }|                    t          |t                    t
          j                   |S )Nr   )r   r   rW   r   r   rq   rr   )r   r9   r>   r=   r@   s        r   r6   zipc_sem_set_handler.skip  sD    &&E'N*	xj))2;777r   Nr   r   r   r   r   r     sA        	 	 	* * *    r   r   c                        e Zd Zd Zd Zd ZdS )ipc_msg_queue_handlerc                    t          j         |          }g }t          d|d                   D ]&}|                    d          }|dk    r nt          j        d|          \  }t          j                    }|                    |                    |                     t          |j	        t                    }	|                    |j	                  }
|                    |	|j	        z
  d           |                    t          j         |                     |                    t          j        |
                              d                     (|S )Nr   qnumr
   r%   r#   r   rm   )r   ranger2   r3   r4   r   ipc_msgr5   r   msizer   rW   r8   rs   r   rt   )r   r9   r>   r=   messagesr   r?   r@   msgr   r   s              r   r7   zipc_msg_queue_handler.load  s   &&q%-(( 	F 	FA&&))CbyyM#s++ED*,,Ct---sy*55G66#)$$DFF7SY&***OOGOC00111OOF.t44;;GDDEEEEr   c                    t          dt          |          d          D ]P}t          j                    }t	          j        ||         |           |                                }t          |          }|                    t          j	        d|                     |                    |           t          |j        t                    }t          j        dk    r6t          j        t"                              ||dz                                }	nt          j        ||dz                      }	|                    |	d |j                            |                    d||j        z
  z             Rd S )Nr   r	   r#   r{   r   r   )r   rM   r   r   r   rK   rL   rN   r3   rO   r   r   r   r}   r~   rs   r   r   r   )
r   r1   r9   r>   r#   r   msg_strr@   r   r   s
             r   rP   zipc_msg_queue_handler.dump  s5   q#e**a(( 	3 	3A*,,COE!Hc***++--Gw<<DGGFKT**+++GGGsy*55G 6)))#**U1q5\*B*BCC)%A,77GGD#)$%%%GGEWsy012222	3 	3r   c                    t          j         |          }d}t          d|d                   D ]}|                    d          }|dk    r nt          j        d|          \  }t          j                    }|                    |                    |                     t          |j	        t                    }	|                    |	t          j                   |||j	        z   z  }|S )Nr   r   r
   r%   r#   )r   r   r2   r3   r4   r   r   r5   r   r   r   rW   rq   rr   )
r   r9   r>   r=   pl_lenr   r?   r@   r   r   s
             r   r6   zipc_msg_queue_handler.skip  s    &&q%-(( 		' 		'A&&))CbyyM#s++ED*,,Ct---sy*55GFF7BK(((dSY&&FFr   Nr   r   r   r   r   r     sA          "3 3 3     r   r   c                        e Zd Zd Zd Zd ZdS )ipc_shm_handlerc                    t          j         |          }|d         }|                    |          }t          |t                    }|                    ||z
  d           t          j        |                              d          S )Nr@   r   rm   )r   r2   r   
sizeof_u32rW   rs   r   rt   )r   r9   r>   r=   r@   r   r   s          r   r7   zipc_shm_handler.load  so    &&V}vvd||4,,	w~q!!!!$''..w777r   c                     t          j         |          }|d         }t          j        |          }t          |t                    }|                    |d |                    |                    d||z
  z             d S )Nr@   r   )r   rs   r   r   r   rN   )r   r1   r9   r>   r=   r@   r   r   s           r   rP   zipc_shm_handler.dump  st    &&V}!%((4,,	UdU	4()))))r   c                     t          j         |          }|d         }t          |t                    }|                    |t          j                   |S )Nr@   )r   r   r   rW   rq   rr   )r   r9   r>   r=   r@   r   s         r   r6   zipc_shm_handler.skip  sD    &&V}4,,	w$$$r   Nr   r   r   r   r   r     sA        8 8 8* * *    r   r   	INVENTORYCOREIDSCREDSUTSNSTIMENSPIDNSIPC_VARFS
GHOST_FILEMMCGROUP
TCP_STREAMSTATSPAGEMAPPSTREE	REG_FILESNS_FILESEVENTFD_FILEEVENTPOLL_FILEEVENTPOLL_TFDSIGNALFDTIMERFDINOTIFY_FILE
INOTIFY_WDFANOTIFY_FILEFANOTIFY_MARKVMASPIPESFIFOSIGACT
NETLINK_SKREMAP_FPATHMNTS	TTY_FILESTTY_INFOTTY_DATARLIMITTUNFILE	EXT_FILESIRMAP_CACHE
FILE_LOCKSFDINFOUNIXSKINETSKPACKETSKITIMERSPOSIX_TIMERSNETDEV
PIPES_DATA	FIFO_DATA)	SK_QUEUES	IPCNS_SHM	IPCNS_SEM	IPCNS_MSGNETNSUSERNSSECCOMPAUTOFSFILESCPUINFO
MEMFD_FILEMEMFD_INODEBPFMAP_FILEBPFMAP_DATAAPPARMORc                    t          j        d|                     d                    \  }|t          j        d         t          j        d         fv r*t          j        d|                     d                    \  }	 t          j        |         }n#  t          |          xY w	 t          |         }n#  t          d|z             xY w||fS )Nr#   r
   
IMG_COMMONIMG_SERVICEz&No handler found for image with magic )	r3   r4   r2   r   by_nameby_valr   handlersr   )r9   	img_magicmhandlers       r   
__rhandlerr  8  s    sAFF1II..JIU]<0]=13 3 3]3q		22
	(L#(Y'''F1+F@1DEEEg:s   <B B $B2 2CFc                 l    i }t          |           \  }}||d<   |                    | ||          |d<   |S )z
    Convert criu image from binary format to dict(json).
    Takes a file-like object to read criu image from.
    Returns criu image in dict(json) format.
    r   r<   )r  r7   )r9   r:   r;   imager  r  s         r   r7   r7   L  s@     EAJAwE'N||Avz::E)Lr   c                 h    i }t          |           \  }}||d<   |                    |           |d<   |S )Nr   rX   )r  rX   )r9   resr  r  s       r   infor#  \  s9    
CAJAwCL==##CLJr   c                 J    t          j        |           }t          ||          S )z-
    Same as load(), but takes a string.
    rC   )rG   r:   r9   s      r   rH   rH   g  s     	
1A6??r   c                 
   | d         }t           j        | d                  }|dk    ru|dv r9|                    t          j        dt           j        d                              n8|                    t          j        dt           j        d                              |                    t          j        d|                     	 t
          |         }n#  t          d          xY w|                    | d         |           d	S )
z
    Convert criu image from dict(json) format to binary.
    Takes an image in dict(json) format and file-like
    object to write to.
    r   r   )r   r   r#   r  r  z*No handler found for image with such magicr<   N)r   r  rN   r3   rO   r  r   rP   )imgr9   r  	magic_valr  s        r   rP   rP   o  s     	GAc'l+I 	K(((GGFKU]=%ABBCCCCGGFKU]<%@AABBBGGFKY''(((F1+FDEEELLY#####s   C C$c                 r    t          j        d          }t          | |           |                                S )zK
    Same as dump(), but takes only an image and returns
    a string.
    r   )rD   rE   rP   getvalue)r&  r9   s     r   rU   rU     s,    
 	
3AaLLL::<<r   rY   rZ   )erD   rs   r3   rq   r   r}   r%   r   r   r   direncodestringr   decodestringr   r   r   r   r   r   r   r   r]   rk   r   r   r   r   r   r   r   inventory_entry
core_entrytask_kobj_ids_entrycreds_entryutsns_entrytimens_entrypidns_entryipc_var_entryfs_entrymm_entrycgroup_entrytcp_stream_entrystats_entrypstree_entryreg_file_entryns_file_entryeventfd_file_entryeventpoll_file_entryeventpoll_tfd_entrysignalfd_entrytimerfd_entryinotify_file_entryinotify_wd_entryfanotify_file_entryfanotify_mark_entry	vma_entry
pipe_entry
fifo_entrysa_entrynetlink_sk_entryremap_file_path_entry	mnt_entrytty_file_entrytty_info_entrytty_data_entryrlimit_entrytunfile_entryext_file_entryirmap_cache_entryfile_lock_entryfdinfo_entryunix_sk_entryinet_sk_entrypacket_sock_entryitimer_entryposix_timer_entrynet_device_entrypipe_data_entrysk_packet_entryipc_shm_entryipc_sem_entryipc_msg_entrynetns_entryuserns_entryseccomp_entryautofs_entry
file_entrycpuinfo_entrymemfd_file_entrymemfd_inode_entrybpfmap_file_entrybpfmap_data_entryapparmor_entryr  r  r7   r#  rH   rP   rU   r   r   r   <module>rl     s	  P 
			   				  



                  F##,F,F 


% % %    Y   k k k k k k k k^,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0`D D D D D D D DZ       $       $. . . . . . . .6              @0 0 0 0 0 0 0 0f       2Fr122F
MM"-((F 
==/00F ]]2>**	F
 ]]2>**F mmBO,,F ]]2>**F }}R-..F 	--
$
$F $$&&F 	--
$
$F mmBO,,F -- 3 8 8 : :< <F ]]2>**F    !F" mmBO,,#F$ r011%F F& b.//'F( MM""788)F* mmB$;<<+F, ]]2#9::-F. b/00/F0 }}R-..1F2 MM""7883F4 -- 3445F6 ]]2#9::7F8 ]]2#9::9F: MM",'';F< ]]2=))=F> MM"-((?F@ mmBK((AFB -- 344CFD ==!9::EFF MM",''GF F FH r011IFJ b/00KFL b/00MFN mmBO,,OFP }}R-..QFR r011SFT ==!566UFV -- 233WFX mmBO,,YFZ mmB,--[F\ mmB,--]F^ b233_F` }}R_--aFb MM""677cFd mmB/00eFf -- 2 8 8 : :< <gFj r13K3K3M3MNNkF Fl r13J3J3L3LMMr/1B1BCCr/1D1D1F1FGGr/1F1F1H1HII]2>**mBO,,}R-..mBO,,]2=))}R-..- 344 =!566 =!566 =!5 9 9 ; ;= =b/00KF F FR  (         $ $ $6    r   