Ë
    :vžjd2  ã                   ó–   — d Z 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mZ ddl	Z	ddl
mZmZ ddlmZ ddlmZmZ dd	lmZ  G d
„ de«      Zy)zKernel Provisioner Classesé    N)ÚTYPE_CHECKINGÚAnyé   )ÚKernelConnectionInfoÚLocalPortCache)Úlaunch_kernel)Úis_local_ipÚ	local_ipsé   )ÚKernelProvisionerBasec                   ón  ‡ — e Zd ZdZdZdZdZdZdZdZ	dZ
edefd„«       Zdedz  fd„Zdedz  fd„Zdeddfd	„Zdd
eddfd„Zdd
eddfd„Zededdfd„«       Zdd
eddfd„Zdedeeef   fˆ fd„Zdee   dedefd„Zdededz  fd„Zedeeef   deeef   fd„«       Z defˆ fd„Z!deddfˆ fd„Z"ˆ xZ#S )ÚLocalProvisionera0  
    :class:`LocalProvisioner` is a concrete class of ABC :py:class:`KernelProvisionerBase`
    and is the out-of-box default implementation used when no kernel provisioner is
    specified in the kernel specification (``kernel.json``).  It provides functional
    parity to existing applications by launching the kernel locally and using
    :class:`subprocess.Popen` to manage its lifecycle.

    This class is intended to be subclassed for customizing local kernel environments
    and serve as a reference implementation for other custom provisioners.
    NFÚreturnc                 ó   — | j                   d uS )N)Úprocess)Úselfs    ú~/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_client/provisioning/local_provisioner.pyÚhas_processzLocalProvisioner.has_process(   s   € à�|‰| 4Ð'Ð'ó    c              ƒ   ó^   K  — d}| j                   r| j                   j                  «       }|S ­w)zPoll the provisioner.r   )r   Úpoll)r   Úrets     r   r   zLocalProvisioner.poll,   s)   è ø€ àˆØ�<Š<Ø—,‘,×#Ñ#Ó%ˆCØˆ
ùs   ‚+-c              ƒ   ót  K  — d}| j                   rŸ| j                  «       ƒ d{  –—† €6t        j                  d«      ƒ d{  –—†  | j                  «       ƒ d{  –—† €Œ6| j                   j	                  «       }dD ]+  }t        | j                   |«      }|sŒ|j                  «        Œ- d| _         |S 7 Œ�7 Œr7 Œ\­w)z!Wait for the provisioner process.r   Ngš™™™™™¹?)ÚstdoutÚstderrÚstdin)r   r   ÚasyncioÚsleepÚwaitÚgetattrÚclose)r   r   ÚattrÚfids       r   r   zLocalProvisioner.wait3   s�   è ø€ àˆØ�<Š<ð
 Ÿ	™	›×#Ð+Ü—m‘m CÓ(×(Ð(ð Ÿ	™	›×#Ñ+ð —,‘,×#Ñ#Ó%ˆCã5�Ü˜dŸl™l¨DÓ1�ÚØ—I‘I•Kð 6ð  ˆDŒLØˆ
ð $øØ(øð $ús?   ‚"B8¤B2¥B8ÁB4ÁB8ÁB6ÁB8Á7B8ÂB8Â4B8Â6B8Úsignumc              ƒ   óˆ  K  — | j                   r£|t        j                  k(  r6t        j                  dk(  r#ddlm}  || j                   j                  «       y| j                  r2t        t        d«      r"	 t        j                  | j                  |«       y| j                   j                  |«       yy# t        $ r Y Œ(w xY w­w)aT  Sends a signal to the process group of the kernel (this
        usually includes the kernel and any subprocesses spawned by
        the kernel).

        Note that since only SIGTERM is supported on Windows, we will
        check if the desired signal is for interrupt and apply the
        applicable code on Windows in that case.
        Úwin32r   )Úsend_interruptNÚkillpg)r   ÚsignalÚSIGINTÚsysÚplatformÚwin_interruptr'   Úwin32_interrupt_eventÚpgidÚhasattrÚosr(   ÚOSErrorÚsend_signal)r   r$   r'   s      r   r3   zLocalProvisioner.send_signalH   s™   è ø€ ð �<Š<ØœŸ™Ò&¬3¯<©<¸7Ò+BÝ:á˜tŸ|™|×AÑAÔBØð �yŠyœW¤R¨Ô2ðÜ—I‘I˜dŸi™i¨Ô0Øð
 �L‰L×$Ñ$ VÔ,Øð# øô ò Ùðüs*   ‚A2CÁ5 B3 ÂCÂ3	B?Â<CÂ>B?Â?CÚrestartc              ƒ   óF  K  — | j                   rUt        t        d«      r)	 | j                  t        j                  «      ƒ d{  –—†  y	 | j                   j                  «        yy7 Œ"# t
        $ r Y Œ*w xY w# t
        $ r}t        j                  |«       Y d}~yd}~ww xY w­w)z,Kill the provisioner and optionally restart.ÚSIGKILLN)	r   r0   r)   r3   r6   r2   Úkillr   Ú_tolerate_no_process©r   r4   Úes      r   r7   zLocalProvisioner.killd   s‰   è ø€ à�<Š<Ü”v˜yÔ)ðØ×*Ñ*¬6¯>©>Ó:×:Ð:Øð9Ø—‘×!Ñ!Õ#ð ð ;ùäò Ùðûô ò 9Ü ×5Ñ5°a×8Ñ8ûð9üód   ‚B! "A' ÁA%ÁA' ÁB!Á	A6 Á#B!Á%A' Á'	A3Á0B!Á2A3Á3B!Á6	BÁ?BÂB!ÂBÂB!c              ƒ   óF  K  — | j                   rUt        t        d«      r)	 | j                  t        j                  «      ƒ d{  –—†  y	 | j                   j                  «        yy7 Œ"# t
        $ r Y Œ*w xY w# t
        $ r}t        j                  |«       Y d}~yd}~ww xY w­w)z1Terminate the provisioner and optionally restart.ÚSIGTERMN)	r   r0   r)   r3   r=   r2   Ú	terminater   r8   r9   s      r   r>   zLocalProvisioner.terminates   s‰   è ø€ à�<Š<Ü”v˜yÔ)ðØ×*Ñ*¬6¯>©>Ó:×:Ð:Øð9Ø—‘×&Ñ&Õ(ð ð ;ùäò Ùðûô ò 9Ü ×5Ñ5°a×8Ñ8ûð9ür;   Úos_errorc                 óÔ   — t         j                  dk(  r | j                  dk7  rd| › �}t        |«      ‚y ddlm} t        | t        «      r| j                  |k7  rd| › �}t        |«      ‚y )Nr&   é   z3Invalid Error, expecting error number to be 5, got r   )ÚESRCHz:Invalid Error, expecting ProcessLookupError or ESRCH, got )r+   r,   ÚwinerrorÚ
ValueErrorÚerrnorB   Ú
isinstanceÚProcessLookupError)r?   Úerr_messagerB   s      r   r8   z%LocalProvisioner._tolerate_no_process‚   s}   € ô �<‰<˜7Ò"Ø× Ñ  AÒ%Ø SÐT\ÐS]Ð^�Ü  Ó-Ð-ð &õ $ä˜hÔ(:Ô;¸x¿~¹~ÐQVÒ?VàPÐQYÐPZÐ[ð ô ! Ó-Ð-ð	 @Wr   c              ƒ   óD  K  — | j                   r�|s�t        j                  «       }| j                  d   | j                  d   | j                  d   | j                  d   | j                  d   f}|D ]+  }t        rt        |t        «      sJ ‚|j                  |«       Œ- yyy­w)zFClean up the resources used by the provisioner and optionally restart.Ú
shell_portÚ
iopub_portÚ
stdin_portÚhb_portÚcontrol_portN)Úports_cachedr   ÚinstanceÚconnection_infor   rF   ÚintÚreturn_port)r   r4   ÚlpcÚportsÚports        r   ÚcleanupzLocalProvisioner.cleanup–   sŸ   è ø€ à×Ò¡Wä ×)Ñ)Ó+ˆCà×$Ñ$ \Ñ2Ø×$Ñ$ \Ñ2Ø×$Ñ$ \Ñ2Ø×$Ñ$ YÑ/Ø×$Ñ$ ^Ñ4ðˆEó �Ý Ü% d¬CÔ0Ð0Ð0Ø—‘ Õ%ñ ð &-Ðùs   ‚BB Úkwargsc              ‹   ó¨  •K  — | j                   }|�ry|j                  dt        |dd«      «      }t        |d«      r|j	                  |«      nt        |«      rdnd}|dk(  }|dv }|j                  dv }d}d}	|r|sd	}
t        |
«      ‚|j                  d
k(  r:t        |j                  «      s%d|j                  › dt        «       › �}
t        |
«      ‚|j                  dg «      }|j                  rÇ| j                  s»t        j                  «       }|j                  |j                  «      |_        |j                  |j                  «      |_        |j                  |j                  «      |_        |j                  |j                  «      |_        |j                  |j                  «      |_        d| _        |rp|rn|xs t        |d«      xr |j+                  «       }|rJ|j,                  €&t/        j0                  «       \  }}	||_        |	|_        n|j,                  }|j2                  }	d|v r(|d   j5                  dd«      }|j7                  |¬«       n|j7                  «        |j9                  «       | _        |j=                  |¬«      }n+|j                  dg «      }| j>                  j@                  |z   }tC        ‰| �ˆ  dd|i|¤Žƒ d{  –—† S 7 Œ­w)a  Perform any steps in preparation for kernel process launch.

        This includes applying additional substitutions to the kernel launch command and env.
        It also includes preparation of launch parameters.

        Returns the updated kwargs.
        Útransport_encryptionÚdisabledÚ_transport_encryption_policyÚautoÚrequired>   r]   r^   >   ÚipcÚtcpNzStransport_encryption='required' is only supported when transport is 'tcp' or 'ipc'.r`   z@Can only launch a kernel on a local interface. This one is not: zc.Make sure that the '*_address' attributes are configured properly. Currently valid addresses are: Úextra_argumentsTÚ!_kernel_supports_curve_encryptionÚenvÚJPY_SESSION_NAMEÚ )Újupyter_session)ra   Úcmd© )#ÚparentÚpopr    r0   r\   ÚboolÚ	transportÚRuntimeErrorr	   Úipr
   Úcache_portsrO   r   rP   Úfind_available_portrJ   rK   rL   rM   rN   rb   Úcurve_publickeyÚzmqÚcurve_keypairÚcurve_secretkeyÚgetÚwrite_connection_fileÚget_connection_inforQ   Úformat_kernel_cmdÚkernel_specÚargvÚsuperÚ
pre_launch)r   rX   ÚkmrZ   Útransport_encryption_policyÚencryption_requiredÚencryption_enabledÚencryption_supported_transportrq   rt   Úmsgra   rT   Úkernel_curve_okrf   Ú
kernel_cmdÚ	__class__s                   €r   r|   zLocalProvisioner.pre_launch§   sÌ  øè ø€ ð �[‰[ˆÚØ#)§:¡:Ø&¬°Ð4JÈJÓ(Wó$Ð ô
 ˜2Ð=Ô>ð ×/Ñ/Ð0DÔEä $Ð%9Ô :‘fÀ
ð (ð
 #>ÀÑ"KÐØ!<Ð@TÐ!TÐð .0¯\©\¸^Ð-KÐ*Ø,0ˆOØ,0ˆOÙ"Ñ+Ið3ð ô # 3Ó'Ð'Ø�|‰|˜uÒ$¬[¸¿¹Ô-?ð(Ø(*¯© wð /6ô 7@³k°]ð	Dð ô # 3Ó'Ð'à$Ÿj™jÐ):¸BÓ?ˆOð �~Š~ d×&7Ò&7Ü$×-Ñ-Ó/�Ø #× 7Ñ 7¸¿¹Ó >�”Ø #× 7Ñ 7¸¿¹Ó >�”Ø #× 7Ñ 7¸¿¹Ó >�”Ø ×4Ñ4°R·U±UÓ;�”
Ø"%×"9Ñ"9¸"¿%¹%Ó"@�”Ø$(�Ô!á!Ñ&DØ"5ò #Ü˜BÐ CÓDò ?Ø×<Ñ<Ó>ð  ñ #Ø×)Ñ)Ð1Ü;>×;LÑ;LÓ;NÑ8˜¨Ø-<˜Ô*Ø-<˜Õ*ð
 +-×*<Ñ*<˜Ø*,×*<Ñ*<˜Ø˜‰Ø"(¨¡-×"3Ñ"3Ð4FÈÓ"K�Ø×(Ñ(¸Ð(ÕIà×(Ñ(Ô*Ø#%×#9Ñ#9Ó#;ˆDÔ à×-Ñ-Ø /ð .ó ‰Jð %Ÿj™jÐ):¸BÓ?ˆOØ×)Ñ)×.Ñ.°Ñ@ˆJä‘WÑ'ÑA¨JÐA¸&ÑA×AÐAÐAús   ƒKKËKËKrg   c              ‹   ó®  K  — t         j                  |«      }t        |fi |¤Ž| _        d}t	        t
        d«      r*	 t        j                  | j                  j                  «      }| j                  j                  | _        || _	        |j                  dt        j                  j                  «       «      | _        | j                  S # t        $ r Y Œlw xY w­w)zLaunch a kernel with a command.NÚgetpgidÚcwd)r   Ú_scrub_kwargsr   r   r0   r1   r‡   Úpidr2   r/   ru   ÚpathlibÚPathrˆ   rQ   )r   rg   rX   Úscrubbed_kwargsr/   s        r   r   zLocalProvisioner.launch_kernelÿ   s­   è ø€ ô +×8Ñ8¸Ó@ˆÜ$ SÑ<¨OÑ<ˆŒØˆÜ”2�yÔ!ðÜ—z‘z $§,¡,×"2Ñ"2Ó3�ð —<‘<×#Ñ#ˆŒØˆŒ	Ø—:‘:˜e¤W§\¡\×%5Ñ%5Ó%7Ó8ˆŒØ×#Ñ#Ð#øô ò Ùðüs)   ‚9C¼)C Á%A!CÃ	CÃCÃCÃCÚpath_strc                 ó"  — t        j                  |«      j                  «       }|j                  «       s<| j                  r0t        j                  | j                  «      |z  j                  «       }|j                  «       r|j                  «       S y)zResolve path to given file.N)r‹   rŒ   Ú
expanduserÚis_absoluterˆ   ÚresolveÚexistsÚas_posix)r   rŽ   Úpaths      r   Úresolve_pathzLocalProvisioner.resolve_path  sc   € ä�|‰|˜HÓ%×0Ñ0Ó2ˆØ×ÑÔ! d§h¢hÜ—L‘L §¡Ó*¨TÑ1×:Ñ:Ó<ˆDØ�;‰;Œ=Ø—=‘=“?Ð"Ør   c                 ó`   — ddg}| j                  «       }|D ]  }|j                  |d«       Œ |S )z:Remove any keyword arguments that Popen does not tolerate.ra   Ú	kernel_idN)Úcopyrj   )rX   Úkeywords_to_scrubr�   Úkws       r   r‰   zLocalProvisioner._scrub_kwargs  s:   € ð ):¸;Ð'GÐØ Ÿ+™+›-ˆÛ#ˆBØ×Ñ  DÕ)ð $àÐr   c              ƒ   ó¦   •K  — t         ‰| �  «       ƒ d{  –—† }|j                  | j                  | j                  | j
                  dœ«       |S 7 Œ9­w)zRCaptures the base information necessary for persistence relative to this instance.N)rŠ   r/   rn   )r{   Úget_provisioner_infoÚupdaterŠ   r/   rn   ©r   Úprovisioner_infor…   s     €r   r�   z%LocalProvisioner.get_provisioner_info"  sE   øè ø€ ä!&¡Ñ!=Ó!?×?ÐØ×Ñ¨¯©¸$¿)¹)È4Ï7É7Ñ SÔTØÐð @ús   ƒA•A–:Ar    c              ƒ   ó|   •K  — t         ‰| �  |«      ƒ d{  –—†  |d   | _        |d   | _        |d   | _        y7 Œ#­w)zOLoads the base information necessary for persistence relative to this instance.NrŠ   r/   rn   )r{   Úload_provisioner_inforŠ   r/   rn   rŸ   s     €r   r¢   z&LocalProvisioner.load_provisioner_info(  sD   øè ø€ ä‰gÑ+Ð,<Ó=×=Ð=Ø# EÑ*ˆŒØ$ VÑ,ˆŒ	Ø" 4Ñ(ˆ�ð 	>ús   ƒ<–:—$<)F)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú_exit_futurerŠ   r/   rn   rO   rˆ   Úpropertyrk   r   rR   r   r   r3   r7   r>   Ústaticmethodr2   r8   rW   r   ÚdictÚstrr|   Úlistr   r   r–   r‰   r�   r¢   Ú__classcell__)r…   s   @r   r   r      s‚  ø„ ñ	ð €GØ€LØ
€CØ€DØ	€BØ€LØ
€Càð(˜Tò (ó ð(ð˜C $™Jó ð˜C $™Jó ð*¨ð °ó ñ89 $ð 9°4ó 9ñ9 tð 9¸ó 9ð ð. wð .°4ò .ó ð.ñ&& Tð &°dó &ð"VB¨ð VB°°c¸3°h±õ VBðp$ t¨C¡yð $¸Cð $ÐDXó $ð" Sð ¨S°4©Zó ð ð˜d 3¨ 8™nð °°c¸3°h±ò ó ðð ¨Dõ  ð)¸Dð )ÀT÷ )ñ )r   r   )r¦   r   r1   r‹   r)   r+   Útypingr   r   rr   Úconnectr   r   Úlauncherr   Úlocalinterfacesr	   r
   Úprovisioner_baser   r   rh   r   r   Ú<module>r³      s:   ðÙ  ó Û 	Û Û Û 
ß %ã 
ç :Ý $ß 4Ý 3ôY)Ð,õ Y)r   