grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a s¿1j»"ã@s¸ddlZddlZddlZddlZddlZddlmZdZGdd„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.9/site-packages/pycriu/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 rrrr r 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__cCs^t tjtj¡|_z|j |j¡Wn2ty>tdƒ‚YntyVtdƒ‚Yn0|jS)NzSocket file not found.zService not running.)ÚsocketÚAF_UNIXÚSOCK_SEQPACKETrr rÚFileNotFoundErrorÚConnectionRefusedErrorrrrr r /s   z_criu_comm_sk.connectcCs|j ¡dSr©rÚcloser rrr r <sz_criu_comm_sk.disconnectN©r rrrrr r rrrr r&s rc@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú _criu_comm_fdz2 Communication class for file descriptor. cCs|j|_||_dSr)rrr©rÚfdrrr rEsz_criu_comm_fd.__init__cCst |jtjtj¡|_|jSr)rZfromfdrrrrrrrr r Is ÿz_criu_comm_fd.connectcCs|j ¡dSrrr rrr r Osz_criu_comm_fd.disconnectNr!rrrr r"@sr"c@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú_criu_comm_binz) Communication class for binary. cCs|j|_||_d|_d|_dSr)rrrÚswrkr)rZbin_pathrrr rXsz_criu_comm_bin.__init__cst tjtj¡‰t ˆdtj¡}t ˆdtj|tjB¡t ˆdtj¡}t ˆdtj|tj@¡|ˆ_t   ¡}|dkrƇ‡fdd„}|r¾t   ¡}|dkr²t   ¡|ƒqÄt   d¡qÖ|ƒn|rÖt   |d¡ˆd ¡t dˆd d¡¡dˆ_ˆdˆ_ˆjS)Nrrcsht d¡t d¡t d¡ˆd t dt ¡¡¡t ˆjˆjddˆd ¡g¡t  d¡dS)NrrrÚir&z%d) Úosr ÚsendÚstructÚpackÚgetpidÚexecvprÚfilenoÚ_exitr©Zcssrrr Ú exec_criuls   ÿÿz)_criu_comm_bin.connect..exec_criur'é)rZ socketpairrrÚfcntlZF_GETFDZF_SETFDZ FD_CLOEXECrr(ÚforkÚsetsidr/Úwaitpidr r*ÚunpackÚrecvr&r)rrÚflagsÚpr1rr0r r ^s,     z_criu_comm_bin.connectcCs"|j ¡|jst |jd¡dS)Nr)rr rr(r6r&r rrr r Žs z_criu_comm_bin.disconnectNr!rrrr r%Ss0r%c@s eZdZdZdZdZdd„ZdS)Ú CRIUExceptionz? Exception class for handling and storing criu errors. NcCs|jSr)Ú_strr rrr Ú__str__›szCRIUException.__str__)r rrrÚtypr<r=rrrr r;”sr;c@seZdZdZdd„ZdS)ÚCRIUExceptionInternalzC Exception class for handling and storing internal errors. cCs"||_dtj |j¡|f|_dS)Nz!%s failed with internal error: %s)r>ÚrpcÚ criu_req_typeÚNamer<)rr>Úsrrr r¤sÿzCRIUExceptionInternal.__init__N)r rrrrrrrr r?Ÿsr?c@s eZdZdZdd„Zdd„ZdS)ÚCRIUExceptionExternalzC Exception class for handling and storing criu RPC errors. cCs ||_||_||_| ¡|_dSr)r>Úresp_typÚerrnoÚ_gen_error_strr<)rZreq_typrErFrrr r¯szCRIUExceptionExternal.__init__cCs¦dtj |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@rArBr>rErFZEBADRQCÚDUMPZESRCHÚRESTOREZEEXIST)rrCrrr rGµs     z$CRIUExceptionExternal._gen_error_strN)r rrrrrGrrrr rDªsrDc@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"| d¡tjdd�|_d|_dS)NrJéÿÿÿÿ)Z images_dir_fd)Ú use_binaryr@Z criu_optsÚoptsrr rrr rÔ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)r"rNr#rrr Úuse_fdàsz criu.use_fdcCst|ƒ|_dS)zO Access criu by execing it using provided path to criu binary. N)r%rN)rZbin_namerrr rLæszcriu.use_binaryc CsÒd}|jtjkr |j d¡s d}zx|js6|j |¡}n|j}|jrH||_|  |  ¡¡|  t |  dt jt jB¡ƒ¡}|js„|j ¡t ¡}| |¡Wn4tyÌ}zt|jt|ƒƒ‚WYd}~n d}~00|S)zA As simple as send request and receive response. FÚpidTrN)Útyper@rHrMZHasFieldrrNr Ú keep_openr)ZSerializeToStringr8ÚlenrZ MSG_TRUNCZMSG_PEEKr Z criu_respZParseFromStringÚ Exceptionr?Ústr)rÚreqrrCÚbufÚrespÚerrr Ú_send_req_and_recv_respìs$ &zcriu._send_req_and_recv_respcCsDt ¡}tj|_|j |j¡| |¡}|js@t|j|j|j ƒ‚dS)zB Checks whether the kernel support is up-to-date. N) r@Úcriu_reqZCHECKrRrMÚ MergeFromr[ÚsuccessrDÚcr_errno©rrWrYrrr Úchecks  z criu.checkcCsFt ¡}tj|_|j |j¡| |¡}|js@t|j|j|j ƒ‚|j S©zC Checkpoint a process/tree identified by opts.pid. ) r@r\rHrRrMr]r[r^rDr_Údumpr`rrr rcs z criu.dumpcCsFt ¡}tj|_|j |j¡| |¡}|js@t|j|j|j ƒ‚|j Srb) r@r\ZPRE_DUMPrRrMr]r[r^rDr_rcr`rrr Úpre_dump+s z criu.pre_dumpcCsFt ¡}tj|_|j |j¡| |¡}|js@t|j|j|j ƒ‚|j S)z) Restore a process/tree. ) r@r\rIrRrMr]r[r^rDr_Úrestorer`rrr re:s z criu.restorecCsLt ¡}tj|_|j |j¡d|_| |¡}|jsFt |j|j|j ƒ‚|j S)NT) r@r\ZPAGE_SERVER_CHLDrRrMr]rSr[r^rDr_Zpsr`rrr Úpage_server_chldIs zcriu.page_server_chldcCs>t ¡}tj|_||_| |¡}|js8t|j|j|jƒ‚|j Sr) r@r\ZWAIT_PIDrRrQr[r^rDr_Ústatus)rrQrWrYrrr Úwait_pidVs z criu.wait_pid)r rrrrMrNrÚCR_DEFAULT_SERVICE_ADDRESSrOrPrLr[rarcrdrerfrhrrrr rJÌs #  rJ)rrFr3r(r*Zpycriu.rpc_pb2Zrpc_pb2r@rirrr"r%rUr;r?rDrJrrrr Ús A  "