
    Ney$                         d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	l
mZ dd
lmZ ddlmZ ddlmZ ddlmZ  G d de      Zy)zKernel Provisioner Classes    N)Any)Dict)List)Optional   )KernelConnectionInfo)LocalPortCache)launch_kernel)is_local_ip)	local_ips   )KernelProvisionerBasec                   T    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    O/usr/lib/python3/dist-packages/jupyter_client/provisioning/local_provisioner.pyhas_processzLocalProvisioner.has_process(   s    ||4''    c                 ^   K   d}| j                   r| j                   j                         }|S w)Nr   )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)Nr   g?)stdoutstderrstdin)r   r   asynciosleepwaitgetattrclose)r   r   attrfids       r   r!   zLocalProvisioner.wait3   s     <<
 		#+mmC((( 		#+ ,,##%C5  dllD1IIK   DL
 $( $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   r5   zLocalProvisioner.send_signalG   s      <<&3<<7+B:t||AAB yyWR2IIdii0
 LL$$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)NSIGKILL)	r   r2   r+   r5   r8   r4   killr   _tolerate_no_processr   r6   es      r   r9   zLocalProvisioner.killc   s     <<vy)**6>>:::9!!#  ;   9 55a889d   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)NSIGTERM)	r   r2   r+   r5   r?   r4   	terminater   r:   r;   s      r   r@   zLocalProvisioner.terminateq   s     <<vy)**6>>:::9&&(  ;   9 55a889r=   os_errorc                     t         j                  dk(  r| j                  dk7  r y ddlm} t        | t              r| j                  |k7  r y )Nr(      r   )ESRCH)r-   r.   winerrorerrnorD   
isinstanceProcessLookupError)rA   rD   s     r   r:   z%LocalProvisioner._tolerate_no_process   sL     <<7"  A% &
 $h(:;x~~QV?V @Wr   c                   K   | j                   rx|sut        j                         }| j                  d   | j                  d   | j                  d   | j                  d   | j                  d   f}|D ]  }|j	                  |        y y y w)N
shell_port
iopub_port
stdin_porthb_portcontrol_port)ports_cachedr	   instanceconnection_inforeturn_port)r   r6   lpcportsports        r   cleanupzLocalProvisioner.cleanup   s     W ))+C$$\2$$\2$$\2$$Y/$$^4E  &%& &-s   BBkwargsc                 ~  K   | j                   }|rd|j                  dk(  r8t        |j                        s#t	        d|j                  dt                     |j                  dg       }|j                  r| j                  st        j                         }|j                  |j                        |_        |j                  |j                        |_        |j                  |j                        |_        |j                  |j                        |_        |j                  |j                        |_        d| _        |j#                          |j%                         | _        |j)                  |      }n+|j                  dg       }| j*                  j,                  |z   }t/        | `  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.
        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)rZ   cmdN )parent	transportr   ipRuntimeErrorr   popcache_portsrO   r	   rP   find_available_portrJ   rK   rL   rM   rN   write_connection_fileget_connection_inforQ   format_kernel_cmdkernel_specargvsuper
pre_launch)r   rW   kmrZ   rS   
kernel_cmd	__class__s         r   rj   zLocalProvisioner.pre_launch   sp     [[||u$[-?"
 <>55)+	O  %jj):B?O ~~d&7&7$--/ # 7 7 > # 7 7 > # 7 7 > 44RUU;
"%"9"9"%%"@$(!$$&#%#9#9#;D -- / . J %jj):B?O))..@JW'AJA&AAAAs   F3F=6F;7F=r[   c                 H  K   t         j                  |      }t        |fi || _        d }t	        t
        d      r*	 t        j                  | j                  j                        }| j                  j                  | _        || _	        | j                  S # t        $ r Y 9w xY ww)Ngetpgid)r   _scrub_kwargsr
   r   r2   r3   ro   pidr4   r1   rQ   )r   r[   rW   scrubbed_kwargsr1   s        r   r
   zLocalProvisioner.launch_kernel   s     *88@$S<O<2y!zz$,,"2"23 <<##	###  s(   9B")B %.B"	BB"BB"c                 `    ddg}| j                         }|D ]  }|j                  |d        |S )z:Remove any keyword arguments that Popen does not tolerate.rZ   	kernel_idN)copyra   )rW   keywords_to_scrubrr   kws       r   rp   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)rq   r1   r_   )ri   get_provisioner_infoupdaterq   r1   r_   r   provisioner_inform   s     r   ry   z%LocalProvisioner.get_provisioner_info   sE     !&!=!??$))477 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.Nrq   r1   r_   )ri   load_provisioner_inforq   r1   r_   r{   s     r   r~   z&LocalProvisioner.load_provisioner_info   sD     g+,<===#E*$V,	"4( 	>s   <:$<)F)#__name__
__module____qualname____doc__r   _exit_futurerq   r1   r_   rO   propertyboolr   r   intr   r!   r5   r9   r@   staticmethodr4   r:   rV   r   r   strrj   r   r   r
   rp   ry   r~   __classcell__)rm   s   @r   r   r      sc   	 GL
CD	BL(T ( (HSM HSM (  89$ 94 99t 9 9 w 4  &T &d &,B ,Bc3h ,B\$tCy $C $DX $ d38n c3h   D  )D )T ) )r   r   )r   r   r3   r+   r-   typingr   r   r   r   connectr   r	   launcherr
   localinterfacesr   r   provisioner_baser   r   r\   r   r   <module>r      sC       	  
     * $ $ ) ' 3W), W)r   