ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     3

i"                 @   s   d dl Z d dlZd dlZd dlZd dlZd dljZdZG dd dZ	G dd de	Z
G dd de	ZG d	d
 d
e	ZG dd deZG dd deZG dd deZG dd dZdS )    Nz./criu_service.socketc               @   s8   e Zd ZdZdZdZdZdZdZdZ	dd Z
dd	 ZdS )

_criu_commz/
    Base class for communication classes.
    r         Nc             C   s   dS )z
        Connect to criu and return socket object.
        daemon -- is for whether or not criu should daemonize if executing criu from binary(comm_bin).
        N )selfdaemonr   r   /usr/lib/python3.6/criu.pyconnect   s    z_criu_comm.connectc             C   s   dS )z'
        Disconnect from criu.
        Nr   )r   r   r   r   
disconnect   s    z_criu_comm.disconnect)__name__
__module____qualname____doc__COMM_SKCOMM_FDCOMM_BIN	comm_typecommskr	   r
   r   r   r   r   r      s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_criu_comm_skz.
    Communication class for unix socket.
    c             C   s   | j | _|| _d S )N)r   r   r   )r   Zsk_pathr   r   r   __init__+   s    z_criu_comm_sk.__init__c             C   sb   t j t jt j| _y| jj| j W n6 tk
r@   tdY n tk
rZ   tdY nX | jS )NzSocket file not found.zService not running.)socketAF_UNIXSOCK_SEQPACKETr   r	   r   FileNotFoundErrorConnectionRefusedError)r   r   r   r   r   r	   /   s    z_criu_comm_sk.connectc             C   s   | j j  d S )N)r   close)r   r   r   r   r
   <   s    z_criu_comm_sk.disconnectN)r   r   r   r   r   r	   r
   r   r   r   r   r   &   s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_criu_comm_fdz2
    Communication class for file descriptor.
    c             C   s   | j | _|| _d S )N)r   r   r   )r   fdr   r   r   r   E   s    z_criu_comm_fd.__init__c             C   s   t j| jt jt j| _| jS )N)r   Zfromfdr   r   r   r   )r   r   r   r   r   r	   I   s    
z_criu_comm_fd.connectc             C   s   | j j  d S )N)r   r   )r   r   r   r   r
   O   s    z_criu_comm_fd.disconnectN)r   r   r   r   r   r	   r
   r   r   r   r   r   @   s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_criu_comm_binz)
    Communication class for binary.
    c             C   s   | j | _|| _d | _d | _d S )N)r   r   r   swrkr   )r   Zbin_pathr   r   r   r   X   s    z_criu_comm_bin.__init__c                s  t jt jt j tj d tj}tj d tj|tjB  tj d tj}tj d tj|tj @  |_t	j
 }|dkrƇ fdd}|rt	j
 }|dkrt	j  |  qt	jd q|  n|rt	j|d  d j  tjd d jdd _ d _jS )Nr   r   c                  sh   t jd t jd t jd  d jtjdt j  t jjjdd d j  g t j	d d S )Nr   r   r   ir    z%d)
osr   sendstructpackgetpidexecvpr   fileno_exitr   )cssr   r   r   	exec_criul   s    


z)_criu_comm_bin.connect.<locals>.exec_criur!      )r   Z
socketpairr   r   fcntlZF_GETFDZF_SETFDZ
FD_CLOEXECr   r"   forksetsidr)   waitpidr   r$   unpackrecvr    r   )r   r   flagspr+   r   )r*   r   r   r	   ^   s,    
z_criu_comm_bin.connectc             C   s"   | j j  | jstj| jd d S )Nr   )r   r   r   r"   r0   r    )r   r   r   r   r
      s    
z_criu_comm_bin.disconnectN)r   r   r   r   r   r	   r
   r   r   r   r   r   S   s   0r   c               @   s    e Zd ZdZdZdZdd ZdS )CRIUExceptionz?
    Exception class for handling and storing criu errors.
    Nc             C   s   | j S )N)_str)r   r   r   r   __str__   s    zCRIUException.__str__)r   r   r   r   typr6   r7   r   r   r   r   r5      s   r5   c               @   s   e Zd ZdZdd ZdS )CRIUExceptionInternalzC
    Exception class for handling and storing internal errors.
    c             C   s"   || _ dtjj| j |f | _d S )Nz!%s failed with internal error: %s)r8   rpccriu_req_typeNamer6   )r   r8   sr   r   r   r      s    zCRIUExceptionInternal.__init__N)r   r   r   r   r   r   r   r   r   r9      s   r9   c               @   s    e Zd ZdZdd Zdd ZdS )CRIUExceptionExternalzC
    Exception class for handling and storing criu RPC errors.
    c             C   s    || _ || _|| _| j | _d S )N)r8   resp_typerrno_gen_error_strr6   )r   Zreq_typr?   r@   r   r   r   r      s    zCRIUExceptionExternal.__init__c             C   s   dt jj| jf }| j| jkr0|d| jf 7 }|d| jf 7 }| jtjkrV|d7 }nL| jt jkrx| jtjkrx|d7 }n*| jt j	kr| jtj
kr|d7 }n|d7 }|S )Nz%s failed: zUnexpected response type %d: zError(%d): zBad optionszNo process with such pidz)Process with requested pid already existsZUnknown)r:   r;   r<   r8   r?   r@   ZEBADRQCDUMPZESRCHRESTOREZEEXIST)r   r=   r   r   r   rA      s    


z$CRIUExceptionExternal._gen_error_strN)r   r   r   r   r   rA   r   r   r   r   r>      s   r>   c               @   st   e Zd ZdZdZdZdd ZefddZdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )criuz 
    Call criu through RPC.
    Nc             C   s"   | j d tjdd| _d | _d S )NrD   r   )Zimages_dir_fd)
use_binaryr:   Z	criu_optsoptsr   )r   r   r   r   r      s    
zcriu.__init__c             C   s   t || _dS )zZ
        Access criu using unix socket which that belongs to criu service daemon.
        N)r   _comm)r   Zsk_namer   r   r   use_sk   s    zcriu.use_skc             C   s   t || _dS )z0
        Access criu using provided fd.
        N)r   rH   )r   r   r   r   r   use_fd   s    zcriu.use_fdc             C   s   t || _dS )zO
        Access criu by execing it using provided path to criu binary.
        N)r   rH   )r   Zbin_namer   r   r   rF      s    zcriu.use_binaryc             C   s   d}|j tjkr"|jjd r"d}yx| js8| jj|}n| j}|jrJ|| _|j	|j
  |jt|jdtjtjB }|js| jj  tj }|j| W n2 tk
r } zt|j t|W Y dd}~X nX |S )zA
        As simple as send request and receive response.
        FpidTr   N)typer:   rB   rG   ZHasFieldr   rH   r	   	keep_openr#   ZSerializeToStringr2   lenr   Z	MSG_TRUNCZMSG_PEEKr
   Z	criu_respZParseFromString	Exceptionr9   str)r   reqr   r=   Zbufresper   r   r   _send_req_and_recv_resp   s$    
"zcriu._send_req_and_recv_respc             C   sD   t j }t j|_|jj| j | j|}|js@t|j|j|j	dS )zB
        Checks whether the kernel support is up-to-date.
        N)
r:   criu_reqZCHECKrL   rG   	MergeFromrT   successr>   cr_errno)r   rQ   rR   r   r   r   check  s    
z
criu.checkc             C   sF   t j }t j|_|jj| j | j|}|js@t|j|j|j	|j
S )zC
        Checkpoint a process/tree identified by opts.pid.
        )r:   rU   rB   rL   rG   rV   rT   rW   r>   rX   dump)r   rQ   rR   r   r   r   rZ     s    
z	criu.dumpc             C   sF   t j }t j|_|jj| j | j|}|js@t|j|j|j	|j
S )zC
        Checkpoint a process/tree identified by opts.pid.
        )r:   rU   ZPRE_DUMPrL   rG   rV   rT   rW   r>   rX   rZ   )r   rQ   rR   r   r   r   pre_dump+  s    
zcriu.pre_dumpc             C   sF   t j }t j|_|jj| j | j|}|js@t|j|j|j	|j
S )z)
        Restore a process/tree.
        )r:   rU   rC   rL   rG   rV   rT   rW   r>   rX   restore)r   rQ   rR   r   r   r   r\   :  s    
zcriu.restorec             C   sL   t j }t j|_|jj| j d|_| j|}|jsFt	|j|j|j
|jS )NT)r:   rU   ZPAGE_SERVER_CHLDrL   rG   rV   rM   rT   rW   r>   rX   Zps)r   rQ   rR   r   r   r   page_server_chldI  s    
zcriu.page_server_chldc             C   s>   t j }t j|_||_| j|}|js8t|j|j|j|j	S )N)
r:   rU   ZWAIT_PIDrL   rK   rT   rW   r>   rX   Zstatus)r   rK   rQ   rR   r   r   r   wait_pidV  s    
zcriu.wait_pid)r   r   r   r   rG   rH   r   CR_DEFAULT_SERVICE_ADDRESSrI   rJ   rF   rT   rY   rZ   r[   r\   r]   r^   r   r   r   r   rD      s   #rD   )r   r@   r-   r"   r$   Zpycriu.rpc_pb2Zrpc_pb2r:   r_   r   r   r   r   rO   r5   r9   r>   rD   r   r   r   r   <module>   s   
A"