o
    Nrf                     @   s   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Zd dlZd dl	Z
d dlZd dlZddlmZ ddlmZ ejjZG dd dejZG dd	 d	ejjZG d
d dejjZG dd deZdS )    N   )	constants   )BaseHTTPAdapterc                       sT   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
  ZS )	SSHSocketc                    sj   t  tjtj || _d | _d | _d| jv r!| jd\| _| _d| jv r0| jd\| _| _d | _	d S )N:@)
super__init__socketAF_INETSOCK_STREAMhostportusersplitproc)selfr   	__class__ a/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/docker/transport/sshconn.pyr
      s   


zSSHSocket.__init__c                 K   s   dg}| j r|d| j g }| jr|d| jg }|d| jdg }d }tjs*dd }|}ttj}|dd  |d	d  t	j
||t	jt	j|d
| _d S )Nsshz-lz-pz--docker system dial-stdioc                   S   s   t  t jt j d S N)signalSIGINTSIG_IGNr   r   r   r   f.   s   zSSHSocket.connect.<locals>.fZLD_LIBRARY_PATHZSSL_CERT_FILE)envstdoutstdin
preexec_fn)r   r   r   r   ZIS_WINDOWS_PLATFORMdictosenvironpop
subprocessPopenPIPEr   )r   kwargsargsZpreexec_funcr   r   r   r   r   connect"   s(   
zSSHSocket.connectc                 C   s6   | j r| j jjrtd| j j|}| j j  |S Nz<SSH subprocess not initiated.connect() must be called first.)r   r!   closed	Exceptionwriteflush)r   dataZwrittenr   r   r   _write?   s
   zSSHSocket._writec                 C   s   |  | d S r   r3   r   r2   r   r   r   sendallG   s   zSSHSocket.sendallc                 C   s
   |  |S r   r4   r5   r   r   r   sendJ   s   
zSSHSocket.sendc                 C   s   | j std| j j|S r-   )r   r/   r    read)r   nr   r   r   recvM   s   zSSHSocket.recvc                 C   s    | j s|   | | j j_| j jS r   )r   r,   r    Zchannel)r   moder   r   r   makefileS   s   
zSSHSocket.makefilec                 C   s<   | j r| j jjr
d S | j jd | j j  | j   d S )Ns   

)r   r!   r.   r0   r1   	terminater   r   r   r   closeZ   s
   zSSHSocket.close)__name__
__module____qualname__r
   r,   r3   r6   r7   r:   r<   r?   __classcell__r   r   r   r   r      s    r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )SSHConnectionN<   c                    s&   t  jd|d || _|| _|| _d S )N	localhost)timeout)r	   r
   ssh_transportrG   ssh_host)r   rH   rG   r   r   r   r   r
   c   s   
zSSHConnection.__init__c                 C   sP   | j r| j  }|| j |d nt| j}|| j |  || _d S )Nr   )	rH   Zopen_session
settimeoutrG   Zexec_commandr   rI   r,   sock)r   rK   r   r   r   r,   k   s   


zSSHConnection.connect)NrE   N)r@   rA   rB   r
   r,   rC   r   r   r   r   rD   b   s    rD   c                       s2   e Zd ZdZd fdd	Zdd Zd	d
 Z  ZS )SSHConnectionPoolr   NrE   
   c                    s6   t  jd||d d | _|| _|r| | _|| _d S )NrF   )rG   maxsize)r	   r
   rH   rG   get_transportrI   )r   
ssh_clientrG   rN   r   r   r   r   r
   {   s   

zSSHConnectionPool.__init__c                 C   s   t | j| j| jS r   )rD   rH   rG   rI   r>   r   r   r   	_new_conn   s   zSSHConnectionPool._new_connc              
   C   sx   d }z| j j| j|d}W n( ty! } ztj| d|d }~w tjy5   | jr3tj	| dd Y nw |p;| 
 S )N)blockrG   zPool is closed.z>Pool reached maximum size and no more connections are allowed.)poolgetrR   AttributeErrorurllib3
exceptionsClosedPoolErrorqueueEmptyEmptyPoolErrorrQ   )r   rG   connZaer   r   r   	_get_conn   s"   	zSSHConnectionPool._get_conn)NrE   rM   N)r@   rA   rB   schemer
   rQ   r]   rC   r   r   r   r   rL   x   s
    
rL   c                       sb   e Zd Zejjjg d Zdejej	df fdd	Z
dd Zdd	 ZdddZ fddZ  ZS )SSHHTTPAdapter)poolsrG   rP   
ssh_paramsmax_pool_sizerE   Fc                    sj   d | _ |s| | |   || _|dr|tdd  | _|| _|| _t|dd d| _	t
   d S )Nzssh://c                 S   s   |   S r   )r?   )pr   r   r   <lambda>   s    z)SSHHTTPAdapter.__init__.<locals>.<lambda>)dispose_func)rP   _create_paramiko_client_connectrI   
startswithlenrG   rb   RecentlyUsedContainerr`   r	   r
   )r   base_urlrG   pool_connectionsrb   Z	shell_outr   r   r   r
      s   

zSSHHTTPAdapter.__init__c                 C   s@  t dt j t | _tj	|}|j
|j|jd| _tjd}tj|rt }t|}|| W d    n1 sBw   Y  ||j
}d|v r[t|d | jd< d|v rf|d | jd< |jd u rvd|v rv|d | jd< |jd u rd|v r|d | jd	< d
|v r|d
 | jd< | j  | jt  d S )Nparamiko)hostnamer   usernamez~/.ssh/configZproxycommandrK   rn   r   r   ro   ZidentityfileZkey_filename)logging	getLoggersetLevelWARNINGrm   Z	SSHClientrP   urllibparseurlparsern   r   ro   ra   r$   path
expanduserexistsZ	SSHConfigopenlookupZProxyCommandZload_system_host_keysZset_missing_host_key_policyZRejectPolicy)r   rk   Zssh_config_fileconfr   Zhost_configr   r   r   rf      s8   



z&SSHHTTPAdapter._create_paramiko_clientc                 C   s"   | j r| j jdi | j d S d S )Nr   )rP   r,   ra   r>   r   r   r   rg      s   zSSHHTTPAdapter._connectNc                 C   s   | j st| j | j| j| jdS | jj7 | j|}|r%|W  d    S | j r1| j  s1| 	  t| j | j| j| jd}|| j|< W d    |S 1 sMw   Y  |S )N)rP   rG   rN   r   )
rP   rL   rG   rb   rI   r`   lockrT   rO   rg   )r   urlproxiesrS   r   r   r   get_connection   s2   

zSSHHTTPAdapter.get_connectionc                    s"   t    | jr| j  d S d S r   )r	   r?   rP   r>   r   r   r   r?      s   
zSSHHTTPAdapter.closer   )r@   rA   rB   requestsadaptersHTTPAdapter	__attrs__r   ZDEFAULT_NUM_POOLSZDEFAULT_MAX_POOL_SIZEr
   rf   rg   r   r?   rC   r   r   r   r   r_      s    
r_   )rp   r$   rY   r   r   r'   urllib.parsert   rm   Zrequests.adaptersr   rV   Zurllib3.connection r   Zbasehttpadapterr   _collectionsrj   r   
connectionHTTPConnectionrD   connectionpoolHTTPConnectionPoolrL   r_   r   r   r   r   <module>   s$    N'