
    MhG'                         d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
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dS )zKernel Provisioner Classes    N)TYPE_CHECKINGAnyDictListOptional   )KernelConnectionInfoLocalPortCache)launch_kernel)is_local_ip	local_ips   )KernelProvisionerBasec                       e 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e         fdZdee         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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    m/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_client/provisioning/local_provisioner.pyhas_processzLocalProvisioner.has_process#   s    |4''    c                 N   K   d}| j         r| j                                         }|S )zPoll the provisioner.r   )r   poll)r   rets     r   r   zLocalProvisioner.poll'   s-      < 	&,##%%C
r   c                 X  K   d}| j         r|                                  d{V 4t          j        d           d{V  |                                  d{V 4| j                                         }dD ]-}t          | j         |          }|r|                                 .d| _         |S )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.wait.   s      < 	 
 		######+mC((((((((( 		######+ ,##%%C5    dlD11  IIKKKDL
r   signumc                 \  K   | j         r|t          j        k    r-t          j        dk    rddlm}  || j         j                   dS | j        rBt          t          d          r-	 t          j        | j        |           dS # t          $ r Y nw xY w| j                             |           dS dS )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   r6   zLocalProvisioner.send_signalC   s       < 	&&3<7+B+B::::::t|ABBB y WR22 Idi000F   D L$$V,,,F#	 	s   $B   
BBrestartc                 N  K   | j         rt          t          d          r8	 |                     t          j                   d{V  dS # t
          $ r Y nw xY w	 | j                                          dS # t
          $ r%}t                              |           Y d}~dS d}~ww xY wdS )z,Kill the provisioner and optionally restart.SIGKILLN)	r   r3   r,   r6   r9   r5   killr   _tolerate_no_processr   r7   es      r   r:   zLocalProvisioner.kill_   s      < 	9vy)) **6>:::::::::F   D9!!##### 9 9 9 55a8888888889	9 	9)   %A 
AAA3 3
B"=BB"c                 N  K   | j         rt          t          d          r8	 |                     t          j                   d{V  dS # t
          $ r Y nw xY w	 | j                                          dS # t
          $ r%}t                              |           Y d}~dS d}~ww xY wdS )z1Terminate the provisioner and optionally restart.SIGTERMN)	r   r3   r,   r6   r@   r5   	terminater   r;   r<   s      r   rA   zLocalProvisioner.terminaten   s      < 	9vy)) **6>:::::::::F   D9&&((((( 9 9 9 55a8888888889	9 	9r>   os_errorc                     t           j        dk    r| j        dk    r d S ddlm} t          | t                    r| j        |k    r d S )Nr)      r   )ESRCH)r.   r/   winerrorerrnorE   
isinstanceProcessLookupError)rB   rE   s     r   r;   z%LocalProvisioner._tolerate_no_process}   sk     <7"" A%% &%
 $#####h(:;; x~QV?V?V @W?Vr   c                 6  K   | j         r|st          j                    }| j        d         | j        d         | j        d         | j        d         | j        d         f}|D ]9}t          rt          |t                    sJ |                    |           6dS dS dS )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   rH   intreturn_port)r   r7   lpcportsports        r   cleanupzLocalProvisioner.cleanup   s       	&W 	& )++C$\2$\2$\2$Y/$^4E  & &  1%dC00000%%%%	& 	& 	& 	&& &r   kwargsc                   K   | j         }|r|j        dk    r<t          |j                  s(d|j         dt	                       }t          |          |                    dg           }|j        r| j        st          j
                    }|                    |j                  |_        |                    |j                  |_        |                    |j                  |_        |                    |j                  |_        |                    |j                  |_        d| _        d|v r3|d                             dd          }|                    |	           n|                                 |                                | _        |                    |
          }n%|                    dg           }| j        j        |z   } t1                      j        dd|i| d{V S )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.
        tcpz@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envJPY_SESSION_NAME )jupyter_session)r\   cmdN )parent	transportr   ipr   RuntimeErrorpopcache_portsrP   r
   rQ   find_available_portrK   rL   rM   rN   rO   getwrite_connection_fileget_connection_inforR   format_kernel_cmdkernel_specargvsuper
pre_launch)	r   rY   kmmsgr\   rU   r`   
kernel_cmd	__class__s	           r   rq   zLocalProvisioner.pre_launch   s      [ #	A|u$$[-?-?$D(*D D 7@kk	D D  #3'''$jj):B??O ~ )d&7 )$-// # 7 7 > > # 7 7 > > # 7 7 > > 44RU;;
"%"9"9"%"@"@$(!"(-"3"34F"K"K(((IIII((***#%#9#9#;#;D -- / .  JJ %jj):B??O).@J'UWW'AAJA&AAAAAAAAAr   ra   c                 *  K   t                               |          }t          |fi || _        d}t	          t
          d          r0	 t          j        | j        j                  }n# t          $ r Y nw xY w| j        j        | _        || _	        | j
        S )zLaunch a kernel with a command.Ngetpgid)r   _scrub_kwargsr   r   r3   r4   rw   pidr5   r2   rR   )r   ra   rY   scrubbed_kwargsr2   s        r   r   zLocalProvisioner.launch_kernel   s      *88@@$S<<O<<2y!! 	z$,"233    <#	##s   A& &
A32A3c                 l    ddg}|                                  }|D ]}|                    |d           |S )z:Remove any keyword arguments that Popen does not tolerate.r\   	kernel_idN)copyrg   )rY   keywords_to_scrubrz   kws       r   rx   zLocalProvisioner._scrub_kwargs   sJ     ):;'G ++--# 	* 	*BD))))r   c                    K   t                                                       d{V }|                    | j        | j        | j        d           |S )zRCaptures the base information necessary for persistence relative to this instance.N)ry   r2   re   )rp   get_provisioner_infoupdatery   r2   re   r   provisioner_inforu   s     r   r   z%LocalProvisioner.get_provisioner_info   sY      !&!=!=!?!???????$)47 S STTTr   r   c                    K   t                                          |           d{V  |d         | _        |d         | _        |d         | _        dS )zOLoads the base information necessary for persistence relative to this instance.Nry   r2   re   )rp   load_provisioner_infory   r2   re   r   s     r   r   z&LocalProvisioner.load_provisioner_info   sZ      gg++,<=========#E*$V,	"4(r   )F)#__name__
__module____qualname____doc__r   _exit_futurery   r2   re   rP   propertyboolr   r   rS   r   r"   r6   r:   rA   staticmethodr5   r;   rX   r   r   strrq   r   r	   r   rx   r   r   __classcell__)ru   s   @r   r   r      sk       	 	 GL
CD	BL(T ( ( ( X(HSM    HSM    *     89 9$ 94 9 9 9 99 9t 9 9 9 9 9 w 4    \& &T &d & & & &"0B 0Bc3h 0B 0B 0B 0B 0B 0Bd$tCy $C $DX $ $ $ $ d38n c3h    \ D            )D )T ) ) ) ) ) ) ) ) ) )r   r   )r   r    r4   r,   r.   typingr   r   r   r   r   connectr	   r
   launcherr   localinterfacesr   r   provisioner_baser   r   rb   r   r   <module>r      s         				  



 ; ; ; ; ; ; ; ; ; ; ; ; ; ; : : : : : : : : $ $ $ $ $ $ 4 4 4 4 4 4 4 4 3 3 3 3 3 3b) b) b) b) b), b) b) b) b) b)r   