
    b!                        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  G d d          Z G d de          Z	 G d de          Z
 G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d d          ZdS )    Nc                   6    e Zd ZdZdZdZdZdZdZdZ	d Z
d ZdS )
_criu_commz/
    Base class for communication classes.
    r         Nc                     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daemons     -/usr/lib/python3/dist-packages/pycriu/criu.pyconnectz_criu_comm.connect   s	    
 	    c                     dS )z'
        Disconnect from criu.
        Nr   r
   s    r   
disconnectz_criu_comm.disconnect   s	     	r   )__name__
__module____qualname____doc__COMM_SKCOMM_FDCOMM_BIN	comm_typecommskr   r   r   r   r   r   r      s\          GGHID	B      r   r   c                   $    e Zd ZdZd Zd Zd ZdS )_criu_comm_skz.
    Communication class for unix socket.
    c                 ,    | j         | _        || _        d S N)r   r   r   )r
   sk_paths     r   __init__z_criu_comm_sk.__init__*   s    			r   c                     t          j         t           j        t           j                  | _        | j                            | j                   | j        S r   )socketAF_UNIXSOCK_SEQPACKETr   r   r   r	   s     r   r   z_criu_comm_sk.connect.   s7    -0EFF	"""wr   c                 8    | j                                          d S r   r   closer   s    r   r   z_criu_comm_sk.disconnect4       r   Nr   r   r   r   r!   r   r   r   r   r   r   r   %   sK                 r   r   c                   $    e Zd ZdZd Zd Zd ZdS )_criu_comm_fdz2
    Communication class for file descriptor.
    c                 ,    | j         | _        || _        d S r   )r   r   r   r
   fds     r   r!   z_criu_comm_fd.__init__=   s    			r   c                 x    t          j        | j        t           j        t           j                  | _        | j        S r   )r#   fromfdr   r$   r%   r   r	   s     r   r   z_criu_comm_fd.connectA   s,    -	6> & 57 7 wr   c                 8    | j                                          d S r   r'   r   s    r   r   z_criu_comm_fd.disconnectG   r)   r   Nr*   r   r   r   r,   r,   8   sK                 r   r,   c                   $    e Zd ZdZd Zd Zd ZdS )_criu_comm_binz)
    Communication class for binary.
    c                 H    | j         | _        || _        d | _        d | _        d S r   )r   r   r   swrkr   )r
   bin_paths     r   r!   z_criu_comm_bin.__init__P   s$    		r   c                     t          j        t           j        t           j                  t	          j        d         t          j                  }t	          j        d         t          j        |t          j        z             t	          j        d         t          j                  }t	          j        d         t          j        |t          j         z             | _        t          j
                    }|dk    r_ fd}|rLt          j
                    }|dk    rt          j                      |             n7t          j        d           n" |             n|rt          j        |d           d                                          t          j        dd                             d                    d          _        d          _         j        S )Nr   r   c                     t          j        d           t          j        d           t          j        d            d                             t          j        dt          j                                         t          j        j        j        dd d                                         z  g           t          j	        d           d S )Nr   r   r   ir6   z%d)
osr(   sendstructpackgetpidexecvr   fileno_exit)cssr
   s   r   	exec_criuz)_criu_comm_bin.connect.<locals>.exec_criud   s    AFKRY[[99:::)VQ023 3 3 r   r:      )r#   
socketpairr$   r%   fcntlF_GETFDF_SETFD
FD_CLOEXECr   r;   forksetsidrB   waitpidr(   r=   unpackrecvr6   r   )r
   r   flagsprD   rC   s   `    @r   r   z_criu_comm_bin.connectV   s   0EFFCFEM22CFEM553C+CDDDCFEM22CFEM5E4D3D+DEEEGII66	 	 	 	 	 	   GII66IKKKIKKKKHQKKKK	 !
1a   AM#s1v{{1~~66q9	a&wr   c                 ~    | j                                          | j        st          j        | j        d           d S d S )Nr   )r   r(   r   r;   rM   r6   r   s    r   r   z_criu_comm_bin.disconnect   s?    { 	%Jty!$$$$$	% 	%r   Nr*   r   r   r   r4   r4   K   sL           . . .`% % % % %r   r4   c                        e Zd ZdZdZdZd ZdS )CRIUExceptionz?
    Exception class for handling and storing criu errors.
    Nc                     | j         S r   )_strr   s    r   __str__zCRIUException.__str__   s
    yr   )r   r   r   r   typrV   rW   r   r   r   rT   rT      s9          CD    r   rT   c                       e Zd ZdZd ZdS )CRIUExceptionInternalzC
    Exception class for handling and storing internal errors.
    c                 p    || _         t          j                            | j                   d|| _        d S )Nz failed with internal error: )rX   rpccriu_req_typeNamerV   )r
   rX   ss      r   r!   zCRIUExceptionInternal.__init__   s6    ""48,,,,aa1			r   N)r   r   r   r   r!   r   r   r   rZ   rZ      s-         1 1 1 1 1r   rZ   c                       e Zd ZdZd Zd ZdS )CRIUExceptionExternalzC
    Exception class for handling and storing criu RPC errors.
    c                 b    || _         || _        || _        |                                 | _        d S r   )rX   resp_typerrno_gen_error_strrV   )r
   req_typrc   rd   s       r   r!   zCRIUExceptionExternal.__init__   s.     
''))			r   c                    t           j                            | j                  d}| j        | j        k    r|d| j        fz  z  }|d| j        fz  z  }| j        t
          j        k    r|dz  }| j        t           j        k    r| j        t
          j        k    r|dz  }| j        t           j	        k    r| j        t
          j
        k    r|dz  }|dz  }|S )Nz	 failed: zUnexpected response type %d: zError(%d): zBad optionszNo process with such pidz)Process with requested pid already existsUnknown)r\   r]   r^   rX   rc   rd   EBADRQCDUMPESRCHRESTOREEEXIST)r
   r_   s     r   re   z$CRIUExceptionExternal._gen_error_str   s     .33DH====@8t}$$0DM3DDDA	]dj^++:&&A8sxzU[((//8s{""zU\))@@	Yr   N)r   r   r   r   r!   re   r   r   r   ra   ra      s<         * * *    r   ra   c                   \    e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd ZdS )criuz 
    Call criu through RPC.
    Nc                 n    |                      d           t          j                    | _        d | _        d S )Nro   )
use_binaryr\   	criu_optsoptsr   r   s    r   r!   zcriu.__init__   s,    MOO	r   c                 .    t          |          | _        dS )zZ
        Access criu using unix socket which that belongs to criu service daemon.
        N)r   _comm)r
   sk_names     r   use_skzcriu.use_sk   s     #7++


r   c                 .    t          |          | _        dS )z0
        Access criu using provided fd.
        N)r,   ru   r.   s     r   use_fdzcriu.use_fd   s     #2&&


r   c                 .    t          |          | _        dS )zO
        Access criu by execing it using provided path to criu binary.
        N)r4   ru   )r
   bin_names     r   rq   zcriu.use_binary   s     $H--


r   c           	         d}|j         t          j        k    r|j                            d          sd}	 | j        s| j                            |          }n| j        }|j        r|| _        |	                    |
                                           |                    t          |                    dt          j        t          j        z                                }|j        s| j                                         t          j                    }|                    |           n4# t&          $ r'}t)          |j         t+          |                    d}~ww xY w|S )zA
        As simple as send request and receive response.
        FpidTr   N)typer\   rj   rs   HasFieldr   ru   r   	keep_openr<   SerializeToStringrO   lenr#   	MSG_TRUNCMSG_PEEKr   	criu_respParseFromString	ExceptionrZ   str)r
   reqr   r_   bufrespes          r   _send_req_and_recv_respzcriu._send_req_and_recv_resp   s=    8sx(9(9%(@(@F	:7 J&&v..G} FF3((**+++&&QVVAv'7&/'IJJKKLLC= (
%%'''=??D  %%%% 	: 	: 	:'#a&&999	: s   C3D) )
E3"EEc                     t          j                    }t           j        |_        |                     |          }|j        s t          |j        |j        |j                  dS )zB
        Checks whether the kernel support is up-to-date.
        N)r\   criu_reqCHECKr~   r   successra   cr_errnor
   r   r   s      r   checkz
criu.check  sZ     lnn9++C00| 	L'$)T]KKK	L 	Lr   c                    t          j                    }t           j        |_        |j                            | j                   |                     |          }|j        s t          |j        |j        |j	                  |j
        S zC
        Checkpoint a process/tree identified by opts.pid.
        )r\   r   rj   r~   rs   	MergeFromr   r   ra   r   dumpr   s      r   r   z	criu.dump  sn     lnn849%%%++C00| 	L'$)T]KKKyr   c                    t          j                    }t           j        |_        |j                            | j                   |                     |          }|j        s t          |j        |j        |j	                  |j
        S r   )r\   r   PRE_DUMPr~   rs   r   r   r   ra   r   r   r   s      r   pre_dumpzcriu.pre_dump"  sn     lnn<49%%%++C00| 	L'$)T]KKKyr   c                    t          j                    }t           j        |_        |j                            | j                   |                     |          }|j        s t          |j        |j        |j	                  |j
        S )z)
        Restore a process/tree.
        )r\   r   rl   r~   rs   r   r   r   ra   r   restorer   s      r   r   zcriu.restore1  sn     lnn;49%%%++C00| 	L'$)T]KKK|r   c                    t          j                    }t           j        |_        |j                            | j                   d|_        |                     |          }|j        s t          |j        |j        |j
                  |j        S )NT)r\   r   PAGE_SERVER_CHLDr~   rs   r   r   r   r   ra   r   psr   s      r   page_server_chldzcriu.page_server_chld@  ss    lnn'49%%%++C00| 	L'$)T]KKKwr   c                     t          j                    }t           j        |_        ||_        |                     |          }|j        s t          |j        |j        |j                  |j	        S r   )
r\   r   WAIT_PIDr~   r}   r   r   ra   r   status)r
   r}   r   r   s       r   wait_pidzcriu.wait_pidM  s[    lnn<++C00| 	L'$)T]KKK{r   )r   r   r   r   rs   ru   r!   rw   ry   rq   r   r   r   r   r   r   r   r   r   r   ro   ro      s          DE  
, , ,' ' '. . .! ! !F
L 
L 
L        
 
 
 
 
r   ro   )r#   rd   rG   r;   r=   pycriu.rpc_pb2rpc_pb2r\   r   r   r,   r4   r   rT   rZ   ra   ro   r   r   r   <module>r      s      				              2    J   &    J   &>% >% >% >% >%Z >% >% >%B    I   1 1 1 1 1M 1 1 1         M      FR R R R R R R R R Rr   