3  i5MãC@sŽddlZddlZddlZddlZddlZddlmZddlmZddlmZde eƒkrhej e_ ej e_ dZdZd Zd d „ZGd d „d eƒZdd„Zdd„ZGdd„dƒZGdd„dƒZGdd„dƒZGdd„dƒZGdd„dƒZGdd„dƒZGdd„dƒZGd d!„d!ƒZGd"d#„d#ƒZGd$d%„d%ƒZeej ƒeej!ƒeej"ƒeej#ƒeej$ƒeej%ƒeej&ƒeej'ƒeej(ƒeƒeej)ƒeej*ƒeej+eƒƒeej,ƒeƒeej-ƒeej.ƒeej/ƒeej0ƒeej1ƒeej2ƒeej3ƒeej4ƒeej5ƒeej6ƒeej7ƒeej8ƒeej9ƒeej:ƒeej;ƒeej<ƒeej=ƒeej>ƒeej?ƒeej@ƒeejAƒeejBƒeejCƒeejDƒeejEƒeejFƒeejGƒeejHƒeejIƒeejJƒeejKƒeejLƒeejMƒeejNƒeejOeƒƒeejOeƒƒeejPeƒƒeejQeƒƒeejReƒƒeejSeƒƒeejTƒeejUƒeejVƒeejWƒeejXƒeejYƒeejZƒeej[ƒeej\ƒeej]eƒƒeej^ƒd&œBZ_d'd(„Z`d4d*d+„Zad,d-„Zbd5d.d/„Zcd0d1„Zdd2d3„ZedS)6éNé)Úmagic)Úpb)Úpb2dictÚ encodebytesééécCs|d|dBdS)Nr©)ÚxÚyr r ú/usr/lib/python3.6/images.pyÚround_up>src@seZdZdd„ZdS)Ú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Ú decodebytesÚstrÚencode)Ú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@sFeZdZdZddd„Zddd„Zddd „Zd d „Zd d „Zdd„Z 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 Csªg}x i}|jƒ}|jdƒ}t|ƒdkr*Ptjd|ƒ\}|j|j|ƒƒtj||ƒ}|jr˜|r†dd„} |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. rrÚicSsJx@d D]8}|d kr6t|ƒ|kr*d ||fSd ||fS|d }qWd |S)NÚÚKÚMÚGÚTÚPÚEÚZg�@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) rÚreadÚlenÚstructÚunpackÚParseFromStringrr ÚskipÚloadÚappend) rrÚprettyÚ no_payloadÚentriesÚentryÚpbuffÚbufÚsizer+Zpl_sizer r r r3`s$    zentry_handler.loadcCstj|ƒ}|j||ƒS)zD Same as load(), but takes a string as an argument. )ÚioÚBytesIOr3)rÚsr5rr r r Úloads‹s 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!) ÚpoprrÚdict2pbÚSerializeToStringr.rr/Úpackr Údump)rr7rr8r,r9Úpb_strr;r r r rD’s     zentry_handler.dumpcCstjdƒ}|j||ƒ|jƒS)zf Same as dump(), but doesn't take file-like object and just returns a string. r")r<r=rDr-)rr7rr r r Údumps§s  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/r0Úseek)rrr7r:r;r r r Úcount°s    zentry_handler.count)N)FF)F) rrrÚ__doc__rr3r?rDrFrHr r r r rSs  +  rc@s<eZdZdZddd„Zddd„Zdd„Zd 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 r3És   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)rr7rr9ÚitemrEr;r r r rDÝs   zpagemap_handler.dumpcCstjdƒ}|j||ƒ|jƒS)Nr")r<r=rDr-)rr7rr r r rFès  zpagemap_handler.dumpscCstdƒj|ƒdS)Nr)rrH)rrr r r rHíszpagemap_handler.countN)FF)F) rrrrIr3r?rDrFrHr r r r rJÂs    rJc@s0eZdZd dd„Zd dd„Zdd„Zdd „Zd S) Úghost_file_handlerFc Csg}tjƒ}|jdƒ}tjd|ƒ\}|j|j|ƒƒtj||ƒ}|jrÞ|j|ƒxÂtj ƒ} |jdƒ}t |ƒdkrrPtjd|ƒ\}| j|j|ƒƒtj| |ƒ} |r²|j | j t j ƒntj|j| j ƒƒjdƒ| d<|j| ƒqRWn6|rò|j dt jƒntj|jƒƒjdƒ|d<|j|ƒ|S)Nrr!rzutf-8r,)rÚghost_file_entryr-r/r0r1rÚchunksr4Úghost_chunk_entryr.rGÚosÚSEEK_CURrrÚdecodeÚSEEK_END) rrr5r6r7Zgfr:r;Zg_entryÚgcr8r r r r3ós2       zghost_file_handler.loadcCstj|ƒ}|j||ƒS)N)r<r=r3)rr>r5rr r r r?s zghost_file_handler.loadscCsÀtjƒ}|jdƒ}tj||ƒ|jƒ}t|ƒ}|jtj d|ƒƒ|j|ƒ|j r®xj|D]R}tj ƒ}tj||ƒ|jƒ}t|ƒ}|jtj d|ƒƒ|j|ƒt ||dƒqVWnt ||dƒdS)Nrr!r,) rrOr@rrArBr.rr/rCrPrQr)rr7rr9rMrEr;r r r rDs"      zghost_file_handler.dumpcCstjdƒ}|j||ƒ|jƒS)Nr")r<r=rDr-)rr7rr r r rF-s  zghost_file_handler.dumpsN)FF)F)rrrr3r?rDrFr r r r rNòs ! rNc@s$eZdZdd„Zdd„Zdd„ZdS)Úpipes_data_extra_handlercCs |j}|j|ƒ}tj|ƒjdƒS)Nzutf-8)Úbytesr-rrrT)rrÚploadr;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$eZdZdd„Zdd„Zdd„ZdS)Úsk_queues_extra_handlercCs |j}|j|ƒ}tj|ƒjdƒS)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$eZdZdd„Zdd„Zdd„ZdS)Útcp_stream_extra_handlercCsHi}|j|jƒ}|j|jƒ}tj|ƒjdƒ|d<tj|ƒjdƒ|d<|S)Nzutf-8ÚinqÚoutq)r-Úinq_lenÚoutq_lenrrrT)rrr9Údr^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$eZdZdd„Zdd„Zdd„ZdS)Úbpfmap_data_extra_handlercCs&|j|j}|j|ƒ}tj|ƒjdƒS)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,eZdZdd„Zdd„Zdd„Zdd„Zd S) Úipc_sem_set_handlercCsPtj|ƒ}t|d}t|tƒ}|jƒ}|j|j|ƒƒ|j||dƒ|jƒS)NÚnsemsr) rÚ sizeof_u16rÚ sizeof_u64Ú_get_sem_arrayZ frombytesr-rGÚtolist)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ó) rrfrrgrhÚfromlistr.Ú ExceptionrÚtobytes)rr,rr9r8r;rjr>r r r rDˆs    zipc_sem_set_handler.dumpcCs.tj|ƒ}t|d}|jt|tƒtjƒ|S)Nre)rrfrGrrgrRrS)rrr9r8r;r r r r2“s  zipc_sem_set_handler.skipcCs tjdƒ}|jtkrtdƒ‚|S)NÚHzArray size mismatch)ÚarrayÚitemsizerfrm)rr>r r r rh™s  z"ipc_sem_set_handler._get_sem_arrayN)rrrr3rDr2rhr r r r rd~s  rdc@s.eZdZdd„Zdd„Zdd„Zd dd „Zd S) Úipc_msg_queue_handlercCs|j||ƒ\}}|S)N)Ú_read_messages)rrr9ÚmessagesÚ_r r r r3¡szipc_msg_queue_handler.loadc Cs¦x tdt|ƒdƒD]Œ}tjƒ}tj|||ƒ|jƒ}t|ƒ}|jtj d|ƒƒ|j|ƒt |j t ƒ}t ||dƒ} |j| d|j …ƒ|jd||j ƒqWdS)Nrrr!rrk)Úranger.rÚipc_msgrrArBrr/rCrÚmsizergr) rr,rr9r!ÚmsgZmsg_strr;rjrr r r rD¥s  zipc_msg_queue_handler.dumpcCs|j||dd�\}}|S)NT)Ú skip_data)rs)rrr9ruÚpl_lenr r r r2²szipc_msg_queue_handler.skipFc Csâtj|ƒ}g}d}xÆtd|dƒD]´}|jdƒ}t|ƒdkr>Ptjd|ƒ\} tjƒ} | j|j| ƒƒt | j t ƒ} || | j 7}|r’|j | t jƒq"|j| j ƒ} |j | | j dƒ|jtj| ƒƒ|jtj| ƒjdƒƒq"W||fS)NrZqnumrr!rzutf-8)rrvr-r.r/r0rrwr1rrxrgrGrRrSr4rrrT) rrr9rzr8rtr{r r:r;ryrjrr r r rs¶s&     z$ipc_msg_queue_handler._read_messagesN)F)rrrr3rDr2rsr r r r rr s rrc@s$eZdZdd„Zdd„Zdd„ZdS)Úipc_shm_handlercCsFtj|ƒ}|d}|j|ƒ}t|tƒ}|j||dƒtj|ƒjdƒS)Nr;rzutf-8)rr-rÚ sizeof_u32rGrrrT)rrr9r8r;rrjr r r r3Ðs    zipc_shm_handler.loadcCsNtj|ƒ}|d}tj|ƒ}t|tƒ}|j|d|…ƒ|jd||ƒdS)Nr;rk)rrrrr}r)rr,rr9r8r;rrjr r r rDØs    zipc_shm_handler.dumpcCs.tj|ƒ}|d}t|tƒ}|j|tjƒ|S)Nr;)rrr}rGrRrS)rrr9r8r;rjr r r r2às   zipc_shm_handler.skipN)rrrr3rDr2r r r r r|Ïsr|)BÚ INVENTORYZCOREZIDSZCREDSZUTSNSZTIMENSZPIDNSZIPC_VARZFSZ GHOST_FILEZMMZCGROUPZ TCP_STREAMÚSTATSZPAGEMAPZPSTREEZ 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_DATAZAPPARMORcCs¢tjd|jdƒƒ\}|tjdtjdfkr@tjd|jdƒƒ\}ytj|}Wntk rjt|ƒ‚YnXy t|}Wn tk r˜td|ƒ‚YnX||fS)Nr!rÚ IMG_COMMONÚ IMG_SERVICEz&No handler found for image with magic ) r/r0r-rÚby_nameZby_valrmrÚhandlers)rZ img_magicÚmÚhandlerr r r Ú __rhandler1s  r‡FcCs.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)r‡r3)rr5r6Zimager…r†r r r r3Es  r3cCs*i}t|ƒ\}}||d<|j|ƒ|d<|S)NrrH)r‡rH)rÚresr…r†r r r ÚinfoUs  r‰cCstj|ƒ}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@|jtjdtjdƒƒn|jtjdtjdƒƒ|jtjd|ƒƒy t|}Wntk r’tdƒ‚YnX|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~rr€r!r‚r�z*No handler found for image with such magicr7N)rr€)rrƒrr/rCr„rmrD)Úimgrr…Z magic_valr†r r r rDhs rDcCstjdƒ}t||ƒ|jƒS)zK Same as dump(), but takes only an image and returns a string. ó)r<r=rDÚgetvalue)rŠrr r r rFƒs  rF)FF)F)fr<rr/rRrpr"rrrÚdirZ 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_entryr„r‡r3r‰r?rDrFr r r r Ú(sÌ    o0G"/