3  i5MC@sddlZddlZddlZddlZddlZddlmZddlmZddlmZde ekrhej e_ ej e_ dZdZd Zd d ZGd d d eZddZddZGdddZGdddZGdddZGdddZGdddZGdddZGdddZGd d!d!ZGd"d#d#ZGd$d%d%Zeej eej!eej"eej#eej$eej%eej&eej'eej(eeej)eej*eej+eeej,eeej-eej.eej/eej0eej1eej2eej3eej4eej5eej6eej7eej8eej9eej:eej;eej<eej=eej>eej?eej@eejAeejBeejCeejDeejEeejFeejGeejHeejIeejJeejKeejLeejMeejNeejOeeejOeeejPeeejQeeejReeejSeeejTeejUeejVeejWeejXeejYeejZeej[eej\eej]eeej^d&BZ_d'd(Z`d4d*d+Zad,d-Zbd5d.d/Zcd0d1Zdd2d3ZedS)6N)magic)pb)pb2dict encodebytescCs|d|dBdS)Nr)xyr r /usr/lib/python3.6/images.pyround_up>src@seZdZddZdS)MagicExceptioncCs ||_dS)N)r)selfrr r r __init__CszMagicException.__init__N)__name__ __module__ __qualname__rr r r r rBsrcCstjtj|S)z(A helper function to decode base64 data.)base64 decodebytesstrencode)datar r r decode_base64_dataGsrcCs|jtjtj|dS)z9A helper function to write base64 encoded data to a file.N)writerrrr)frr r r write_base64_dataLsrc@sFeZdZdZdddZdddZddd Zd d Zd d ZddZ dS) entry_handlerzp Generic class to handle loading/dumping criu images entries from/to bin format to/from dict(json). NcCs||_||_dS)z= Sets payload class and extra handler class. N)payload extra_handler)rrr r r r rYszentry_handler.__init__Fc Csg}xi}|j}|jd}t|dkr*Ptjd|\}|j|j|tj||}|jr|rdd} |jj||} d| | |d<n|jj |||d<|j |qW|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. rricSsJx@d D]8}|d kr6t||kr*d ||fSd ||fS|d }qWd |S)NKMGTPEZg@z%d%sBz%.1f%sBz%.1fYB)r"r#r$r%r&r'r(r))int)ZnumZunitr r r human_readablexs     z*entry_handler.load..human_readablez... <%s>extra) rreadlenstructunpackParseFromStringrr skiploadappend) rrpretty no_payloadentriesentrypbuffbufsizer+Zpl_sizer r r r3`s$    zentry_handler.loadcCstj|}|j||S)zD Same as load(), but takes a string as an argument. )ioBytesIOr3)rsr5rr r r loadss zentry_handler.loadscCsxxr|D]j}|jdd}|j}tj|||j}t|}|jtjd||j||j r|r|j j |||qWdS)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. r,Nr!) poprrdict2pbSerializeToStringr.rr/packr dump)rr7rr8r,r9pb_strr;r r r rDs     zentry_handler.dumpcCstjd}|j|||jS)zf Same as dump(), but doesn't take file-like object and just returns a string. r")r<r=rDr-)rr7rr r r dumpss  zentry_handler.dumpscCsHd}x>|jd}t|dkrPtjd|\}|j|d|d7}qW|S)zI Counts the number of top-level object in the image file rrr!r)r-r.r/r0seek)rrr7r:r;r r r counts    zentry_handler.count)N)FF)F) rrr__doc__rr3r?rDrFrHr r r r rSs  +  rc@s<eZdZdZdddZdddZddZd d Zd d Zd 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. FcCsfg}tj}xT|jd}t|dkr&Ptjd|\}|j|j||jtj||tj }qW|S)Nrrr!) r pagemap_headr-r.r/r0r1r4r pagemap_entry)rrr5r6r7r9r:r;r r r r3s   zpagemap_handler.loadcCstj|}|j||S)N)r<r=r3)rr>r5rr r r r?s zpagemap_handler.loadscCsZtj}xL|D]D}tj|||j}t|}|jtjd||j|tj }qWdS)Nr!) rrKrrArBr.rr/rCrL)rr7rr9itemrEr;r r r rDs   zpagemap_handler.dumpcCstjd}|j|||jS)Nr")r<r=rDr-)rr7rr r r rFs  zpagemap_handler.dumpscCstdj|dS)Nr)rrH)rrr r r rHszpagemap_handler.countN)FF)F) rrrrIr3r?rDrFrHr r r r rJs    rJc@s0eZdZd ddZd ddZddZdd Zd S) ghost_file_handlerFc Csg}tj}|jd}tjd|\}|j|j|tj||}|jr|j|xtj } |jd}t |dkrrPtjd|\}| j|j|tj| |} |r|j | j t j ntj|j| j jd| d<|j| qRWn6|r|j dt jntj|jjd|d<|j||S)Nrr!rzutf-8r,)rghost_file_entryr-r/r0r1rchunksr4ghost_chunk_entryr.rGosSEEK_CURrrdecodeSEEK_END) rrr5r6r7Zgfr:r;Zg_entrygcr8r r r r3s2       zghost_file_handler.loadcCstj|}|j||S)N)r<r=r3)rr>r5rr r r r?s zghost_file_handler.loadscCstj}|jd}tj|||j}t|}|jtj d||j||j rxj|D]R}tj }tj|||j}t|}|jtj d||j|t ||dqVWnt ||ddS)Nrr!r,) rrOr@rrArBr.rr/rCrPrQr)rr7rr9rMrEr;r r r rDs"      zghost_file_handler.dumpcCstjd}|j|||jS)Nr")r<r=rDr-)rr7rr r r rF-s  zghost_file_handler.dumpsN)FF)F)rrrr3r?rDrFr r r r rNs ! rNc@s$eZdZddZddZddZdS)pipes_data_extra_handlercCs |j}|j|}tj|jdS)Nzutf-8)bytesr-rrrT)rrploadr;rr r r r3:s zpipes_data_extra_handler.loadcCst|}|j|dS)N)rr)rr,rrYrr r r rD?szpipes_data_extra_handler.dumpcCs|j|jtj|jS)N)rGrXrRrS)rrrYr r r r2Cszpipes_data_extra_handler.skipN)rrrr3rDr2r r r r rW9srWc@s$eZdZddZddZddZdS)sk_queues_extra_handlercCs |j}|j|}tj|jdS)Nzutf-8)lengthr-rrrT)rrrYr;rr r r r3Is zsk_queues_extra_handler.loadcCst|}|j|dS)N)rr)rr,r_unusedrr r r rDNszsk_queues_extra_handler.dumpcCs|j|jtj|jS)N)rGr[rRrS)rrrYr r r r2Rszsk_queues_extra_handler.skipN)rrrr3rDr2r r r r rZHsrZc@s$eZdZddZddZddZdS)tcp_stream_extra_handlercCsHi}|j|j}|j|j}tj|jd|d<tj|jd|d<|S)Nzutf-8inqoutq)r-inq_lenoutq_lenrrrT)rrr9dr^r_r r r r3Xs   ztcp_stream_extra_handler.loadcCs0t|d}t|d}|j||j|dS)Nr^r_)rr)rr,rr\r^r_r r r rDcs   ztcp_stream_extra_handler.dumpcCs|jdtj|j|jS)Nr)rGrRrUr`ra)rrr9r r r r2jsztcp_stream_extra_handler.skipN)rrrr3rDr2r r r r r]Ws r]c@s$eZdZddZddZddZdS)bpfmap_data_extra_handlercCs&|j|j}|j|}tj|jdS)Nzutf-8)Z keys_bytesZ values_bytesr-rrrT)rrrYr;rr r r r3ps  zbpfmap_data_extra_handler.loadcCstj|}|j|dS)N)rrr)rr,rrYrr r r rDus zbpfmap_data_extra_handler.dumpcCs|j|jtj|jS)N)rGrXrRrS)rrrYr r r r2yszbpfmap_data_extra_handler.skipN)rrrr3rDr2r r r r rcosrcc@s,eZdZddZddZddZddZd S) ipc_sem_set_handlercCsPtj|}t|d}t|t}|j}|j|j||j||d|jS)Nnsemsr) r sizeof_u16r sizeof_u64_get_sem_arrayZ frombytesr-rGtolist)rrr9r8r;roundedr>r r r r3s   zipc_sem_set_handler.loadcCsntj|}t|d}t|t}|j}|j|t||dkrJtd|j|j |jd||dS)NrezNumber of semaphores mismatch) rrfrrgrhfromlistr. Exceptionrtobytes)rr,rr9r8r;rjr>r r r rDs    zipc_sem_set_handler.dumpcCs.tj|}t|d}|jt|ttj|S)Nre)rrfrGrrgrRrS)rrr9r8r;r r r r2s  zipc_sem_set_handler.skipcCs tjd}|jtkrtd|S)NHzArray size mismatch)arrayitemsizerfrm)rr>r r r rhs  z"ipc_sem_set_handler._get_sem_arrayN)rrrr3rDr2rhr r r r rd~s  rdc@s.eZdZddZddZddZd dd Zd S) ipc_msg_queue_handlercCs|j||\}}|S)N)_read_messages)rrr9messages_r r r r3szipc_msg_queue_handler.loadc Csxtdt|dD]}tj}tj||||j}t|}|jtj d||j|t |j t }t ||d} |j| d|j |jd||j qWdS)Nrrr!rrk)ranger.ripc_msgrrArBrr/rCrmsizergr) rr,rr9r!msgZmsg_strr;rjrr r r rDs  zipc_msg_queue_handler.dumpcCs|j||dd\}}|S)NT) skip_data)rs)rrr9rupl_lenr r r r2szipc_msg_queue_handler.skipFc Cstj|}g}d}xtd|dD]}|jd}t|dkr>Ptjd|\} tj} | j|j| t | j t } || | j 7}|r|j | t jq"|j| j } |j | | j d|jtj| |jtj| jdq"W||fS)NrZqnumrr!rzutf-8)rrvr-r.r/r0rrwr1rrxrgrGrRrSr4rrrT) rrr9rzr8rtr{r r:r;ryrjrr r r rss&     z$ipc_msg_queue_handler._read_messagesN)F)rrrr3rDr2rsr r r r rrs rrc@s$eZdZddZddZddZdS)ipc_shm_handlercCsFtj|}|d}|j|}t|t}|j||dtj|jdS)Nr;rzutf-8)rr-r sizeof_u32rGrrrT)rrr9r8r;rrjr r r r3s    zipc_shm_handler.loadcCsNtj|}|d}tj|}t|t}|j|d||jd||dS)Nr;rk)rrrrr}r)rr,rr9r8r;rrjr r r rDs    zipc_shm_handler.dumpcCs.tj|}|d}t|t}|j|tj|S)Nr;)rrr}rGrRrS)rrr9r8r;rjr r r r2s   zipc_shm_handler.skipN)rrrr3rDr2r r r r r|sr|)B INVENTORYZCOREZIDSZCREDSZUTSNSZTIMENSZPIDNSZIPC_VARZFSZ GHOST_FILEZMMZCGROUPZ TCP_STREAMSTATSZPAGEMAPZPSTREEZ REG_FILESZNS_FILESZ EVENTFD_FILEZEVENTPOLL_FILEZ EVENTPOLL_TFDZSIGNALFDZTIMERFDZ INOTIFY_FILEZ INOTIFY_WDZ FANOTIFY_FILEZ FANOTIFY_MARKZVMASZPIPESZFIFOZSIGACTZ NETLINK_SKZ REMAP_FPATHZMNTSZ TTY_FILESZTTY_INFOZTTY_DATAZRLIMITZTUNFILEZ EXT_FILES IRMAP_CACHEZ FILE_LOCKSZFDINFOZUNIXSKZINETSKZPACKETSKZITIMERSZ POSIX_TIMERSZNETDEVZ PIPES_DATAZ FIFO_DATAZ SK_QUEUESZ IPCNS_SHMZ IPCNS_SEMZ IPCNS_MSGZNETNSZUSERNSZSECCOMPZAUTOFSZFILESZCPUINFOZ MEMFD_FILEZ MEMFD_INODEZ BPFMAP_FILEZ BPFMAP_DATAZAPPARMORcCstjd|jd\}|tjdtjdfkr@tjd|jd\}ytj|}Wntk rjt|YnXy t|}Wn tk rtd|YnX||fS)Nr!r IMG_COMMON IMG_SERVICEz&No handler found for image with magic ) r/r0r-rby_nameZby_valrmrhandlers)rZ img_magicmhandlerr r r __rhandler1s  rFcCs.i}t|\}}||d<|j||||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. rr7)rr3)rr5r6Zimagerrr r r r3Es  r3cCs*i}t|\}}||d<|j||d<|S)NrrH)rrH)rresrrr r r infoUs  rcCstj|}t||S)z- Same as load(), but takes a string. )r<r=r3)r>r5rr r r r?`s r?c Cs|d}tj|d}|dkrX|d kr@|jtjdtjdn|jtjdtjd|jtjd|y t|}Wntk rtdYnX|j|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. rr~rrr!rrz*No handler found for image with such magicr7N)rr)rrrr/rCrrmrD)imgrrZ magic_valrr r r rDhs rDcCstjd}t|||jS)zK Same as dump(), but takes only an image and returns a string. )r<r=rDgetvalue)rrr r r rFs  rF)FF)F)fr<rr/rRrpr"rrrdirZ encodestringrZ decodestringrrfr}rgrrmrrrrrJrNrWrZr]rcrdrrr|Zinventory_entryZ core_entryZtask_kobj_ids_entryZ creds_entryZ utsns_entryZ timens_entryZ pidns_entryZ ipc_var_entryZfs_entryZmm_entryZ cgroup_entryZtcp_stream_entryZ stats_entryZ pstree_entryZreg_file_entryZ ns_file_entryZeventfd_file_entryZeventpoll_file_entryZeventpoll_tfd_entryZsignalfd_entryZ timerfd_entryZinotify_file_entryZinotify_wd_entryZfanotify_file_entryZfanotify_mark_entryZ vma_entryZ pipe_entryZ fifo_entryZsa_entryZnetlink_sk_entryZremap_file_path_entryZ mnt_entryZtty_file_entryZtty_info_entryZtty_data_entryZ rlimit_entryZ tunfile_entryZext_file_entryZirmap_cache_entryZfile_lock_entryZ fdinfo_entryZ unix_sk_entryZ inet_sk_entryZpacket_sock_entryZ itimer_entryZposix_timer_entryZnet_device_entryZpipe_data_entryZsk_packet_entryZ ipc_shm_entryZ ipc_sem_entryZ ipc_msg_entryZ netns_entryZ userns_entryZ seccomp_entryZ autofs_entryZ file_entryZ cpuinfo_entryZmemfd_file_entryZmemfd_inode_entryZbpfmap_file_entryZbpfmap_data_entryZapparmor_entryrrr3rr?rDrFr r r r (s    o0G"/