
    3~h'                     p    d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	  G d de	      Z
 G d d	e	      Zy)
z
Tunnel and connection forwarding internals.

If you're looking for simple, end-user-focused connection forwarding, please
see `.Connection`, e.g. `.Connection.forward_local`.
    N)Event)ThreadException)ExceptionHandlingThreadc                   (     e Zd ZdZ fdZd Z xZS )TunnelManagera  
    Thread subclass for tunnelling connections over SSH between two endpoints.

    Specifically, one instance of this class is sufficient to sit around
    forwarding any number of individual connections made to one end of the
    tunnel or the other. If you need to forward connections between more than
    one set of ports, you'll end up instantiating multiple TunnelManagers.

    Wraps a `~paramiko.transport.Transport`, which should already be connected
    to the remote server.

    .. versionadded:: 2.0
    c                 b    t         |           ||f| _        ||f| _        || _        || _        y )N)super__init__local_addressremote_address	transportfinished)self
local_host
local_portremote_hostremote_portr   r   	__class__s          W/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/fabric/tunnels.pyr
   zTunnelManager.__init__    s8     	(*5*K8"     c                 &   g }t        j                   t         j                  t         j                        }|j                  t         j                  t         j
                  d       |j                  d       |j                  | j                         |j                  d       | j                  j                         s	 |j                         \  }}|j                  t         j                  t         j                  d       | j$                  j'                  d| j(                  |      }t+               }t-        |||      }|j/                          |j1                  |       | j                  j                         sg }|D ]P  }|j                  j3                          |j5                          |j7                         }	|	s@|j1                  |	       R |rt9        |      |j;                          y # t        $ r t!        j"                  d       Y nw xY w)N   r   g{Gz?zdirect-tcpip)channelsockr   )socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRsetblockingbindr   listenr   is_setacceptIPPROTO_TCPTCP_NODELAYBlockingIOErrortimesleepr   open_channelr   r   Tunnelstartappendsetjoin	exceptionr   close)
r   tunnelsr   tun_sock
local_addrr   r   tunnel
exceptionswrappers
             r   _runzTunnelManager._run/   s    }}V^^V-?-?@))6+>+>B 			$$$%A--&&('+{{}$*##F$6$68J8JAN nn11 3 3ZG wHG(XNFLLNNN6"3 --&&(6 

  	+FOO!KKM&&(G!!'*	+ !*-- 	

I # 

4 s   <AG. .HH)__name__
__module____qualname____doc__r
   r9   __classcell__r   s   @r   r   r      s    !;r   r   c                   .     e Zd ZdZ fdZd Zd Z xZS )r,   zj
    Bidirectionally forward data between an SSH channel and local socket.

    .. versionadded:: 2.0
    c                 h    || _         || _        || _        d| _        d| _        t
        |           y )Ni   )r   r   r   socket_chunk_sizechannel_chunk_sizer	   r
   )r   r   r   r   r   s       r   r
   zTunnel.__init__t   s3    	 !%"&r   c                    	 d\  }}| j                   j                         st        j                  | j                  | j                  gg g d      \  }}}| j                  |v r1| j                  | j                  | j                  | j                        }| j                  |v r1| j                  | j                  | j                  | j                        }|s|rn| j                   j                         s| j                  j                          | j                  j                          y # | j                  j                          | j                  j                          w xY w)N)NNr   )	r   r$   selectr   r   read_and_writerB   rC   r2   )r   
empty_sock
empty_chanrwxs         r   r9   zTunnel._run|   s	   	%/"J
mm**, --DLL(A2r1M1a99>!%!4!4		4<<1G1G"J <<1$!%!4!4dii1H1H"J  mm**, LL IIOO LL IIOOs   C.D& &6Ec                 f    |j                  |      }t        |      dk(  ry|j                  |       y)z
        Read ``chunk_size`` from ``reader``, writing result to ``writer``.

        Returns ``None`` if successful, or ``True`` if the read was empty.

        .. versionadded:: 2.0
        r   TN)recvlensendall)r   readerwriter
chunk_sizedatas        r   rF   zTunnel.read_and_write   s,     {{:&t9>tr   )r:   r;   r<   r=   r
   r9   rF   r>   r?   s   @r   r,   r,   m   s    &r   r,   )r=   rE   r   r)   	threadingr   invoke.exceptionsr   invoke.utilr   r   r,    r   r   <module>rX      s;        - /Y+ Yx-$ -r   