3  i»"ã@s¶ddlZddlZddlZddlZddlZddljZdZGdd„dƒZ Gdd„de ƒZ Gdd„de ƒZ Gd d „d e ƒZ Gd d „d e ƒZGd d„deƒZGdd„deƒZGdd„dƒZdS)éNz./criu_service.socketc@s8eZdZdZdZdZdZdZdZdZ dd„Z dd „Z dS) Ú _criu_commz/ Base class for communication classes. rééNcCsdS)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Údaemonrrú/usr/lib/python3.6/criu.pyÚconnectsz_criu_comm.connectcCsdS)z' Disconnect from criu. Nr)rrrrÚ disconnectsz_criu_comm.disconnect) Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚCOMM_SKÚCOMM_FDÚCOMM_BINÚ comm_typeÚcommÚskr r rrrrr src@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú _criu_comm_skz. Communication class for unix socket. cCs|j|_||_dS)N)rrr)rZsk_pathrrrÚ__init__+sz_criu_comm_sk.__init__c Csbtjtjtjƒ|_y|jj|jƒWn6tk r@tdƒ‚Yntk rZtdƒ‚YnX|jS)NzSocket file not found.zService not running.)ÚsocketÚAF_UNIXÚSOCK_SEQPACKETrr rÚFileNotFoundErrorÚConnectionRefusedError)rrrrrr /s z_criu_comm_sk.connectcCs|jjƒdS)N)rÚclose)rrrrr <sz_criu_comm_sk.disconnectN)r r r rrr r rrrrr&s rc@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú _criu_comm_fdz2 Communication class for file descriptor. cCs|j|_||_dS)N)rrr)rÚfdrrrrEsz_criu_comm_fd.__init__cCstj|jtjtjƒ|_|jS)N)rZfromfdrrrr)rrrrrr Is  z_criu_comm_fd.connectcCs|jjƒdS)N)rr)rrrrr Osz_criu_comm_fd.disconnectN)r r r rrr r rrrrr@src@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú_criu_comm_binz) Communication class for binary. cCs|j|_||_d|_d|_dS)N)rrrÚswrkr)rZbin_pathrrrrXsz_criu_comm_bin.__init__cstjtjtjƒ‰tjˆdtjƒ}tjˆdtj|tjBƒtjˆdtjƒ}tjˆdtj|tj@ƒ|ˆ_t j ƒ}|dkrƇ‡fdd„}|r¾t j ƒ}|dkr²t j ƒ|ƒqÄt j dƒqÖ|ƒn|rÖt j |dƒˆdjƒtjdˆdjdƒƒdˆ_ˆdˆ_ˆjS)Nrrcshtjdƒtjdƒtjdƒˆdjtjdtjƒƒƒtjˆjˆjddˆdjƒgƒtj dƒdS)NrrrÚir z%d) ÚosrÚsendÚstructÚpackÚgetpidÚexecvprÚfilenoÚ_exitr)ÚcssrrrÚ exec_criuls   z)_criu_comm_bin.connect..exec_criur!é)rZ socketpairrrÚfcntlZF_GETFDZF_SETFDZ FD_CLOEXECrr"ÚforkÚsetsidr)Úwaitpidrr$ÚunpackÚrecvr r)rrÚflagsÚpr+r)r*rrr ^s,     z_criu_comm_bin.connectcCs"|jjƒ|jstj|jdƒdS)Nr)rrrr"r0r )rrrrr Žs z_criu_comm_bin.disconnectN)r r r rrr r rrrrrSs0rc@s eZdZdZdZdZdd„ZdS)Ú CRIUExceptionz? Exception class for handling and storing criu errors. NcCs|jS)N)Ú_str)rrrrÚ__str__›szCRIUException.__str__)r r r rÚtypr6r7rrrrr5”sr5c@seZdZdZdd„ZdS)ÚCRIUExceptionInternalzC Exception class for handling and storing internal errors. cCs"||_dtjj|jƒ|f|_dS)Nz!%s failed with internal error: %s)r8ÚrpcÚ criu_req_typeÚNamer6)rr8Úsrrrr¤szCRIUExceptionInternal.__init__N)r r r rrrrrrr9Ÿsr9c@s eZdZdZdd„Zdd„ZdS)ÚCRIUExceptionExternalzC Exception class for handling and storing criu RPC errors. cCs ||_||_||_|jƒ|_dS)N)r8Úresp_typÚerrnoÚ_gen_error_strr6)rZreq_typr?r@rrrr¯szCRIUExceptionExternal.__init__cCs¦dtjj|jƒf}|j|jkr0|d|jf7}|d|jf7}|jtjkrV|d7}nL|jtjkrx|jtjkrx|d7}n*|jtj krš|jtj krš|d7}n|d7}|S)Nz %s failed: zUnexpected response type %d: z Error(%d): z Bad optionszNo process with such pidz)Process with requested pid already existsZUnknown) r:r;r<r8r?r@ZEBADRQCÚDUMPZESRCHÚRESTOREZEEXIST)rr=rrrrAµs     z$CRIUExceptionExternal._gen_error_strN)r r r rrrArrrrr>ªsr>c@steZdZdZdZdZdd„Zefdd„Zdd„Z d d „Z d d „Z d d„Z dd„Z dd„Zdd„Zdd„Zdd„ZdS)Úcriuz Call criu through RPC. NcCs"|jdƒtjdd�|_d|_dS)NrDr)Z images_dir_fdéÿÿÿÿ)Ú use_binaryr:Z criu_optsÚoptsr)rrrrrÔs z criu.__init__cCst|ƒ|_dS)zZ Access criu using unix socket which that belongs to criu service daemon. N)rÚ_comm)rZsk_namerrrÚuse_skÚsz criu.use_skcCst|ƒ|_dS)z0 Access criu using provided fd. N)rrH)rrrrrÚuse_fdàsz criu.use_fdcCst|ƒ|_dS)zO Access criu by execing it using provided path to criu binary. N)rrH)rZbin_namerrrrFæszcriu.use_binarycCsÒd}|jtjkr"|jjdƒ r"d}yx|js8|jj|ƒ}n|j}|jrJ||_|j |j ƒƒ|j t |j dt jt jBƒƒƒ}|js†|jjƒtjƒ}|j|ƒWn2tk rÌ}zt|jt|ƒƒ‚WYdd}~XnX|S)zA As simple as send request and receive response. FÚpidTrN)Útyper:rBrGZHasFieldrrHr Ú keep_openr#ZSerializeToStringr2ÚlenrZ MSG_TRUNCZMSG_PEEKr Z criu_respZParseFromStringÚ Exceptionr9Ústr)rÚreqrr=ZbufÚrespÚerrrÚ_send_req_and_recv_respìs$ "zcriu._send_req_and_recv_respcCsDtjƒ}tj|_|jj|jƒ|j|ƒ}|js@t|j|j|j ƒ‚dS)zB Checks whether the kernel support is up-to-date. N) r:Úcriu_reqZCHECKrLrGÚ MergeFromrTÚsuccessr>Úcr_errno)rrQrRrrrÚchecks  z criu.checkcCsFtjƒ}tj|_|jj|jƒ|j|ƒ}|js@t|j|j|j ƒ‚|j S)zC Checkpoint a process/tree identified by opts.pid. ) r:rUrBrLrGrVrTrWr>rXÚdump)rrQrRrrrrZs z criu.dumpcCsFtjƒ}tj|_|jj|jƒ|j|ƒ}|js@t|j|j|j ƒ‚|j S)zC Checkpoint a process/tree identified by opts.pid. ) r:rUZPRE_DUMPrLrGrVrTrWr>rXrZ)rrQrRrrrÚpre_dump+s z criu.pre_dumpcCsFtjƒ}tj|_|jj|jƒ|j|ƒ}|js@t|j|j|j ƒ‚|j S)z) Restore a process/tree. ) r:rUrCrLrGrVrTrWr>rXÚrestore)rrQrRrrrr\:s z criu.restorecCsLtjƒ}tj|_|jj|jƒd|_|j|ƒ}|jsFt |j|j|j ƒ‚|j S)NT) r:rUZPAGE_SERVER_CHLDrLrGrVrMrTrWr>rXZps)rrQrRrrrÚpage_server_chldIs zcriu.page_server_chldcCs>tjƒ}tj|_||_|j|ƒ}|js8t|j|j|jƒ‚|j S)N) r:rUZWAIT_PIDrLrKrTrWr>rXZstatus)rrKrQrRrrrÚwait_pidVs z criu.wait_pid)r r r rrGrHrÚCR_DEFAULT_SERVICE_ADDRESSrIrJrFrTrYrZr[r\r]r^rrrrrDÌs #  rD)rr@r-r"r$Zpycriu.rpc_pb2Zrpc_pb2r:r_rrrrrOr5r9r>rDrrrrÚs A  "