
    Mh                        d Z ddlm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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ej        eej        f         Z G d dee          ZdS )zgA MultiTerminalManager for use in the notebook webserver
- raises HTTPErrors
- creates REST API models
    )annotationsN)	timedelta)	isoformatutcnow)metrics)NamedTermManagerPtyWithClients)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!dZ
d"dZd#dZd$d% fdZd&dZd"dZd'dZd&dZd&dZd'dZd(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.kwargst.AnyreturnMODELc                     | j         di |\  }}t                      |_        |                     |          }t                                           |                                  |S )zCreate a new terminal. )new_named_terminalr   last_activityget_terminal_modelRUNNING_TOTALinc_initialize_culler)selfr   nametermmodels        h/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_server_terminals/terminalmanager.pycreatezTerminalManager.create1   sh    ,T,66v66
d $XX''--!!!    r    strc                ,    |                      |          S )zGet terminal 'name'.r   r   r    s     r#   getzTerminalManager.get?   s    &&t,,,r%   list[MODEL]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>E   s'    KKKD$))$//KKKr%   )	terminalsr   setlen)r   modelss   ` r#   listzTerminalManager.listC   s?    KKKKDNKKK 	#f++&&&r%   forceboolNonec                   K   |                      |           t                                          ||           d{V  t                                           dS )zTerminate terminal 'name'.r5   N)_check_terminalsuper	terminater   dec)r   r    r5   	__class__s      r#   r<   zTerminalManager.terminateK   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.Tr9   N)r4   r0   r<   )r   termsr!   s      r#   terminate_allzTerminalManager.terminate_allT   sY      T^$$ 	3 	3D..T.2222222222	3 	3r%   c                t    |                      |           | 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:   r0   r   r   )r   r    r!   s      r#   r   z"TerminalManager.get_terminal_modelZ   sD     	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)r0   r
   	HTTPErrorr)   s     r#   r:   zTerminalManager._check_terminale   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_cullerj   s     ' 	.D,F,J,J$,N$$%**H$$e*2  
 *.)CD&(8($1C*C) )% _.&  
 %++---#'   r%   c                "  K   | j                             d| j        | j                   t	          | j                  D ]Q}	 |                     |           d {V  # t          $ r&}| j                             d||           Y d }~Jd }~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 %s: %s)	rK   debugrJ   rG   r4   r0   _cull_inactive_terminal	Exception	exception)r   r    es      r#   rN   zTerminalManager._cull_terminals   s      Q&	
 	
 	
 (( 		 		D2248888888888   ""2	       		 		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.Tr9   )r0   KeyErrorrK   rS   r   hasattrr   r   rG   inttotal_secondsrL   r<   )r   r    r!   dt_nowdt_inactiveis_time
inactivitys          r#   rT   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    
  ptywclientsr	   c                ,    t                      |_        dS )zThe pre-pty read hook.N)r   r   )r   rb   s     r#   pre_pty_read_hookz!TerminalManager.pre_pty_read_hook   s    $*HH!!!r%   )r   r   r   r   )r    r&   r   r   )r   r+   )F)r    r&   r5   r6   r   r7   )r   r7   )r    r&   r   r7   )rb   r	   r   r7   )__name__
__module____qualname____doc__rH   rF   r   rG   rM   rJ   r$   r*   r4   r<   rA   r   r:   r   rN   rT   rd   __classcell__)r>   s   @r#   r   r      si       BB#G	1    Gr  M   - - - -         3 3 3 3	
 	
 	
 	
F F F F
( ( ( (4   $7 7 7 7(- - - - - - - -r%   r   )rh   
__future__r   typingtdatetimer   jupyter_server._tzr   r   jupyter_server.prometheusr   terminado.managementr   r	   tornador
   tornado.ioloopr   r   	traitletsr   traitlets.configr    TERMINAL_CURRENTLY_RUNNING_TOTALr   Dictr&   Anyr   r   r   r%   r#   <module>rx      s-    # " " " " "           0 0 0 0 0 0 0 0 - - - - - - A A A A A A A A       3 3 3 3 3 3 3 3       0 0 0 0 0 08	sAEzS- S- S- S- S-)+; S- S- S- S- S-r%   