
    Xh                        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j0                  Zej4                  eej8                  f   Z G d dee      Zy)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.c                     | j                   di |\  }}t               |_        | j                  |      }t        j                          | j                          |S )zCreate a new terminal. )new_named_terminalr   last_activityget_terminal_modelRUNNING_TOTALinc_initialize_culler)selfkwargsnametermmodels        \/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server_terminals/terminalmanager.pycreatezTerminalManager.create1   sT    ,T,,6v6
d $X''-!    c                $    | j                  |      S )zGet terminal 'name'.)r   r   r   s     r    getzTerminalManager.get?   s    &&t,,r"   c                    | j                   D cg c]  }| j                  |       }}t        j                  t	        |             |S c c}w )z$Get a list of all running terminals.)	terminalsr   r   setlen)r   r   modelss      r    listzTerminalManager.listC   sC    <@NNKD$))$/KK 	#f+&	 Ls   A	c                   K   | j                  |       t        | 	  ||       d{    t        j	                          y7 w)zTerminate terminal 'name'.forceN)_check_terminalsuper	terminater   dec)r   r   r.   	__class__s      r    r1   zTerminalManager.terminateK   s@     T"gE222 		 	3s   &AAAc                ~   K   t        | j                        }|D ]  }| j                  |d       d{     y7 w)zTerminate all terminals.Tr-   N)r+   r'   r1   )r   termsr   s      r    terminate_allzTerminalManager.terminate_allT   s<     T^^$ 	3D..T.222	32s   1=;=c                r    | 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   r   r   s      r    r   z"TerminalManager.get_terminal_modelZ   s;     	T"~~d#&t'9'9:
 	
r"   c                R    || j                   vrt        j                  dd|z        y)z9Check a that terminal 'name' exists and raise 404 if not.i  zTerminal not found: %sN)r'   r
   	HTTPErrorr$   s     r    r/   zTerminalManager._check_terminale   s*    t~~%--%=%DEE &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   _s     r    r   z"TerminalManager._initialize_cullerj   s     ''D,F,F,J$$,NN$%%*HH$$e**22
 *.)C)CD&(8(($1C1C*C)% _..&&
 %%++-#' r"   c                @  K   | j                   j                  d| j                  | j                         t	        | j
                        D ]  }	 | j                  |       d {     y 7 # t        $ r'}| j                   j                  d||       Y d }~Md }~ww xY ww)NzCPolling every %s seconds for terminals inactive for > %s seconds...zVThe following exception was encountered while checking the activity of terminal %s: %s)	r@   debugr?   r<   r+   r'   _cull_inactive_terminal	Exception	exception)r   r   es      r    rC   zTerminalManager._cull_terminals   s     Q&&	
 ( 		D224888		8 ""2	 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.Tr-   )r'   KeyErrorr@   rH   r   hasattrr   r   r<   inttotal_secondsrA   r1   )r   r   r   dt_nowdt_inactiveis_time
inactivitys          r    rI   z'TerminalManager._cull_inactive_terminal   s     	>>$'D 	2D$:L:LM4)XF 4#5#55K!Id6P6P$QQG !:!:!<=
  LdT^ nnTn666  *	  		 7s4   CC B3CCC	CCCCc                "    t               |_        y)zThe pre-pty read hook.N)r   r   )r   ptywclientss     r    pre_pty_read_hookz!TerminalManager.pre_pty_read_hook   s    $*H!r"   )r   zt.AnyreturnMODEL)r   strrZ   r[   )rZ   zlist[MODEL])F)r   r\   r.   boolrZ   None)rZ   r^   )r   r\   rZ   r^   )rX   r	   rZ   r^   )__name__
__module____qualname____doc__r=   r;   r   r<   rB   r?   r!   r%   r+   r1   r6   r   r/   r   rC   rI   rY   __classcell__)r3   s   @r    r   r      s{    B#	1  rM-3	
F
(4$7(-r"   r   )rb   
__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>rr      s]    #   0 - A  3  088	sAEEzS-)+; S-r"   