<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3

i5M              C   @   s  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krhej
e_eje_dZdZd	Zd
d ZG dd deZdd Zdd ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG d d! d!ZG d"d# d#ZG d$d% d%Zeej eej!eej"eej#eej$eej%eej&eej'eej(e eej)eej*eej+e eej,e eej-eej.eej/eej0eej1eej2eej3eej4eej5eej6eej7eej8eej9eej:eej;eej<eej=eej>eej?eej@eejAeejBeejCeejDeejEeejFeejGeejHeejIeejJeejKeejLeejMeejNeejOe eejOe eejPe eejQe eejRe eejSe 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j]e eej^d&BZ_d'd( Z`d4d*d+Zad,d- Zbd5d.d/Zcd0d1 Zdd2d3 ZedS )6    N   )magic)pb)pb2dictencodebytes         c             C   s   | d |d B d S )Nr    )xyr
   r
   /usr/lib/python3.6/images.pyround_up>   s    r   c               @   s   e Zd Zdd ZdS )MagicExceptionc             C   s
   || _ d S )N)r   )selfr   r
   r
   r   __init__C   s    zMagicException.__init__N)__name__
__module____qualname__r   r
   r
   r
   r   r   B   s   r   c             C   s   t jtj| S )z(A helper function to decode base64 data.)base64decodebytesstrencode)datar
   r
   r   decode_base64_dataG   s    r   c             C   s   | j tjtj| dS )z9A helper function to write base64 encoded data to a file.N)writer   r   r   r   )fr   r
   r
   r   write_base64_dataL   s    r   c               @   sF   e Zd ZdZdddZdddZddd	Zd
d Zdd Zdd Z	dS )entry_handlerzp
    Generic class to handle loading/dumping criu images
    entries from/to bin format to/from dict(json).
    Nc             C   s   || _ || _dS )z=
        Sets payload class and extra handler class.
        N)payloadextra_handler)r   r   r    r
   r
   r   r   Y   s    zentry_handler.__init__Fc             C   s   g }xi }| j  }|jd}t|dkr*P tjd|\}|j|j| tj||}| jr|rdd }	| jj||}
d|	|
 |d< n| jj	|||d< |j
| qW |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.
        r   r   ic             S   sJ   x@dD ]8}| d	k r6t | | kr*d
| |f S d| |f S | d	 } qW d|  S )N KMGTPEZg      @z%d%sBz%.1f%sBz%.1fYB)r"   r#   r$   r%   r&   r'   r(   r)   )int)ZnumZunitr
   r
   r   human_readablex   s    
z*entry_handler.load.<locals>.human_readablez... <%s>extra)r   readlenstructunpackParseFromStringr   r    skiploadappend)r   r   pretty
no_payloadentriesentrypbuffbufsizer+   Zpl_sizer
   r
   r   r3   `   s$    

zentry_handler.loadc             C   s   t j|}| j||S )zD
        Same as load(), but takes a string as an argument.
        )ioBytesIOr3   )r   sr5   r   r
   r
   r   loads   s    
zentry_handler.loadsc             C   sx   xr|D ]j}|j dd}| j }tj|| |j }t|}|jtjd| |j| | j	r|r| j	j
||| qW 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.
        r,   Nr!   )popr   r   dict2pbSerializeToStringr.   r   r/   packr    dump)r   r7   r   r8   r,   r9   pb_strr;   r
   r
   r   rD      s    


zentry_handler.dumpc             C   s   t jd}| j|| |j S )zf
        Same as dump(), but doesn't take file-like object and just
        returns a string.
        r"   )r<   r=   rD   r-   )r   r7   r   r
   r
   r   dumps   s    
zentry_handler.dumpsc             C   sH   d}x>|j d}t|dkrP tjd|\}|j|d |d7 }qW |S )zI
        Counts the number of top-level object in the image file
        r   r   r!   r   )r-   r.   r/   r0   seek)r   r   r7   r:   r;   r
   r
   r   count   s    
zentry_handler.count)N)FF)F)
r   r   r   __doc__r   r3   r?   rD   rF   rH   r
   r
   r
   r   r   S   s   

+
	r   c               @   s<   e Zd ZdZdddZdddZdd Zd	d
 Zd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             C   sf   g }t j }xT|jd}t|dkr&P tjd|\}|j|j| |jtj|| t j	 }qW |S )Nr   r   r!   )
r   pagemap_headr-   r.   r/   r0   r1   r4   r   pagemap_entry)r   r   r5   r6   r7   r9   r:   r;   r
   r
   r   r3      s    
zpagemap_handler.loadc             C   s   t j|}| j||S )N)r<   r=   r3   )r   r>   r5   r   r
   r
   r   r?      s    
zpagemap_handler.loadsc             C   sZ   t j }xL|D ]D}tj|| |j }t|}|jtjd| |j| t j	 }qW d S )Nr!   )
r   rK   r   rA   rB   r.   r   r/   rC   rL   )r   r7   r   r9   itemrE   r;   r
   r
   r   rD      s    

zpagemap_handler.dumpc             C   s   t jd}| j|| |j S )Nr"   )r<   r=   rD   r-   )r   r7   r   r
   r
   r   rF      s    
zpagemap_handler.dumpsc             C   s   t d j|d S )Nr   )r   rH   )r   r   r
   r
   r   rH      s    zpagemap_handler.countN)FF)F)	r   r   r   rI   r3   r?   rD   rF   rH   r
   r
   r
   r   rJ      s   

rJ   c               @   s0   e Zd ZdddZdddZdd Zdd	 Zd
S )ghost_file_handlerFc             C   s  g }t j }|jd}tjd|\}|j|j| tj||}|jr|j| xt j	 }	|jd}t
|dkrrP tjd|\}|	j|j| tj|	|}
|r|j|	j
tj ntj|j|	j
jd|
d< |j|
 qRW n6|r|jdtj ntj|j jd|d< |j| |S )Nr   r!   r   zutf-8r,   )r   ghost_file_entryr-   r/   r0   r1   r   chunksr4   ghost_chunk_entryr.   rG   osSEEK_CURr   r   decodeSEEK_END)r   r   r5   r6   r7   Zgfr:   r;   Zg_entrygcr8   r
   r
   r   r3      s2    



zghost_file_handler.loadc             C   s   t j|}| j||S )N)r<   r=   r3   )r   r>   r5   r   r
   r
   r   r?     s    
zghost_file_handler.loadsc             C   s   t j }|jd}tj|| |j }t|}|jtj	d| |j| |j
rxj|D ]R}t j }tj|| |j }t|}|jtj	d| |j| t||d  qVW nt||d  d S )Nr   r!   r,   )r   rO   r@   r   rA   rB   r.   r   r/   rC   rP   rQ   r   )r   r7   r   r9   rM   rE   r;   r
   r
   r   rD     s"    



zghost_file_handler.dumpc             C   s   t jd}| j|| |j S )Nr"   )r<   r=   rD   r-   )r   r7   r   r
   r
   r   rF   -  s    
zghost_file_handler.dumpsN)FF)F)r   r   r   r3   r?   rD   rF   r
   r
   r
   r   rN      s   
!
rN   c               @   s$   e Zd Zdd Zdd Zdd ZdS )pipes_data_extra_handlerc             C   s    |j }|j|}tj|jdS )Nzutf-8)bytesr-   r   r   rT   )r   r   ploadr;   r   r
   r
   r   r3   :  s    
zpipes_data_extra_handler.loadc             C   s   t |}|j| d S )N)r   r   )r   r,   r   rY   r   r
   r
   r   rD   ?  s    zpipes_data_extra_handler.dumpc             C   s   |j |jtj |jS )N)rG   rX   rR   rS   )r   r   rY   r
   r
   r   r2   C  s    zpipes_data_extra_handler.skipN)r   r   r   r3   rD   r2   r
   r
   r
   r   rW   9  s   rW   c               @   s$   e Zd Zdd Zdd Zdd ZdS )sk_queues_extra_handlerc             C   s    |j }|j|}tj|jdS )Nzutf-8)lengthr-   r   r   rT   )r   r   rY   r;   r   r
   r
   r   r3   I  s    
zsk_queues_extra_handler.loadc             C   s   t |}|j| d S )N)r   r   )r   r,   r   _unusedr   r
   r
   r   rD   N  s    zsk_queues_extra_handler.dumpc             C   s   |j |jtj |jS )N)rG   r[   rR   rS   )r   r   rY   r
   r
   r   r2   R  s    zsk_queues_extra_handler.skipN)r   r   r   r3   rD   r2   r
   r
   r
   r   rZ   H  s   rZ   c               @   s$   e Zd Zdd Zdd Zdd ZdS )tcp_stream_extra_handlerc             C   sH   i }|j |j}|j |j}tj|jd|d< tj|jd|d< |S )Nzutf-8inqoutq)r-   inq_lenoutq_lenr   r   rT   )r   r   r9   dr^   r_   r
   r
   r   r3   X  s    ztcp_stream_extra_handler.loadc             C   s0   t |d }t |d }|j| |j| d S )Nr^   r_   )r   r   )r   r,   r   r\   r^   r_   r
   r
   r   rD   c  s    
ztcp_stream_extra_handler.dumpc             C   s   |j dtj |j|j S )Nr   )rG   rR   rU   r`   ra   )r   r   r9   r
   r
   r   r2   j  s    ztcp_stream_extra_handler.skipN)r   r   r   r3   rD   r2   r
   r
   r
   r   r]   W  s   r]   c               @   s$   e Zd Zdd Zdd Zdd ZdS )bpfmap_data_extra_handlerc             C   s&   |j |j }|j|}tj|jdS )Nzutf-8)Z
keys_bytesZvalues_bytesr-   r   r   rT   )r   r   rY   r;   r   r
   r
   r   r3   p  s    
zbpfmap_data_extra_handler.loadc             C   s   t j|}|j| d S )N)r   r   r   )r   r,   r   rY   r   r
   r
   r   rD   u  s    
zbpfmap_data_extra_handler.dumpc             C   s   |j |jtj |jS )N)rG   rX   rR   rS   )r   r   rY   r
   r
   r   r2   y  s    zbpfmap_data_extra_handler.skipN)r   r   r   r3   rD   r2   r
   r
   r
   r   rc   o  s   rc   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ipc_sem_set_handlerc             C   sP   t j |}t|d  }t|t}| j }|j|j| |j|| d |j S )Nnsemsr   )	r   
sizeof_u16r   
sizeof_u64_get_sem_arrayZ	frombytesr-   rG   tolist)r   r   r9   r8   r;   roundedr>   r
   r
   r   r3     s    

zipc_sem_set_handler.loadc             C   sn   t j |}t|d  }t|t}| j }|j| t||d krJtd|j|j	  |jd||   d S )Nre   zNumber of semaphores mismatch    )
r   rf   r   rg   rh   fromlistr.   	Exceptionr   tobytes)r   r,   r   r9   r8   r;   rj   r>   r
   r
   r   rD     s    


zipc_sem_set_handler.dumpc             C   s.   t j |}t|d  }|jt|ttj |S )Nre   )r   rf   rG   r   rg   rR   rS   )r   r   r9   r8   r;   r
   r
   r   r2     s    
zipc_sem_set_handler.skipc             C   s    t j d}|jtkrtd|S )NHzArray size mismatch)arrayitemsizerf   rm   )r   r>   r
   r
   r   rh     s    

z"ipc_sem_set_handler._get_sem_arrayN)r   r   r   r3   rD   r2   rh   r
   r
   r
   r   rd   ~  s   	rd   c               @   s.   e Zd Zdd Zdd Zdd Zddd	Zd
S )ipc_msg_queue_handlerc             C   s   | j ||\}}|S )N)_read_messages)r   r   r9   messages_r
   r
   r   r3     s    zipc_msg_queue_handler.loadc       
      C   s   xt dt|dD ]}tj }tj|| | |j }t|}|jtj	d| |j| t
|jt}t||d  }	|j|	d |j  |jd||j   qW d S )Nr   r   r!   r   rk   )ranger.   r   ipc_msgr   rA   rB   r   r/   rC   r   msizerg   r   )
r   r,   r   r9   r!   msgZmsg_strr;   rj   r   r
   r
   r   rD     s    
zipc_msg_queue_handler.dumpc             C   s   | j ||dd\}}|S )NT)	skip_data)rs   )r   r   r9   ru   pl_lenr
   r
   r   r2     s    zipc_msg_queue_handler.skipFc             C   s   t j |}g }d}xtd|d D ]}|jd}t|dkr>P tjd|\}	tj }
|
j|j|	 t	|
j
t}||	|
j
 7 }|r|j|tj q"|j|
j
}|j||
j
 d |jt j |
 |jtj|jd q"W ||fS )Nr   Zqnumr   r!   r   zutf-8)r   rv   r-   r.   r/   r0   r   rw   r1   r   rx   rg   rG   rR   rS   r4   r   r   rT   )r   r   r9   rz   r8   rt   r{   r   r:   r;   ry   rj   r   r
   r
   r   rs     s&    

z$ipc_msg_queue_handler._read_messagesN)F)r   r   r   r3   rD   r2   rs   r
   r
   r
   r   rr     s   rr   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ipc_shm_handlerc             C   sF   t j |}|d }|j|}t|t}|j|| d tj|jdS )Nr;   r   zutf-8)r   r-   r   
sizeof_u32rG   r   r   rT   )r   r   r9   r8   r;   r   rj   r
   r
   r   r3     s    


zipc_shm_handler.loadc             C   sN   t j |}|d }tj|}t|t}|j|d |  |jd||   d S )Nr;   rk   )r   r   r   r   r}   r   )r   r,   r   r9   r8   r;   r   rj   r
   r
   r   rD     s    


zipc_shm_handler.dumpc             C   s.   t j |}|d }t|t}|j|tj |S )Nr;   )r   r   r}   rG   rR   rS   )r   r   r9   r8   r;   rj   r
   r
   r   r2     s
    

zipc_shm_handler.skipN)r   r   r   r3   rD   r2   r
   r
   r
   r   r|     s   r|   )B	INVENTORYZCOREZIDSZCREDSZUTSNSZTIMENSZPIDNSZIPC_VARZFSZ
GHOST_FILEZMMZCGROUPZ
TCP_STREAMSTATSZPAGEMAPZPSTREEZ	REG_FILESZNS_FILESZEVENTFD_FILEZEVENTPOLL_FILEZEVENTPOLL_TFDZSIGNALFDZTIMERFDZINOTIFY_FILEZ
INOTIFY_WDZFANOTIFY_FILEZFANOTIFY_MARKZVMASZPIPESZFIFOZSIGACTZ
NETLINK_SKZREMAP_FPATHZMNTSZ	TTY_FILESZTTY_INFOZTTY_DATAZRLIMITZTUNFILEZ	EXT_FILESIRMAP_CACHEZ
FILE_LOCKSZFDINFOZUNIXSKZINETSKZPACKETSKZITIMERSZPOSIX_TIMERSZNETDEVZ
PIPES_DATAZ	FIFO_DATAZ	SK_QUEUESZ	IPCNS_SHMZ	IPCNS_SEMZ	IPCNS_MSGZNETNSZUSERNSZSECCOMPZAUTOFSZFILESZCPUINFOZ
MEMFD_FILEZMEMFD_INODEZBPFMAP_FILEZBPFMAP_DATAZAPPARMORc             C   s   t jd| jd\}|tjd tjd fkr@t jd| jd\}ytj| }W n tk
rj   t|Y nX yt| }W n  tk
r   td| Y nX ||fS )Nr!   r   
IMG_COMMONIMG_SERVICEz&No handler found for image with magic )	r/   r0   r-   r   by_nameZby_valrm   r   handlers)r   Z	img_magicmhandlerr
   r
   r   
__rhandler1  s    
r   Fc             C   s.   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.
    r   r7   )r   r3   )r   r5   r6   Zimager   r   r
   r
   r   r3   E  s
    r3   c             C   s*   i }t | \}}||d< |j| |d< |S )Nr   rH   )r   rH   )r   resr   r   r
   r
   r   infoU  s
    r   c             C   s   t j| }t||S )z-
    Same as load(), but takes a string.
    )r<   r=   r3   )r>   r5   r   r
   r
   r   r?   `  s    
r?   c             C   s   | d }t j| d  }|dkrX|dkr@|jtjdt jd  n|jtjdt jd  |jtjd| yt| }W n tk
r   tdY nX |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.
    r   r~   r   r   r!   r   r   z*No handler found for image with such magicr7   N)r   r   )r   r   r   r/   rC   r   rm   rD   )imgr   r   Z	magic_valr   r
   r
   r   rD   h  s    rD   c             C   s   t jd}t| | |j S )zK
    Same as dump(), but takes only an image and returns
    a string.
        )r<   r=   rD   getvalue)r   r   r
   r
   r   rF     s    

rF   )FF)F)fr<   r   r/   rR   rp   r"   r   r   r   dirZencodestringr   Zdecodestringr   rf   r}   rg   r   rm   r   r   r   r   rJ   rN   rW   rZ   r]   rc   rd   rr   r|   Zinventory_entryZ
core_entryZtask_kobj_ids_entryZcreds_entryZutsns_entryZtimens_entryZpidns_entryZipc_var_entryZfs_entryZmm_entryZcgroup_entryZtcp_stream_entryZstats_entryZpstree_entryZreg_file_entryZns_file_entryZeventfd_file_entryZeventpoll_file_entryZeventpoll_tfd_entryZsignalfd_entryZtimerfd_entryZinotify_file_entryZinotify_wd_entryZfanotify_file_entryZfanotify_mark_entryZ	vma_entryZ
pipe_entryZ
fifo_entryZsa_entryZnetlink_sk_entryZremap_file_path_entryZ	mnt_entryZtty_file_entryZtty_info_entryZtty_data_entryZrlimit_entryZtunfile_entryZext_file_entryZirmap_cache_entryZfile_lock_entryZfdinfo_entryZunix_sk_entryZinet_sk_entryZpacket_sock_entryZitimer_entryZposix_timer_entryZnet_device_entryZpipe_data_entryZsk_packet_entryZipc_shm_entryZipc_sem_entryZipc_msg_entryZnetns_entryZuserns_entryZseccomp_entryZautofs_entryZ
file_entryZcpuinfo_entryZmemfd_file_entryZmemfd_inode_entryZbpfmap_file_entryZbpfmap_data_entryZapparmor_entryr   r   r3   r   r?   rD   rF   r
   r
   r
   r   <module>(   s   o0G"/

