
    
si\                     \    d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ  G d d          ZdS )    N)Optionalc                       e Zd ZdZddedefdZd Zdd	edee         d
efdZ	dded
efdZ
d	eded
efdZd
efdZd Zd ZdS )ShellSessionz=
    Manages a persistent shell (zsh) session using pty.
    /bin/zsh      @
shell_pathtimeoutc                     || _         || _        d | _        d | _        d | _        d| _        d| _        |                                  d S )N    __BUTLER_SHELL_PROMPT__)r   r	   	master_fdslave_fdprocessbufferprompt_marker_start)selfr   r	   s      0/root/projects/butler/slack_bot/shell/session.py__init__zShellSession.__init__   sE    $6r   c                 P   t          j                    \  | _        | _        t	          j        | j        g| j        | j        | j        t          j        di t          j	        | j
         ddd          | _        t          j        | j                   |                                  dS )zStarts the shell process.T
xterm)PS1TERM)stdinstdoutstderr
preexec_fn	close_fdsenvN)ptyopenptyr   r   
subprocessPopenr   ossetsidenvironr   r   close_read_until_promptr   s    r   r   zShellSession._start   s    (+% "'_-==yQ2:Q);&?&?&?QQQ	
 	
 	
 	 	!!!!!r   Ncmdreturnc                    |                                  s|                                  t          j        | j        |dz                       d                     |                     |p| j                  }|                     ||          }|S )z<
        Executes a command and returns the output.
        r   utf-8)	is_aliver   r%   writer   encoder)   r	   _clean_output)r   r+   r	   outputclean_outputs        r   executezShellSession.execute-   s     }} 	KKMMM 	#*!4!4W!=!=>>> (()@DLAA ))#v66r          @c                    d}t          j                     }	 t          j        | j        gg g d          \  }}}| j        |v rP	 t          j        | j        d          }|snN||z  }| j                                        |v rn-n# t          $ r Y n w xY wt          j                     |z
  |k    rn|                    dd          S )z9Reads from master_fd until prompt is detected or timeout.r   Tg?i   r.   replace)errors)	timeselectr   r%   readr   r1   OSErrordecode)r   r	   r3   
start_timer_chunks          r   r)   zShellSession._read_until_promptA   s    Y[[
	mT^$4b"cBBGAq!~""GDND99E  eOF )0022f<< =    E y{{Z''11)	, }}WY}777s   B  B 
BB
raw_outputc                 v   t          j        d          }|                    d|          }|                    | j        d                                          }|                                }|r&|                                |d         v r
|dd         }d                    |                                          S )z@Removes echo, prompt, and ANSI escape sequences from raw output.z%\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]) r      Nr   )recompilesubr8   r   strip
splitlinesjoin)r   r+   rC   ansi_escaper3   liness         r   r2   zShellSession._clean_output^   s     j!IJJZ00  2B77==?? !!## 	SYY[[E!H,,!""IEyy%%'''r   c                 8    | j                                         d u S N)r   pollr*   s    r   r/   zShellSession.is_aliven   s    |  ""d**r   c                     | j         r2| j                                          | j                                          | j        rt	          j        | j                   dS dS )zTerminates the shell.N)r   	terminatewaitr   r%   r(   r*   s    r   r(   zShellSession.closeq   s`    < 	 L""$$$L> 	%HT^$$$$$	% 	%r   c                 .    |                                   d S rP   )r(   r*   s    r   __del__zShellSession.__del__y   s    

r   )r   r   rP   )r6   )__name__
__module____qualname____doc__strfloatr   r   r   r5   r)   r2   boolr/   r(   rV    r   r   r   r   	   s         3 e    " " ", 3 % C    (8 8% 8# 8 8 8 8:( (# (# ( ( ( ( +$ + + + +% % %    r   r   )	r%   r!   r;   r:   r#   rG   typingr   r   r^   r   r   <module>r`      s    				 



       				      q q q q q q q q q qr   