o
    ç÷¡g(  ã                
   @   sž   d dl Z d dlZd dlZd dlmZ d dlZd dlZd\ZZzd dlZW n ey8 Z	 ze	ZW Y dZ	[	ndZ	[	ww d dl
mZ d dlmZ G dd„ deƒZdS )é    N)Úselect)NN)ÚProxyCommandFailure)ÚClosingContextManagerc                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZ	edd„ ƒZ
dd„ ZdS )ÚProxyCommandaª  
    Wraps a subprocess running ProxyCommand-driven programs.

    This class implements a the socket-like interface needed by the
    `.Transport` and `.Packetizer` classes. Using this class instead of a
    regular socket makes it possible to talk with a Popen'd command that will
    proxy traffic between the client and a server hosted in another machine.

    Instances of this class may be used as context managers.
    c                 C   s@   t du rt‚t |¡| _t j| jt jt jt jdd�| _d| _dS )a  
        Create a new CommandProxy instance. The instance created by this
        class can be passed as an argument to the `.Transport` class.

        :param str command_line:
            the command that should be executed and used as the proxy.
        Nr   )ÚstdinÚstdoutÚstderrÚbufsize)	Ú
subprocessÚsubprocess_import_errorÚshlexÚsplitÚcmdÚPopenÚPIPEÚprocessÚtimeout)ÚselfÚcommand_line© r   ú9/usr/local/lib/python3.10/dist-packages/paramiko/proxy.pyÚ__init__3   s   û
zProxyCommand.__init__c              
   C   sF   z| j j |¡ W t|ƒS  ty" } z
td | j¡|jƒ‚d}~ww )zº
        Write the content received from the SSH client to the standard
        input of the forked command.

        :param str content: string to be sent to the forked command
        ú N)	r   r   ÚwriteÚIOErrorr   Újoinr   ÚstrerrorÚlen)r   ÚcontentÚer   r   r   ÚsendG   s   ú€ûzProxyCommand.sendc           
   
   C   sø   zWd}t   ¡ }t|ƒ|k rUd}| jdur(t   ¡ | }|| jkr#t ¡ ‚| j| }t| jjgg g |ƒ\}}}|rO|d | jjkrO|t | jj 	¡ |t|ƒ ¡7 }t|ƒ|k s|W S  tjyf   |re| Y S ‚  t
y{ }	 z
td | j¡|	jƒ‚d}	~	ww )zÎ
        Read from the standard output of the forked program.

        :param int size: how many chars should be read

        :return: the string of bytes read, which may be shorter than requested
        ó    Nr   r   )Útimer   r   Úsocketr   r   r   ÚosÚreadÚfilenor   r   r   r   r   )
r   ÚsizeÚbufferÚstartÚselect_timeoutÚelapsedÚrÚwÚxr   r   r   r   ÚrecvX   s2   


ÿö€ÿzProxyCommand.recvc                 C   s   t  | jjtj¡ d S ©N)r$   Úkillr   ÚpidÚsignalÚSIGTERM©r   r   r   r   Úclosey   s   zProxyCommand.closec                 C   s   | j jd uS r0   )r   Ú
returncoder5   r   r   r   Úclosed|   s   zProxyCommand.closedc                 C   s   | j S r0   )r8   r5   r   r   r   Ú_closed€   s   zProxyCommand._closedc                 C   s
   || _ d S r0   )r   )r   r   r   r   r   Ú
settimeout…   s   
zProxyCommand.settimeoutN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r/   r6   Úpropertyr8   r9   r:   r   r   r   r   r   '   s    !

r   )r$   r   r3   r   r#   r"   r
   r   ÚImportErrorr   Úparamiko.ssh_exceptionr   Úparamiko.utilr   r   r   r   r   r   Ú<module>   s    €ÿ