
    d                         d 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 ddlmZmZ ddlmZ dd	lmZ ej        Z G d
 dee	          ZdS )zgA MultiTerminalManager for use in the notebook webserver
- raises HTTPErrors
- creates REST API models
    )	timedelta)	isoformatutcnow)metrics)NamedTermManager)web)IOLoopPeriodicCallback)Integer)LoggingConfigurablec                        e Zd ZdZdZdZ eddd          ZdZ eedd	          Z	d
 Z
d Zd Zd fd	Zd Zd Zd Zd Zd Zd Zd Z xZS )TerminalManagerz8A MultiTerminalManager for use in the notebook webserverNFr   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                      | j         di |\  }}t                      |_        |                     |          }t                                           |                                  |S )zCreate a new terminal. )new_named_terminalr   last_activityget_terminal_modelRUNNING_TOTALinc_initialize_culler)selfkwargsnametermmodels        Hlib/python3.11/site-packages/jupyter_server_terminals/terminalmanager.pycreatezTerminalManager.create,   sh    ,T,66v66
d $XX''--!!!    c                 0    |                      |          }|S )zGet terminal 'name'.r   )r   r   r   s      r   getzTerminalManager.get:   s    ''--r    c                 |      fd j         D             }t                              t          |                     |S )z$Get a list of all running terminals.c                 :    g | ]}                     |          S r   r"   ).0r   r   s     r   
<listcomp>z(TerminalManager.list.<locals>.<listcomp>A   s'    KKKD$))$//KKKr    )	terminalsr   setlen)r   modelss   ` r   listzTerminalManager.list?   s?    KKKKDNKKK 	#f++&&&r    c                    K   |                      |           t                                          ||           d{V  t                                           dS )zTerminate terminal 'name'.forceN)_check_terminalsuper	terminater   dec)r   r   r/   	__class__s      r   r2   zTerminalManager.terminateG   sd      T"""ggE222222222 	r    c                 v   K   t          | j                  }|D ]}|                     |d           d{V   dS )zTerminate all terminals.Tr.   N)r,   r(   r2   )r   termsr   s      r   terminate_allzTerminalManager.terminate_allP   sY      T^$$ 	3 	3D..T.2222222222	3 	3r    c                 x    |                      |           | j        |         }|t          |j                  d}|S )zuReturn a JSON-safe dict representing a terminal.
        For use in representing terminals in the JSON APIs.
        )r   r   )r0   r(   r   r   )r   r   r   r   s       r   r   z"TerminalManager.get_terminal_modelV   sH     	T"""~d#&t'9::
 
 r    c                 H    || j         vrt          j        dd|z            dS )z9Check a that terminal 'name' exists and raise 404 if not.i  zTerminal not found: %sN)r(   r   	HTTPError)r   r   s     r   r0   zTerminalManager._check_terminalb   s/    t~%%-%=%DEEE &%r    c                    | j         s| j        dk    r| j        t          j                    }| j        dk    r2| j                            d| j        | j                   | j        | _        t          | j
        d| j        z            | _        | j                            d| j        | j                   | j                                         d| _         dS )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   _s     r   r   z"TerminalManager._initialize_cullerg   s     ' 	.D,F,J,J$,N$$%**H$$e*2  
 *.)CD&(8($1C*C) )% _.&  
 %++---#'   r    c                 F  K   | j                             d| j        | j                   t	          | j                  D ]c}	 |                     |           d {V  # t          $ r8}| j                             d	                    ||                     Y d }~\d }~ww xY wd S )NzCPolling every %s seconds for terminals inactive for > %s seconds...zVThe following exception was encountered while checking the activity of terminal {}: {})
rA   debugr@   r=   r,   r(   _cull_inactive_terminal	Exception	exceptionformat)r   r   es      r   rD   zTerminalManager._cull_terminals   s      Q&	
 	
 	
 (( 	 	D2248888888888   ""228&q//       	 	s    A
B&.BBc                   K   	 | j         |         }n# t          $ r Y d S w xY w| j                            d||j                   t          |d          rt                      }||j        z
  }|t          | j                  k    }|r^t          |
                                          }| j                            d||           |                     |d           d {V  d S d S d S )Nzname=%s, last_activity=%sr   )secondsz6Culling terminal '%s' due to %s seconds of inactivity.Tr.   )r(   KeyErrorrA   rI   r   hasattrr   r   r=   inttotal_secondsrB   r2   )r   r   r   dt_nowdt_inactiveis_time
inactivitys          r   rJ   z'TerminalManager._cull_inactive_terminal   s      	>$'DD 	 	 	FF	 	2D$:LMMM4)) 	7XXF 4#55K!Id6P$Q$Q$QQG 7 !:!:!<!<==
  LdT^   nnTn66666666666	7 	77 7s    
  c                 ,    t                      |_        dS )zThe pre-pty read hook.N)r   r   )r   ptywclientss     r   pre_pty_read_hookz!TerminalManager.pre_pty_read_hook   s    $*HH!!!r    )F)__name__
__module____qualname____doc__r>   r<   r   r=   rC   r@   r   r#   r,   r2   r7   r   r0   r   rD   rJ   r[   __classcell__)r4   s   @r   r   r      s1       BB#G	1    Gr  M    
       3 3 3
 
 
F F F
( ( (4   7 7 7(- - - - - - -r    r   N)r_   datetimer   jupyter_server._tzr   r   jupyter_server.prometheusr   terminado.managementr   tornador   tornado.ioloopr	   r
   	traitletsr   traitlets.configr    TERMINAL_CURRENTLY_RUNNING_TOTALr   r   r   r    r   <module>rj      s           0 0 0 0 0 0 0 0 - - - - - - 1 1 1 1 1 1       3 3 3 3 3 3 3 3       0 0 0 0 0 08S- S- S- S- S-)+; S- S- S- S- S-r    