
    tf                        d 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mZmZmZ ddlmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZ ddlmZ ddl m!Z!m"Z"m#Z# dd	l$m%Z%  G d
 dej&                  Z'd Z(d Z)d Z*d Z+d Z, G d d          Z- G d dej.                  Z/ e0e/de/j1                    G d dej2                  Z2 G d dej3                  Z4e5dk    r e(             dS dS )z0
Implementation module for the I{cftp} command.
    N)ListOptionalTextIOUnion)connectdefaultoptions)channelcommon
connectionfiletransfer)deferreactorstdioutils)basic)failurelogusage)FilePathc                       e Zd ZU dZdZg dg dg dg dgZeeeee	e
f                                    ed<    ej        dd	i ej                     ej        d
          g          ZddZdS )ClientOptionszUsage:   cftp [options] [user@]host
         cftp [options] [user@]host[:dir[/]]
         cftp [options] [user@]host[:file [localfile]]
zncftp is a client for logging into a remote machine and executing commands to send and receive file information)
buffersizeBi   z0Size of the buffer to use for sending/receiving.)	batchfilebNz-File to read commands from, or '-' for stdin.)requestsR   z6Number of requests to make before waiting for a reply.)	subsystemssftpz'Subsystem/server program to connect to.optParametersr   z,Size of send/receive buffer (default: 32768)z
local file)descr)descriptionsextraActionsNc                     d| d<   d|v r7|                     dd          \  }| d<   | d                             d           || d<   || d<   d S )N 
remotePath:   /host	localPath)splitrstrip)selfr-   r.   s      Y/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/scripts/cftp.py	parseArgszClientOptions.parseArgs5   sd    \$;;'+zz#q'9'9$D$|$%%c***V%[    N)__name__
__module____qualname__synopsislongdescr#   r   r   r   strint__annotations__r   CompletionsCompleteUserAtHostCompleteFilescompDatar3    r4   r2   r   r      s         H
	B  	WVVQQQVVVMMM	<M4XeCHo678    !u "$RS$E$&&El333
  H& & & & & &r4   r   c                  B   t           j        dd          } d| v r0|                     d          }| ||dz            | z   } | |dz   |dz   = t                      }	  |j        |            nB# t
          j        $ r0}t          d|z             t          j        d           Y d }~nd }~ww xY w|d         r7t           j	        }t          j        t           j                   |t           _	        nt          j                     t          |           t          j                     d S )Nr+   z-l      z	ERROR: %sr   )sysargvindexr   parseOptionsr   
UsageErrorprintexitstdoutr   startLoggingstderrdiscardLogs	doConnectr   run)argsir	   urealouts        r2   rR   rR   >   s    8ABB<Dt||JJtAAI%QQooGT""""   kAo u~ *$$$

gKMMMMMs   A) )B(8&B##B(c                      da 	 t          j                     n# t          $ r Y nw xY wt	          j        t          j                                )NrD   )
exitStatusr   stopBaseExceptionr   errr   FailurerB   r4   r2   handleErrorr]   T   sT    J   GGO	s    
%%c                    d| d         v r%| d                              dd          \  | d<   | d<   | d         }| d         st          j                    | d<   | d         sd| d<   nt          | d                   | d<   | d         }| d         }t	                      }| |_        t          j        }t          j        | d         | |          }t          j	        ||| ||          
                    t                     d S )N@r-   r+   userport   )r/   getpassgetuserr<   SSHConnectionr	   r   verifyHostKeySSHUserAuthClientr   
addErrback_ebExit)r	   r-   ra   connvhkuaos         r2   rQ   rQ   _   s    
gfo+26?+@+@a+H+H(6?D6? ,!/++6? /gfo..6?D6?D??DDL

C

#GFOWd
C
CCOD$c22==gFFFFFr4   c                     t          | j        d          r| j        j        }nt          |           }t          |           	 t	          j                     d S # t          $ r Y d S w xY w)Nvalue)hasattrrn   r;   rK   r   rY   rZ   )fr!   s     r2   ri   ri   r   sm    qw   GMFF	!HHH   s   A 
A%$A%c                      d S r5   rB   )rS   s    r2   _ignorerr   ~   s    Dr4   c                       e Zd Zd Zd ZdS )FileWrapperc                     || _         d| _        |                    dd           |                                | _        d S )N        r   rD   )rp   totalseektellsizer1   rp   s     r2   __init__zFileWrapper.__init__   s4    
	q!FFHH			r4   c                 ,    t          | j        |          S r5   )getattrrp   )r1   attrs     r2   __getattr__zFileWrapper.__getattr__   s    tvt$$$r4   N)r6   r7   r8   r|   r   rB   r4   r2   rt   rt      s2          % % % % %r4   rt   c                      e Zd ZeZdZdZeZd@dZd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdAdZd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d  Z$dBd"Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4e4Z5d2 Z6d3 Z7d4 Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z=d: Z>d; Z?d< Z@d= ZAd> ZBd? ZCdS )CStdioClientzcftp>    
Nc                 H    || _         d| _        || _        | rdpd| _        d S )Nr(   r+   r   )clientcurrentDirectoryfileuseProgressBar)r1   r   rp   s      r2   r|   zStdioClient.__init__   s1     "	#$u{0qr4   c                 j    | j                             d                              | j                   d S )Nr(   )r   realPathaddCallback_cbSetCurDirr1   s    r2   connectionMadezStdioClient.connectionMade   s/    R  ,,T->?????r4   c                 <    || _         |                                  d S r5   )r   _newLiner1   paths     r2   r   zStdioClient._cbSetCurDir   s     $r4   c                     t          |t                    r|                    d          }| j                            |          S )Nutf-8)
isinstancer;   encode	transportwrite)r1   msgs     r2   _writeToTransportzStdioClient._writeToTransport   s;    c3 	&**W%%C~##C(((r4   c                 
   | j         j        j        rd S t          |t                    r|                    d          }t          j        d|z             |                                }|s| 	                                 d S | j
        r'|                    d          rd| _        |dd          }nd| _        |                     |          }|6|                    | j                   |                    | j                   d S d S )Nr   zgot line %s-r+   r   )r   r   localClosedr   bytesdecoder   r   lstripr   r   
startswithignoreErrors_dispatchCommandr   
_cbCommandrh   
_ebCommand)r1   lineds      r2   lineReceivedzStdioClient.lineReceived   s    ; , 	FdE"" 	(;;w''D$%%%{{}} 	MMOOOF9 	"-- 	" !D8DD !D!!$''=MM$/***LL))))) =r4   c                 6   d|v r.|                     dd          \  }}|                                }n|d}}|                    d          r*| j        }|dd          dz   |z                                   }n?|                                }t          j        d|z             t          | d|z  d           }|t          j
        ||          S d|z  }|                     t          j        t          |                               |                                  d S )N r+   r(   !zlooking up cmd %szcmd_%szNo command called `%s')r/   r   r   cmd_EXECstripupperr   r   r~   r   maybeDeferredr   r   r\   NotImplementedErrorr   )r1   r   commandrestrp   errMsgs         r2   r   zStdioClient._dispatchCommand   s   $;; JJsA..MGT;;==DD "TGc"" 	8AABBK#%,3355DDmmooGG''1222h0$77A=&q$///-9FOOGO,?,G,GHHIIIMMOOOOOr4   c                    t          j        |           |                    t          t          j        t          t                    }|t          k    r*|                     | 	                    d                     d S |t          j        k    r2d|j
        j        |j
        j        fz  }|                     |           d S |t          t          fv r2d|j
        j        |j
        j        fz  }|                     |           d S d S )Nr(   zremote error %i: %s
zlocal error %i: %s
)r   r   trapr   r   	SFTPErrorOSErrorIOErrorr   cmd_HELPrn   codemessageerrnostrerror)r1   rp   er   s       r2   _printFailurezStdioClient._printFailure   s    


FF&(>QQ###""4==#4#455555,(((,ago/NNF""6*****7G$$$+qw}ag>N.OOF""6***** %$r4   c                 n   | j         j        j        rd S |                     | j                   d| _        | j        ry| j                                        }|s | j         j                                         d S |                     |           | 	                    |
                                           d S d S )Nr   )r   r   r   r   psr   r   readlineloseConnectionr   r   )r1   ls     r2   r   zStdioClient._newLine   s    ; , 	Ftw'''9 	-	""$$A -%4466666&&q)))!!!'')),,,,,	- 	-r4   c                    |it          |t                    r|                    d          }|                     |           |                    d          s|                     d           |                                  d S )Nr   r   )r   r;   r   r   endswithr   )r1   results     r2   r   zStdioClient._cbCommand   sx    &#&& 0w//""6***??5)) .&&u---r4   c                     |                      |           | j        r%| j        s| j        j                                         |                                  d S r5   )r   r   r   r   r   r   r   r{   s     r2   r   zStdioClient._ebCommand   sR    19 	3T. 	3K!00222r4   c                 X   |                      |          \  }}|                    d          s|dz  }|r%t          j                            | j        |          pd}| j                            |          }|                    | j	                   |
                    | j                   |S )Nr,   r(   )_getFilenamer   osr   joinr   r   openDirectoryr   _cbCdrh   r   )r1   r   r   newPathr   s        r2   cmd_CDzStdioClient.cmd_CD   s    &&t,,
d}}S!! 	CKDD27<<(=tDDJK%%g..	dj!!!	T_%%%r4   c                     |                                  | j                            |j                  }|                    | j                   |S r5   )closer   r   namer   	_cbCurDir)r1   	directoryr   s      r2   r   zStdioClient._cbCd  sB    K  00	dn%%%r4   c                     || _         d S r5   r   r   s     r2   r   zStdioClient._cbCurDir  s     $r4   c                     |                     d d          \  }}|                     |          \  }}t          |          }| j                            |          }|                    | j        ||           |S )Nr+   )grpr/   r   r<   r   getAttrsr   _cbSetUsrGrp)r1   r   r   r   r   s        r2   	cmd_CHGRPzStdioClient.cmd_CHGRP
  p    JJtQ''	T&&t,,
d#hhK  &&	d'3777r4   c                     |                     d d          \  }}|                     |          \  }}t          |d          }| j                            |d|i          }|                    t                     |S )Nr+      permissions)r/   r   r<   r   setAttrsr   rr   )r1   r   modr   r   s        r2   	cmd_CHMODzStdioClient.cmd_CHMOD  sp    JJtQ''	T&&t,,
d#qkkK  s';<<	gr4   c                     |                     d d          \  }}|                     |          \  }}t          |          }| j                            |          }|                    | j        ||           |S )Nr+   )usrr   )r1   r   r   r   r   s        r2   	cmd_CHOWNzStdioClient.cmd_CHOWN  r   r4   c                     i }|d ur|p|d         |d<   |d ur|p|d         |d<   | j                             ||          }|                    t                     |S )Nuidgid)r   r   r   rr   )r1   attrsr   r   r   newr   s          r2   r   zStdioClient._cbSetUsrGrp"  sk    o.3>%,E
o.3>%,E
K  s++	gr4   c                    |                      |          \  }}d|v sd|v rp|r:|                      |          \  }}t          j                            |          sdS nd}|                     |          }|                    | j        |           |S |r|                      |          \  }}n%t          j                            |          d         }t          j	        ||f           t          |dd          }t          | j                                      |          }| j                            |j        t           j        i           }|                    | j        |           |                    | j        |           |S )N*?z'Wildcard get with non-directory target.r4   r+   wbr   )r   r   r   isdir_remoteGlobr   _cbGetMultipler/   r   r   openr   r   childr   openFiler   FXF_READ_cbGetOpenFilerh   
_ebCloseLf)r1   r   remotelocalr   lfr   s          r2   cmd_GETzStdioClient.cmd_GET*  sn   ((..&==C6MM "//55tw}}U++ EDDE   ((AMM$-u555H 	-++D11KE44GMM&))!,E   %q!!-..44V<<K  L,A2FF	d)2...	T_b)))r4   c                 0    |                      d ||          S r5   )_cbGetMultipleNext)r1   filesr   s      r2   r   zStdioClient._cbGetMultipleB  s    &&tUE:::r4   c                    t          |t          j                  r|                     |           nA|r?|                     |           |                    d          s|                     d           |sd S |                    d          d         }t          t          j	        
                    |t          j	                            |          d                   dd          }t          | j                                      |          }| j                            |j	        t"          j        i           }|                    | j        |           |                    | j        |           |                    | j        ||           |S )N
r   r+   r   )r   r   r\   r   r   r   popr   r   r   r   r/   r   r   r   r   r   r   r   r   r   rh   r   addBothr   )r1   resr   r   rp   r   r   r   s           r2   r   zStdioClient._cbGetMultipleNextF  sL   c7?++ 	-s#### 	-""3'''<<%% -&&t,,, 	FIIaLLO"',,ubgmmA&6&6q&9::D!DD-..44Q77K  L,A2FF	d)2...	T_b)))			$)5%888r4   c                 .    |                                  |S r5   )r   )r1   rp   r   s      r2   r   zStdioClient._ebCloseLfX  s    



r4   c                 ^    |                                                     | j        ||          S r5   )r   r   _cbGetFileSize)r1   rfr   s      r2   r   zStdioClient._cbGetOpenFile\  s%    {{}}(()<b"EEEr4   c           
      X   t          j        |d                   s2|                                 |                                 d|j        z  S |d         |_        | j        j        j        j        d         }| j        j        j        j        d         }d|_	        g }g }| j
                                        }t          |          D ]2}	|                     d|||d||          }
|                    |
           3t          j        |d	
          }|                    | j        ||           |S )Nr   zCan't get non-regular file: %srz   r   r   rv   r(   r   r+   fireOnOneErrback)statS_ISREGr   r   rz   r   r   rj   r	   rw   r   secondsrange
_cbGetReadappendr   DeferredListr   
_cbGetDone)r1   r   r	  r   
bufferSizenumRequestsdListchunks	startTimerT   r   dls               r2   r  zStdioClient._cbGetFileSize_  s   |E-011 	>HHJJJHHJJJ3bg==-[*/7E
k+08DL((**	{## 	 	ABFAz9MMALLOOOO:::
tB///	r4   c                 \   d}|D ]a}|dk    r d S ||d         k    rB|                     |          }|                    |||d         f           ||d         |z
  fc S |d         }bt          | j        j        j        j        d                   }|                    |||z   f           ||fS )Nr   eofr+   r   )rH   insertr<   r   r   rj   r	   r  )r1   r  endchunkrT   bufSizes         r2   _getNextChunkzStdioClient._getNextChunkr  s     	 	Ee||eAhLL''a#uQx111U1X^,,,,(CCdk+08FGGsC'M*+++W~r4   c           	          |rt          |t          j                  rit          j        d|z             |}|                    t                     |                    |||z   f          }	||	= |                    |	|df           n|rt          j        dt          |          z             |
                    |           |                    |           t          |          |k    rkt          j        dt          |          |fz             |                    |||z   f          }	||	= |                    |	||t          |          z   f           |xj        t          |          z  c_        | j        r|                     ||           |                     |          }
|
sd S |
\  }}t          j        d|||z   fz             |                    ||          }|                    | j        ||||||           |S )Nzget read err: %sr  zget read data: %iz#got less than we asked for: %i < %izasking for %i -> %i)r   r   r\   r   r   r   EOFErrorrH   r  lenrx   r   rw   r   _printProgressBarr!  	readChunkr  r  )r1   datar	  r   r  startrz   r  reasonrT   r  lengthr   s                r2   r  zStdioClient._cbGetRead  s    	"JtW_55 	"G&-...FKK!!!eUT\233Aq	MM!eU^,,,, 		"G'#d))3444GGENNNHHTNNN4yyD  =TD@QQRRRLL%!6771Ia%T):!;<<<HHD		!HH 	2""2y111""6** 	"F!ME6%(??@@@LL''			$/2r65&)LLLr4   c                     t          j        d           |                                 |                                 | j        r|                     d           d|j         d|j         S )Nzget doner  Transferred  to )r   r   r   r   r   r   r1   ignoredr	  r   s       r2   r  zStdioClient._cbGetDone  se    








 	)""4(((4bg4427444r4   c                    |                      |          \  }}d|v sd|v rl|r>|                      |          \  }}t          j                            | j        |          }nd}t          j        |          }|                     ||          S |r|                      |          \  }}n%t          j                            |          d         }|                     ||          S )a#  
        Do an upload request for a single local file or a globing expression.

        @param rest: Requested command line for the PUT command.
        @type rest: L{str}

        @return: A deferred which fires with L{None} when transfer is done.
        @rtype: L{defer.Deferred}
        r   r   r(   r+   )	r   r   r   r   r   glob_putMultipleFilesr/   _putSingleFile)r1   r   r   r   r   s        r2   cmd_PUTzStdioClient.cmd_PUT  s     ''--t %<<3%<< #0066d&;VDDIe$$E))%888  1#0066u--a0&&uf555r4   c                 6    |                      d|g|d          S )aB  
        Perform an upload for a single file.

        @param local: Path to local file.
        @type local: L{str}.

        @param remote: Remote path for the request relative to current working
            directory.
        @type remote: L{str}

        @return: A deferred which fires when transfer is done.
        NT)single_cbPutMultipleNext)r1   r   r   s      r2   r3  zStdioClient._putSingleFile  s#     &&teWfT&JJJr4   c                 0    |                      d||          S )aV  
        Perform an upload for a list of local files.

        @param files: List of local files.
        @type files: C{list} of L{str}.

        @param remote: Remote path for the request relative to current working
            directory.
        @type remote: L{str}

        @return: A deferred which fires when transfer is done.
        Nr7  )r1   r   r   s      r2   r2  zStdioClient._putMultipleFiles  s     &&tUF;;;r4   Fc                 <   t          |t          j                  r|                     |           nk|rit          |t                    r|                    d          }|                     |           |                    d          s|                     d           d}|re|sc	 |                    d          }t          |d          }n8# t          $ r+ |                     t          j                               d}Y nw xY w|r|c|sdS |r|}n\t          j                            |          d         }t          j                            ||          }t          j        |||f           |                     ||          }	|	                    | j        ||           |	S )a  
        Perform an upload for the next file in the list of local files.

        @param previousResult: Result form previous file form the list.
        @type previousResult: L{str}

        @param files: List of local files.
        @type files: C{list} of L{str}

        @param remotePath: Remote path for the request relative to current
            working directory.
        @type remotePath: L{str}

        @param single: A flag which signals if this is a transfer for a single
            file in which case we use the exact remote path
        @type single: L{bool}

        @return: A deferred which fires when transfer is done.
        r   r   Nr   rbr+   )r   r   r\   r   r;   r   r   r   r  r   rZ   r   r   r/   r   r   r   _putRemoteFiler  r8  )
r1   previousResultr   r)   r6  currentFilelocalStreamr   r   r   s
             r2   r8  zStdioClient._cbPutMultipleNext  s   ( ngo66 	.~.... 	..#.. @!/!6!6w!?!?"">222!**511 .&&u--- 	#K 	###iill";55  # # #""7?#4#4555"#	  	#K 	#  	4 	0FF7==--a0DW\\*d33FGT6:.///V44			$)5*===s   #%C	 	2C>=C>c                 @   t           j                            | j        |          }t          j        t          j        z  t          j        z  }| j        	                    ||i           }|
                    | j        |           |                    | j        |           |S )aW  
        Do an upload request.

        @param localStream: Local stream from where data is read.
        @type localStream: File like object.

        @param remotePath: Remote path for the request relative to current working directory.
        @type remotePath: L{str}

        @return: A deferred which fires when transfer is done.
        )r   r   r   r   r   	FXF_WRITE	FXF_CREAT	FXF_TRUNCr   r   r   _cbPutOpenFilerh   r   )r1   r?  r)   r   flagsr   s         r2   r<  zStdioClient._putRemoteFile  s     d3Z@@&)??,BXXK  33	d);777	T_k222r4   c                    | j         j        j        j        d         }| j        rt          |          }g }g }| j                                        }t          |          D ]2}| 	                    d ||||          }|r|
                    |           3t          j        |d          }	|	                    | j        ||           |	S )Nr   r+   r  )r   r   rj   r	   r   rt   r   r  r  _cbPutWriter  r   r  r   
_cbPutDone)
r1   r	  r   r  r  r  r  rT   r   r  s
             r2   rD  zStdioClient._cbPutOpenFile+  s    k+08D 	!RBL((**	{## 	  	 A  r2vyAAA  Q:::
tB///	r4   c                 r   |                      |          }|\  }}|                    |           |                    |          }	| j        r3|xj        t          |	          z  c_        |                     ||           |	r6|                    ||	          }
|
                    | j	        ||||           |
S d S r5   )
r!  rx   readr   rw   r$  r%  
writeChunkr   rG  )r1   r/  r	  r   r  r  r  r(  rz   r'  r   s              r2   rG  zStdioClient._cbPutWrite:  s    ""6**t
wwt}} 	2HHD		!HH""2y111 	eT**AMM$*BFIFFFHFr4   c                     |                                  |                                  | j        r|                     d           d|j         d|j         S )Nr  r,  r-  )r   r   r   r   r.  s       r2   rH  zStdioClient._cbPutDoneI  sU    







 	)""4(((4bg4427444r4   c                 .    t          j        |           d S r5   )r   chdirr   s     r2   cmd_LCDzStdioClient.cmd_LCDP  s    
r4   c                                            |          \  }}                      |          \  }}t           fd||f          \  }} j                            ||                              t
                    S )Nc                 N    t           j                            j        |           S r5   r   r   r   r   xr1   s    r2   <lambda>z$StdioClient.cmd_LN.<locals>.<lambda>W      bgll4#8!<< r4   )r   mapr   makeLinkr   rr   )r1   r   linkpath
targetpaths   `   r2   cmd_LNzStdioClient.cmd_LNS  s    **400$,,T22
D"<<<<x>T 
  
* {##Hj99EEgNNNr4   c                 ^   g }|                                 }|r|d         r}|d         d         dk    rk|                    d          dd          }|D ]/}|dk    r |j        d           |dk    r |j        d           0|r|d         r|d         d         dk    kd                    |          }|                     |          \  }}|s| j        d	z   }n%t          j                            | j        |          }|                     |          }|	                    | j
        |           |S )
Nr   r   r+   r   verboseaallr   r,   )r/   r  r  r   r   r   r   r   r   r   _cbDisplayFiles)r1   r   r	   optsor   fullPathr   s           r2   cmd_LSzStdioClient.cmd_LS[  sI    zz|| 	*tAw 	*471:#4#488A;;qrr?D * *88"GN9----#XX"GN5)))  	*tAw 	*471:#4#4 xx~~&&t,,
d 	A,s2HHw||D$94@@HX&&	d*G444r4   c                     |                                  d|vrd |D             }d|v rd |D             }nd |D             }|sd S d                    |          S )Nr_  c                 H    g | ]}|d                               d          | S )r      .)r   .0rp   s     r2   
<listcomp>z/StdioClient._cbDisplayFiles.<locals>.<listcomp>w  s-    CCC1QqT__T-B-BCQCCCr4   r]  c                     g | ]
}|d          S )r+   rB   rh  s     r2   rj  z/StdioClient._cbDisplayFiles.<locals>.<listcomp>y      )))aQqT)))r4   c                     g | ]
}|d          S r   rB   rh  s     r2   rj  z/StdioClient._cbDisplayFiles.<locals>.<listcomp>{  rl  r4   r   )sortr   )r1   r   r	   liness       r2   r`  zStdioClient._cbDisplayFilest  s    

CCCCCE))5)))EE))5)))E 	%4::e$$$r4   c                     |                      |          \  }}t          j                            | j        |          }| j                            |i                               t                    S r5   )	r   r   r   r   r   r   makeDirectoryr   rr   r1   r   r   s      r2   	cmd_MKDIRzStdioClient.cmd_MKDIR  sW    &&t,,
dw||D1488{((r22>>wGGGr4   c                     |                      |          \  }}t          j                            | j        |          }| j                            |                              t                    S r5   )	r   r   r   r   r   r   removeDirectoryr   rr   rs  s      r2   	cmd_RMDIRzStdioClient.cmd_RMDIR  sU    &&t,,
dw||D1488{**400<<WEEEr4   c                 4    t          j        d|z             d S )Nzmkdir %sr   systemr   s     r2   
cmd_LMKDIRzStdioClient.cmd_LMKDIR  s    
	*t#$$$$$r4   c                     |                      |          \  }}t          j                            | j        |          }| j                            |                              t                    S r5   )	r   r   r   r   r   r   
removeFiler   rr   rs  s      r2   cmd_RMzStdioClient.cmd_RM  sU    &&t,,
dw||D1488{%%d++77@@@r4   c                 4    t          j        d|z             d S )Nzls %sry  )r1   r   s     r2   cmd_LLSzStdioClient.cmd_LLS  s    
	'D.!!!!!r4   c                                            |          \  }}                      |          \  }}t           fd||f          \  }} j                            ||                              t
                    S )Nc                 N    t           j                            j        |           S r5   rR  rS  s    r2   rU  z(StdioClient.cmd_RENAME.<locals>.<lambda>  rV  r4   )r   rW  r   
renameFiler   rr   )r1   r   oldpathnewpaths   `   r2   
cmd_RENAMEzStdioClient.cmd_RENAME  s    ))$//))$//<<<<w>P
 
 {%%gw77CCGLLLr4   c                 B    | j         j                                         d S r5   )r   r   r   r1   r/  s     r2   cmd_EXITzStdioClient.cmd_EXIT  s    ,,.....r4   c                 x    d| j         j        z  }t          |t                    r|                    d          }|S )NzSFTP version %ir   )r   versionr   r;   r   )r1   r/  r  s      r2   cmd_VERSIONzStdioClient.cmd_VERSION  s9    #dk&99gs## 	.nnW--Gr4   c                     dS )Nae  Available commands:
cd path                         Change remote directory to 'path'.
chgrp gid path                  Change gid of 'path' to 'gid'.
chmod mode path                 Change mode of 'path' to 'mode'.
chown uid path                  Change uid of 'path' to 'uid'.
exit                            Disconnect from the server.
get remote-path [local-path]    Get remote file.
help                            Get a list of available commands.
lcd path                        Change local directory to 'path'.
lls [ls-options] [path]         Display local directory listing.
lmkdir path                     Create local directory.
ln linkpath targetpath          Symlink remote file.
lpwd                            Print the local working directory.
ls [-l] [path]                  Display remote directory listing.
mkdir path                      Create remote directory.
progress                        Toggle progress bar.
put local-path [remote-path]    Put local file.
pwd                             Print the remote working directory.
quit                            Disconnect from the server.
rename oldpath newpath          Rename remote file.
rmdir path                      Remove remote directory.
rm path                         Remove remote file.
version                         Print the SFTP version.
?                               Synonym for 'help'.
rB   r  s     r2   r   zStdioClient.cmd_HELP  s     r4   c                     | j         S r5   r   r  s     r2   cmd_PWDzStdioClient.cmd_PWD  s    $$r4   c                 (    t          j                    S r5   )r   getcwdr  s     r2   cmd_LPWDzStdioClient.cmd_LPWD  s    y{{r4   c                 8    | j          | _         d| j         rdpdz  S )Nz%ssing progess bar.UzNot u)r   r  s     r2   cmd_PROGRESSzStdioClient.cmd_PROGRESS  s(    "&"55$(;(C(NwOOr4   c                     | j                             t          j                              d         }|sd}|rd|g}t	          j        ||d          S t          j        |           dS )zb
        Run C{rest} using the user's shell (or /bin/sh if they do not have
        one).
           z/bin/shz-cr+   )errortooN)_pwdgetpwnamrc   rd   r   getProcessOutputr   rz  )r1   r   shellcmdss       r2   r   zStdioClient.cmd_EXEC  sr    
 	""7?#4#455a8 	E 	$<D)%BBBBIer4   c                    t          j        d|z             t          j                            |          \  }}d|v sd|v rd}nd}|rT|sR| j                            |          }|                    | j        d           |	                    | j
        ||           n5| j                            |          }|                    | j        |           |S )Nzlooking up %sr   r   r+   r   r(   )r   r   r   r   r/   r   r   r   _cbOpenListrh   _ebNotADirectory)r1   rc  headtailr1  r   s         r2   r   zStdioClient._remoteGlob  s    (*+++W]]8,,
d$;;#++DDD 	2 	2))(33AMM$*B///LL.d;;;;))$//AMM$*D111r4   c                 l    g }|                                 }|                    | j        |||           |S r5   )rJ  r  _cbReadFile)r1   r   r1  r   r   s        r2   r  zStdioClient._cbOpenList  s6    NN			$"E9d;;;r4   c                 p    | j                             |          }|                    | j        |           |S r5   )r   r   r   r  )r1   r)  r   r1  r   s        r2   r  zStdioClient._ebNotADirectory  s3    K%%d++	d&---r4   c                    t          |t          j                  s|r2 j        d          |                    fd|D                        n|                    |           |                                }|                    | j        ||           |S |}|                    t                     |
                                 |S )Nr   c                 J    g | ]}t          j         |d                    | S rn  )fnmatch)ri  rp   r1  s     r2   rj  z+StdioClient._cbReadFile.<locals>.<listcomp>  s.    $U$U$U11t9T9T$UQ$U$U$Ur4   )r   r   r\   r   extendrJ  r  r  r   r#  r   )r1   r   matchedFilesr   r1  r   r)  s       `  r2   r  zStdioClient._cbReadFile  s    %11 	  +"t{7++##$U$U$U$U$U$U$UVVVV##E***  AIId&iFFFHFKK!!!OOr4   c                 @    g d}|D ]\  }}||k    r nd||z  z  |z   S )N))l           PB)l        TB)i   @GB)i   MB)i   kB)r+   r   z%.1frB   )r1   rz   _abbrevsfactorsuffixs        r2   _abbrevSizezStdioClient._abbrevSize
  sO    
 
 
 ' 	 	NFFf}} '&00r4   c                     |dk    r<t          |dz            }|d|z  z  }t          |dz            }|d|z  z  }d|||fz  S t          |dz            }|d|z  z  }d||fz  S )Ni  <   z%i:%02i:%02iz	%02i:%02i)r<   )r1   thoursminss       r2   _abbrevTimezStdioClient._abbrevTime  s    t88DMMEAq2v;;DdNA!UD!$444q2v;;DdNA$**r4   c                 v   | j                                         |z
  }|j        }	 t          j        dt          j        dt          j        d                    }n# t          $ r ddg}Y nw xY w|dk    rd}n||z  }|r|j
        |z
  |z  }nd}|j        }|j
        r||j
        z  dz  }	nd}	d|	|                     |          |                     |          |                     |          fz  }
|d	         t          |          t          |
          z   d	z   z
  d
z  }d| | |
 }|                     |           dS )a  
        Update a console progress bar on this L{StdioClient}'s transport, based
        on the difference between the start time of the operation and the
        current time according to the reactor, and appropriate to the size of
        the console window.

        @param f: a wrapper around the file which is being written or read
        @type f: L{FileWrapper}

        @param startTime: The time at which the operation being tracked began.
        @type startTime: L{float}
        4Hr   12345679NP   rv   d   z%3i%% %s %sps %s r+   r   )r   r  rw   structunpackfcntlioctltty
TIOCGWINSZr   rz   r   r  r  r$  r   )r1   rp   r  diffrw   winSizespeedtimeLeftfront
percentagebackspacesr   s                r2   r%  zStdioClient._printProgressBar&  st    |##%%	1	!mD%+a*T*TUUGG 	! 	! 	!RjGGG	!3;;EEDLE 	%/HHH6 	!&.C/JJJ"U##U##X&&	&
 
 !*E

SYY 6 :;sB,u,f,d,,w'''''s   3A A*)A*c                    |                                 }|sdS |d         dv rg }t          |          }	 t          dt          |                    D ]}||         }||d         k    rId                    |          d                    ||dz   d                                                   fc S |dk    rA||= ||         dvrt          d	||                    |                    ||                    |                    ||                    n# t          $ r t          d
          w xY w|                    dd          }t          |          dk    r
|d         dfS |d         |d         fS )aW  
        Parse line received as command line input and return first filename
        together with the remaining line.

        @param line: Arguments received from command line input.
        @type line: L{str}

        @return: Tupple with filename and rest. Return empty values when no path was not found.
        @rtype: C{tupple}
        )r(   r(   r   z'"r+   r(   N\z'"\zbad quote: \zunterminated quote)	r   listr  r$  r   r   
IndexErrorr  r/   )r1   r   retrT   cs        r2   r   zStdioClient._getFilenameP  s    zz|| 	67eC::D7q#d)),, 
, 
,AQADG||!wws||RWWT!a%'']-C-C-J-J-L-LLLLLd G7'11",-FT!W-F-F"G"GG

47++++

47++++
,  7 7 7 !56667jjq!!s88q==q62:q63q6>!s   A;D 2A#D D0r5   )NN)F)Dr6   r7   r8   pwdr  r   	delimiterr   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r!  r  r  r4  r3  r2  r8  r<  rD  rG  rH  rO  r[  rd  r`  rt  rw  r{  r~  r  r  r  cmd_QUITr  r   r  r  r  r   r   r  r  r  r  r  r%  r   rB   r4   r2   r   r      s       D	BIG1 1 1 1@ @ @  ) ) )
* * *(  (
+ 
+ 
+- - -        % % %           0; ; ;  $  F F F  &    <5 5 56 6 6>K K K< < <3 3 3 3j  &    5 5 5  O O O  2% % %H H H
F F F
% % %A A A
" " "M M M/ / / H    6% % %  P P P     "    
      1 1 1 
+ 
+ 
+(( (( ((T#" #" #" #" #"r4   r   zcmd_?c                       e Zd Zd ZdS )re   c                 H    |                      t                                 d S r5   )openChannel
SSHSessionr   s    r2   serviceStartedzSSHConnection.serviceStartedz  s     &&&&&r4   N)r6   r7   r8   r  rB   r4   r2   re   re   y  s#        ' ' ' ' 'r4   re   c                   t    e Zd ZU dZeed<   ej        Zeed<   d Z	d Z
dededd	fd
Zd Zd Zd Zd Zd Zd	S )r  s   sessionr   rO   c                 z   t          j        d| j        z             | j        j        d                             d          rd}nd}| j                            | |t          j        | j        j        d                   d          }|	                    | j
                   |                    t                     d S )Nzsession %s openr    r,   execr+   )	wantReply)r   r   idrj   r	   r   sendRequestr   NSr   _cbSubsystemrh   ri   )r1   foorequestr   s       r2   channelOpenzSSHSession.channelOpen  s    !DG+,,,9[)44S99 	"GG!GI!!'69TY%6{%CDDPQ " 
 
 	
d'(((	Wr4   c                 Z   t          j                    | _        | j                            |            | j        j        | _        d }| j        j        d         r'| j        j        d         }|dk    rt          |          }t          j	        t          | j        |                    | _        d S )Nr   r   )r   FileTransferClientr   makeConnectiondataReceivedrj   r	   r   r   
StandardIOr   )r1   r   rp   fns       r2   r  zSSHSession._cbSubsystem  s    "577""4((( K49[) 	";/BSyyHH%k$+q&A&ABB


r4   r  r'  returnNc                     |t           j        k    rmt          j        dt	          |          z             | j                            |                    dd                     | j                                         d S d S )Nzgot %s stderr datar   backslashreplace)	r   EXTENDED_DATA_STDERRr   r   r$  rO   r   r   flush)r1   r  r'  s      r2   extReceivedzSSHSession.extReceived  sw    
///G(3t994555l Kdkk'3EFFGGGKq 0/r4   c                 `    t          j        d           | j                                         d S )Nzgot eof)r   r   r   loseWriteConnectionr   s    r2   eofReceivedzSSHSession.eofReceived  s,    	
&&(((((r4   c                 h    t          j        d| z             | j                            |            d S )Nzremote side closed %s)r   r   rj   	sendCloser   s    r2   closeReceivedzSSHSession.closeReceived  s4    '$.///	D!!!!!r4   c                 P    	 t          j                     d S # t          $ r Y d S w xY wr5   )r   rY   rZ   r   s    r2   closedzSSHSession.closed  s8    	LNNNNN 	 	 	DD	s    
%%c                 8    | j                                          d S r5   )r   pauseProducingr   s    r2   stopWritingzSSHSession.stopWriting  s    
!!#####r4   c                 8    | j                                          d S r5   )r   resumeProducingr   s    r2   startWritingzSSHSession.startWriting  s    
""$$$$$r4   )r6   r7   r8   r   r   r=   rF   rO   r   r  r  r<   r  r  r  r  r  r  rB   r4   r2   r  r  ~  s         D%ZFF
 
 
	C 	C 	C9 S 9  9 $ 9  9  9  9 v) ) )" " "  $ $ $% % % % %r4   r  __main__)6__doc__r  r  rc   r1  r   r  r  r  rF   r  typingr   r   r   r   twisted.conch.clientr   r   r	   twisted.conch.sshr
   r   r   r   twisted.internetr   r   r   r   twisted.protocolsr   twisted.pythonr   r   r   twisted.python.filepathr   ConchOptionsr   rR   r]   rQ   ri   rr   rt   LineReceiverr   setattrr   re   
SSHChannelr  r6   rB   r4   r2   <module>r     s  
      				 



   



 



 0 0 0 0 0 0 0 0 0 0 0 0 : : : : : : : : : : G G G G G G G G G G G G 9 9 9 9 9 9 9 9 9 9 9 9 # # # # # # . . . . . . . . . . , , , , , ,& & & & &G( & & &D  ,
 
 
G G G&	 	 		 	 	% % % % % % % %f" f" f" f" f"%$ f" f" f"R Wk2 3 3 3' ' ' ' 'J, ' ' '
h% h% h% h% h%# h% h% h%V zCEEEEE r4   