
    Ib                         d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZ dd	lmZ d
dlmZ  G d dee      Zy)zgA MultiTerminalManager for use in the notebook webserver
- raises HTTPErrors
- creates REST API models
    N)	timedelta)utcnow	isoformat)NamedTermManager)web)IOLoopPeriodicCallback)Integervalidate)LoggingConfigurable   ) TERMINAL_CURRENTLY_RUNNING_TOTALc                        e Zd ZdZdZdZ eddd      ZdZ eedd	      Z	 fd
Z
d Zd Zd Zd Zd Zd fd	Zd Zd Zd Zd Zd Zd Z xZS )TerminalManagerz  NFr   TzTimeout (in seconds) in which a terminal has been inactive and ready to be culled.
        Values of 0 or lower disable culling.)confighelpi,  z_The interval (in seconds) on which to check for terminals exceeding the inactive timeout value.c                 $    t        |   |i | y N)super__init__)selfargskwargs	__class__s      C/usr/lib/python3/dist-packages/notebook/terminal/terminalmanager.pyr   zTerminalManager.__init__)   s    $)&)    c                 L    | j                         \  }}| j                  ||      S )Create a new terminal.)new_named_terminal_finish_creater   nameterms      r   createzTerminalManager.create,   s'    ,,.
d""4..r   c                     || j                   v rt        j                  dd| d      | j                  |      }| j	                  ||      S )r   i  zA terminal with name 'z' already exists.)	terminalsr   	HTTPErrorget_terminalr    r!   s      r   create_with_namez TerminalManager.create_with_name1   sM    4>>!--'=dVCT%UVV  &""4..r   c                     t               |_        | j                  |      }t        j                          | j                          |S r   )r   last_activityget_terminal_modelr   inc_initialize_cullerr   r"   r#   models       r   r    zTerminalManager._finish_create8   s;     $X''-(,,.!r   c                 (    | j                  |      }|S )zGet terminal 'name'.)r,   )r   r"   r0   s      r   getzTerminalManager.getD   s    ''-r   c                     | j                   D cg c]  }| j                  |       }}t        j                  t	        |             |S c c}w )z$Get a list of all running terminals.)r&   r,   r   setlen)r   r"   modelss      r   listzTerminalManager.listI   sH    <@NNKD$))$/KK 	),,K	
  Ls   A	c                    K   | j                  |       t        | 	  ||       d{    t        j                          y7 w)zTerminate terminal 'name'.forceN)_check_terminalr   	terminater   dec)r   r"   r:   r   s      r   r<   zTerminalManager.terminateS   s@     T"gE222 	),,.	 	3s   &AAAc                    K   | j                   D cg c]  }| }}|D ]  }| j                  |d       d{     yc c}w 7 w)zTerminate all terminals.Tr9   N)r&   r<   )r   r"   termsr#   s       r   terminate_allzTerminalManager.terminate_all\   sJ     "&..1$11 	3D..T.222	3 22s   A	?AAAc                 v    | j                  |       | j                  |   }|t        |j                        d}|S )zuReturn a JSON-safe dict representing a terminal.
        For use in representing terminals in the JSON APIs.
        )r"   r+   )r;   r&   r   r+   r/   s       r   r,   z"TerminalManager.get_terminal_modelb   s?     	T"~~d#&t'9'9:
 r   c                 R    || j                   vrt        j                  dd|       y)z9Check a that terminal 'name' exists and raise 404 if not.i  zTerminal not found: N)r&   r   r'   )r   r"   s     r   r;   zTerminalManager._check_terminaln   s,    t~~%--';D6%BCC &r   c                    | j                   s| j                  dkD  r| j                  t        j                         }| j
                  dk  rB| j                  j                  d| j
                  | j                         | j                  | _        t        | j                  d| j
                  z        | _        | j                  j                  d| j                  | j
                         | j                  j                          d| _         y)zStart culler if 'cull_inactive_timeout' is greater than zero.
        Regardless of that value, set flag that we've been here.
        r   NzKInvalid value for 'cull_interval' detected (%s) - using default value (%s).i  zICulling terminals with inactivity > %s seconds at %s second intervals ...T)_initialized_cullercull_inactive_timeout_culler_callbackr   currentcull_intervallogwarningcull_interval_defaultr	   _cull_terminalsinfostart)r   loops     r   r.   z"TerminalManager._initialize_cullers   s     ''D,F,F,J$$,~~'%%*HH$$%r%)%7%79S9SU)-)C)CD&(8(($1C1C*C)E%i"88$:L:LN%%++-#' r   c                 H  K   | j                   j                  d| j                  | j                         t	        | j
                        D ]  }	 | j                  |       d {     y 7 # t        $ r+}| j                   j                  d| d|        Y d }~Qd }~ww xY ww)NzCPolling every %s seconds for terminals inactive for > %s seconds...zPThe following exception was encountered while checking the activity of terminal z: )	rI   debugrH   rE   r7   r&   _cull_inactive_terminal	Exception	exception)r   r"   es      r   rL   zTerminalManager._cull_terminals   s     \))4+E+E	G ( 	D224888	8 ""fgkfllnopnqr sB   A
B"A+!A)"A+&B")A++	B4!BB"BB"c                   K   	 | j                   |   }| j                  j                  d||j                         t        |d      rt               }||j                  z
  }|t        | j                        kD  }|rRt        |j                               }| j                  j                  d||       | j                  |d       d {    y y y # t        $ r Y y w xY w7 w)Nzname=%s, last_activity=%sr+   )secondsz6Culling terminal '%s' due to %s seconds of inactivity.Tr9   )r&   KeyErrorrI   rQ   r+   hasattrr   r   rE   inttotal_secondsrJ   r<   )r   r"   r#   dt_nowdt_inactiveis_time
inactivitys          r   rR   z'TerminalManager._cull_inactive_terminal   s     	>>$'D 	2D$:L:LM4)XF 4#5#55K!Id6P6P$QQG !:!:!<=
  !Y[_aklnnTn666  *	  		 7s4   CC B3CCC	CCCC)F)__name__
__module____qualname____doc__rF   rD   r
   rE   rK   rH   r   r$   r)   r    r2   r7   r<   r@   r,   r;   r.   rL   rR   __classcell__)r   s   @r   r   r      s    #Ad1&
  1$rM*/
/

/3
D
(&
7r   r   )rc   warningsdatetimer   notebook._tzr   r   	terminador   tornador   tornado.ioloopr   r	   	traitletsr
   r   traitlets.configr   prometheus.metricsr   r    r   r   <module>ro      s9      * &  3 ' 0 AM7)+; M7r   