
    Vh                        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jL                        Z'd Z(d Z)d Z*d Z+d Z, G d d      Z- G d dej\                        Z/ e0e/de/jb                          G d dejd                        Z2 G d dejf                        Z4e5dk(  r e(        yy)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y)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 r,|j                  dd      \  }| d<   | d   j                  d       || d<   || d<   y )N 
remotePath:   /host	localPath)splitrstrip)selfr-   r.   s      J/home/dcms/DCMS/lib/python3.12/site-packages/twisted/conch/scripts/cftp.py	parseArgszClientOptions.parseArgs5   sS    \$;'+zz#q'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QVM	<M4XeCHo678  !u  "$RS$E$$&El3
H&r4   r   c                  .   t         j                  dd  } d| v r'| j                  d      }| ||dz    | z   } | |dz   |dz   = t               }	  |j                  |        |d   r?t         j                  }t        j                  t         j                         |t         _	        nt        j                          t        |       t        j                           y # t
        j                  $ r-}t        d|z         t        j                  d       Y d }~d }~ww xY w)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    88AB<Dt|JJtAA%QQoGT" u~**$
gKKM  kAos   
C D'#DDc                      da 	 t        j                          t	        j
                  t        j                                 # t        $ r Y 3w xY w)NrD   )
exitStatusr   stopBaseExceptionr   errr   FailurerB   r4   r2   handleErrorr]   T   sA    J GGGOO	  s   A   	AAc                    d| d   v r| d   j                  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                  ||| ||      j                  t               y )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(6?D6?!//+6?gfo.6?D6?D?DDL


C

#
#GFOWd
CCOOD$c2==gFr4   c                     t        | j                  d      r| j                  j                  }nt        |       }t        |       	 t	        j
                          y # t        $ r Y y w xY w)Nvalue)hasattrrn   r;   rK   r   rY   rZ   )fr!   s     r2   ri   ri   r   sM    qww GGMMF	!H s   A 	A&%A&c                       y r5   rB   )rS   s    r2   _ignorerr   ~   s    r4   c                       e Zd Zd Zd Zy)FileWrapperc                 n    || _         d| _        |j                  dd       |j                         | _        y )N        r   rD   )rp   totalseektellsizer1   rp   s     r2   __init__zFileWrapper.__init__   s*    
	q!FFH	r4   c                 .    t        | j                  |      S r5   )getattrrp   )r1   attrs     r2   __getattr__zFileWrapper.__getattr__   s    tvvt$$r4   N)r6   r7   r8   r|   r   rB   r4   r2   rt   rt      s    %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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$dAd!Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4e4Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:d6 Z;d7 Z<d8 Z=d9 Z>d: Z?d; Z@d< ZAd= ZBd> ZCy)BStdioClientzcftp>    
Nc                 N    || _         d| _        || _        | xr dxs d| _        y )Nr(   r+   r   )clientcurrentDirectoryfileuseProgressBar)r1   r   rp   s      r2   r|   zStdioClient.__init__   s+     "	#$u{0qr4   c                 l    | j                   j                  d      j                  | j                         y )Nr(   )r   realPathaddCallback_cbSetCurDirr1   s    r2   connectionMadezStdioClient.connectionMade   s%    R ,,T->->?r4   c                 2    || _         | j                          y r5   )r   _newLiner1   paths     r2   r   zStdioClient._cbSetCurDir   s     $r4   c                 z    t        |t              r|j                  d      }| j                  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y t        |t              r|j                  d      }t        j                  d|z         |j                         }|s| j                          y | j                  r|j                  d      rd| _        |dd  }nd| _        | j                  |      }|7|j                  | j                         |j!                  | j"                         y y )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    ;;  ,,dE";;w'D$%{{}MMO99- !D8D !D!!$'=MM$//*LL) r4   c                    d|v r&|j                  dd      \  }}|j                         }n|d}}|j                  d      r&| j                  }|dd  dz   |z   j	                         }n8|j                         }t        j                  d|z         t        | d|z  d       }|t        j                  ||      S d|z  }| j                  t        j                  t        |                   | j                          y )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;;=D "TGc"AABK#%,335DmmoGGG''12h0$7A=&&q$//-9FOOGOO,?,GHIMMOr4   c                 $   t        j                  |       |j                  t        t        j
                  t        t              }|t        k(  r!| j                  | j                  d             y |t        j
                  k(  rAd|j                  j                  |j                  j                  fz  }| j                  |       y |t        t        fv rAd|j                  j                  |j                  j                  fz  }| j                  |       y y )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##""4==#45,(((,aggoo/NNF""6*7G$$+qww}}agg>N>N.OOF""6* %r4   c                    | j                   j                  j                  ry | j                  | j                         d| _        | j                  rr| j                  j                         }|s%| j                   j                  j                          y | j                  |       | j                  |j                                y y )Nr   )r   r   r   r   psr   r   readlineloseConnectionr   r   )r1   ls     r2   r   zStdioClient._newLine   s    ;;  ,,tww'99		""$A%%446&&q)!!!''), r4   c                     |Tt        |t              r|j                  d      }| j                  |       |j	                  d      s| j                  d       | j                          y )Nr   r   )r   r;   r   r   endswithr   )r1   results     r2   r   zStdioClient._cbCommand   sQ    &#&w/""6*??5)&&u-r4   c                     | j                  |       | j                  r0| j                  s$| j                  j                  j                          | j                          y r5   )r   r   r   r   r   r   r   r{   s     r2   r   zStdioClient._ebCommand   s>    199T..KK!!002r4   c                 `   | j                  |      \  }}|j                  d      s|dz  }|xr* t        j                  j	                  | j
                  |      xs d}| j                  j                  |      }|j                  | 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D277<<(=(=tDJKK%%g.	djj!	T__%r4   c                     |j                          | j                  j                  |j                        }|j	                  | j
                         |S r5   )closer   r   namer   	_cbCurDir)r1   	directoryr   s      r2   r   zStdioClient._cbCd  s9    KK  0	dnn%r4   c                     || _         y r5   r   r   s     r2   r   zStdioClient._cbCurDir  s
     $r4   c                     |j                  d d      \  }}| j                  |      \  }}t        |      }| j                  j	                  |      }|j                  | j                  ||       |S )Nr+   )grpr/   r   r<   r   getAttrsr   _cbSetUsrGrp)r1   r   r   r   r   s        r2   	cmd_CHGRPzStdioClient.cmd_CHGRP
  d    JJtQ'	T&&t,
d#hKK  &	d''37r4   c                     |j                  d d      \  }}| j                  |      \  }}t        |d      }| j                  j	                  |d|i      }|j                  t               |S )Nr+      permissions)r/   r   r<   r   setAttrsr   rr   )r1   r   modr   r   s        r2   	cmd_CHMODzStdioClient.cmd_CHMOD  sa    JJtQ'	T&&t,
d#qkKK  s';<	gr4   c                     |j                  d d      \  }}| j                  |      \  }}t        |      }| j                  j	                  |      }|j                  | j                  ||       |S )Nr+   )usrr   )r1   r   r   r   r   s        r2   	cmd_CHOWNzStdioClient.cmd_CHOWN  r   r4   c                     i }|d uxr |xs |d   |d<   |d uxr |xs |d   |d<   | j                   j                  ||      }|j                  t               |S )Nuidgid)r   r   r   rr   )r1   attrsr   r   r   newr   s          r2   r   zStdioClient._cbSetUsrGrp"  sd    o.3>%,E
o.3>%,E
KK  s+	gr4   c                    | j                  |      \  }}d|v sd|v rg|r4| j                  |      \  }}t        j                  j                  |      syd}| j	                  |      }|j                  | j                  |       |S |r| j                  |      \  }}n"t        j                  j                  |      d   }t        j                  ||f       t        |dd      }t        | j                        j                  |      }| j                  j                  |j                  t         j"                  i       }|j                  | j$                  |       |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*  s/   ((.&=C6M"//5tww}}U+D  (AMM$--u5H++D1KE4GGMM&)!,E %q!--.44V<KK  L,A,A2F	d))2.	T__b)r4   c                 (    | j                  d ||      S r5   )_cbGetMultipleNext)r1   filesr   s      r2   r   zStdioClient._cbGetMultipleB  s    &&tUE::r4   c                    t        |t        j                        r| j                  |       n5|r3| j	                  |       |j                  d      s| j	                  d       |sy |j                  d      d   }t        t        j                  j                  |t        j                  j                  |      d         dd      }t        | j                        j                  |      }| j                  j!                  |j                  t"        j$                  i       }|j'                  | j(                  |       |j+                  | j,                  |       |j/                  | j0                  ||       |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  s   c7??+s#""3'<<%&&t,IIaLO"'',,ubggmmA&6q&9:D!D--.44Q7KK  L,A,A2F	d))2.	T__b)			$))5%8r4   c                 &    |j                          |S r5   )r   )r1   rp   r   s      r2   r   zStdioClient._ebCloseLfX  s    

r4   c                 X    |j                         j                  | j                  ||      S r5   )r   r   _cbGetFileSize)r1   rfr   s      r2   r   zStdioClient._cbGetOpenFile\  s#    {{}(()<)<b"EEr4   c           
      ~   t        j                  |d         s/|j                          |j                          d|j                  z  S |d   |_        | j
                  j                  j                  j                  d   }| j
                  j                  j                  j                  d   }d|_	        g }g }| j                  j                         }t        |      D ]*  }	| j                  d|||d||      }
|j                  |
       , t        j                   |d	
      }|j#                  | 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HHJHHJ3bgg==-[[**//77E
kk++0088DLL((*	{# 	ABFAz9MALLO	 :
tB/	r4   c                 D   d}|D ]J  }|dk(  r y ||d   k7  r4|j                  |      }|j                  |||d   f       ||d   |z
  fc S |d   }L t        | j                  j                  j
                  j                  d         }|j                  |||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U1X^,,(C	 dkk++0088FGsC'M*+W~r4   c           	         |rwt        |t        j                        r]t        j                  d|z         |}|j                  t               |j                  |||z   f      }	||	= |j                  |	|df       n|rt        j                  dt        |      z         |j                  |       |j                  |       t        |      |k7  r\t        j                  dt        |      |fz         |j                  |||z   f      }	||	= |j                  |	||t        |      z   f       |xj                  t        |      z  c_        | j                  r| j                  ||       | j                  |      }
|
sy |
\  }}t        j                  d|||z   fz         |j!                  ||      }|j#                  | 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GG&-.FKK!eUT\23Aq	MM!eU^,GG'#d)34GGENHHTN4yD =TD@QQRLL%!671Ia%T):!;<HHD	!H""2y1""6*!ME6%(??@LL'			$//2r65&)Lr4   c                     t        j                  d       |j                          |j                          | j                  r| j	                  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  sR    




""4(bggYd277)44r4   c                    | j                  |      \  }}d|v sd|v rj|r?| j                  |      \  }}t        j                  j                  | j                  |      }nd}t        j
                  |      }| j                  ||      S |r| j                  |      \  }}n"t        j                  j                  |      d   }| j                  ||      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d&;&;VDIIe$E))%88 #006u-a0&&uf55r4   c                 .    | j                  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Jr4   c                 (    | j                  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   c                    t        |t        j                        r| j                  |       nV|rTt        |t              r|j                  d      }| j                  |       |j                  d      s| j                  d       d}|r%|s#	 |j                  d      }t        |d      }|r|s#|sy|r|}nZt        j                  j                  |      d   }t        j                  j                  ||      }t        j                   |||f       | j#                  |      }	|	j%                  | j&                  ||       |	S # t        $ r( | j                  t        j                                d}Y w xY w)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<   ( ngoo6~..#.!/!6!6w!?"">2!**51&&u-K##iil";5 K F77==-a0DWW\\*d3FGGT6:./V4			$))5*=# ! #""7??#45"#s   
D? ?.E0/E0c                 h   t         j                  j                  | j                  |      }t        j
                  t        j                  z  t        j                  z  }| j                  j                  ||i       }|j                  | j                  |       |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33Z@&&)?)??,BXBXXKK  3	d));7	T__k2r4   c                    | j                   j                  j                  j                  d   }| j                  rt        |      }g }g }| j                  j                         }t        |      D ]+  }| j                  d ||||      }|s|j                  |       - t        j                  |d      }	|	j                  | 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    kk++0088DRBLL((*	{# 	 A  r2vyAAQ	  :
tB/	r4   c                 V   | j                  |      }|\  }}|j                  |       |j                  |      }	| j                  r0|xj                  t        |	      z  c_        | j                  ||       |	r3|j                  ||	      }
|
j                  | j                  ||||       |
S y 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}HHD	!H""2y1eT*AMM$**BFIFHr4   c                     |j                          |j                          | j                  r| j                  d       d|j                   d|j                   S )Nr  r,  r-  )r   r   r   r   r.  s       r2   rH  zStdioClient._cbPutDoneI  sF    



""4(bggYd277)44r4   c                 .    t        j                  |       y r5   )r   chdirr   s     r2   cmd_LCDzStdioClient.cmd_LCDP  s    
r4   c                       j                  |      \  }} j                  |      \  }}t         fd||f      \  }} j                  j                  ||      j	                  t
              S )Nc                 X    t         j                  j                  j                  |       S r5   r   r   r   r   xr1   s    r2   <lambda>z$StdioClient.cmd_LN.<locals>.<lambda>W      bggll4#8#8!< r4   )r   mapr   makeLinkr   rr   )r1   r   linkpath
targetpaths   `   r2   cmd_LNzStdioClient.cmd_LNS  si    **40$,,T2
D"<x>T 
* {{##Hj9EEgNNr4   c                 &   g }|j                         }|rn|d   ri|d   d   dk(  r^|j                  d      dd  }|D ]2  }|dk(  r |j                  d       |dk(  s! |j                  d       4 |r|d   r|d   d   dk(  r^dj                  |      }| j	                  |      \  }}|s| j
                  d	z   }n*t        j                  j                  | j
                  |      }| 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[  s    zz|tAw471:#488A;qr?D *8"GNN9-#X"GNN5)	* tAw471:#4 xx~&&t,
d,,s2Hww||D$9$94@HX&	d**G4r4   c                 
   |j                          d|vr$|D cg c]  }|d   j                  d      r| }}d|v r|D cg c]  }|d   	 }}n|D cg c]  }|d   	 }}|sy dj                  |      S c c}w c c}w c c}w )Nr_  r      .r]  r+   r   )sortr   r   )r1   r   r	   rp   liness        r2   r`  zStdioClient._cbDisplayFilest  s    

 %C1QqT__T-BQCEC#()aQqT)E)#()aQqT)E)::e$$ D))s   A6A6A;B c                     | j                  |      \  }}t        j                  j                  | j                  |      }| j
                  j                  |i       j                  t              S r5   )	r   r   r   r   r   r   makeDirectoryr   rr   r1   r   r   s      r2   	cmd_MKDIRzStdioClient.cmd_MKDIR  sR    &&t,
dww||D1148{{((r2>>wGGr4   c                     | j                  |      \  }}t        j                  j                  | j                  |      }| j
                  j                  |      j                  t              S r5   )	r   r   r   r   r   r   removeDirectoryr   rr   rk  s      r2   	cmd_RMDIRzStdioClient.cmd_RMDIR  sP    &&t,
dww||D1148{{**40<<WEEr4   c                 4    t        j                  d|z         y )Nzmkdir %sr   systemr   s     r2   
cmd_LMKDIRzStdioClient.cmd_LMKDIR  s    
		*t#$r4   c                     | j                  |      \  }}t        j                  j                  | j                  |      }| j
                  j                  |      j                  t              S r5   )	r   r   r   r   r   r   
removeFiler   rr   rk  s      r2   cmd_RMzStdioClient.cmd_RM  sP    &&t,
dww||D1148{{%%d+77@@r4   c                 4    t        j                  d|z         y )Nzls %srq  )r1   r   s     r2   cmd_LLSzStdioClient.cmd_LLS  s    
		'D.!r4   c                       j                  |      \  }} j                  |      \  }}t         fd||f      \  }} j                  j                  ||      j	                  t
              S )Nc                 X    t         j                  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  sh    ))$/))$/<w>P
 {{%%gw7CCGLLr4   c                 L    | j                   j                  j                          y r5   )r   r   r   r1   r/  s     r2   cmd_EXITzStdioClient.cmd_EXIT  s    ,,.r4   c                 z    d| j                   j                  z  }t        |t              r|j	                  d      }|S )NzSFTP version %ir   )r   versionr   r;   r   )r1   r/  r  s      r2   cmd_VERSIONzStdioClient.cmd_VERSION  s3    #dkk&9&99gs#nnW-Gr4   c                      y)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    yy{r4   c                 T    | j                    | _         d| j                   xr dxs dz  S )Nz%ssing progess bar.UzNot u)r   r  s     r2   cmd_PROGRESSzStdioClient.cmd_PROGRESS  s.    "&"5"55$(;(;(C(NwOOr4   c                     | j                   j                  t        j                               d   }|sd}|rd|g}t	        j
                  ||d      S t        j                  |       y)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   rr  )r1   r   shellcmdss       r2   r   zStdioClient.cmd_EXEC  sY    
 		""7??#45a8E$<D))%BBIIer4   c                    t        j                  d|z         t        j                  j	                  |      \  }}d|v sd|v rd}nd}|rX|sV| j
                  j                  |      }|j                  | j                  d       |j                  | j                  ||       |S | j
                  j                  |      }|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    (*+WW]]8,
d$;#+DD))(3AMM$**B/LL..d;  ))$/AMM$**D1r4   c                 f    g }|j                         }|j                  | j                  |||       |S r5   )rJ  r  _cbReadFile)r1   r   r1  r   r   s        r2   r  zStdioClient._cbOpenList  s0    NN			$""E9d;r4   c                 t    | j                   j                  |      }|j                  | j                  |       |S r5   )r   r   r   r  )r1   r)  r   r1  r   s        r2   r  zStdioClient._ebNotADirectory  s/    KK%%d+	d&&-r4   c           	         t        |t        j                        s|rL |j                  d      }|j	                  |D cg c]  }t        j
                  |d   |      s|  c}       n|j	                  |       |j                         }|j                  | j                  |||       |S |}|j                  t               |j                          |S c c}w )Nr   r   )r   r   r\   r   extendfnmatchrJ  r  r  r   r#  r   )r1   r   matchedFilesr   r1  rp   r   r)  s           r2   r  zStdioClient._cbReadFile  s    %1"t{{7+##$U11t9TQ$UV##E* AIId&&iFHFKK!OO %Vs   CCc                 B    g d}|D ]  \  }}||kD  s 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
  s>    
 ' 	NFFf}	 '&00r4   c                     |dkD  r4t        |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  sy    t8DMEAq2v;DdNA!UD!$444q2v;DdNA$**r4   c                 x   | j                   j                         |z
  }|j                  }	 t        j                  dt        j                  dt        j                  d            }|dk(  rd}n||z  }|r|j                  |z
  |z  }nd}|j                  }|j                  r||j                  z  dz  }	nd}	d|	| j                  |      | j                  |      | j                  |      fz  }
|d	   t        |      t        |
      z   d	z   z
  d
z  }d| | |
 }| j                  |       y# t        $ r ddg}Y w xY w)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&  sA    ||##%	1	!mmD%++a*TUG 3;EDLE%/HH66!&&.C/JJ"U#U#X&	&
 
 !*E
SY 6 :;sBugfXdV,w'/  	!RjG	!s   9D) )D98D9c                 6   |j                         }|sy|d   dv rg }t        |      }	 t        dt        |            D ]  }||   }||d   k(  r8dj	                  |      dj	                  ||dz   d       j                         fc S |dk(  r0||= ||   dvrt        d	||          |j                  ||          }|j                  ||           	 |j                  dd      }t        |      dk(  r|d   dfS |d   |d   fS # t        $ r t        d
      w xY w)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|7eC:D7q#d), 
,AQADG|!wws|RWWT!a%']-C-J-J-LLLd G7'1",}T!WI-F"GG

47+

47+
, jjq!s8q=q62:q63q6>!  7 !5667s   AD AD D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`  rl  ro  rs  rv  rx  r~  r  cmd_QUITr  r   r  r  r  r   r   r  r  r  r  r  r%  r   rB   r4   r2   r   r      sO   D	BIG1@)
*((
+-%0;$F&<56>K<3j&5O2%H
F
%A
"M/ H6%P "
  1 
+((T#"r4   r   zcmd_?c                       e Zd Zd Zy)re   c                 6    | j                  t                      y 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                   |    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y	)r  s   sessionr   rO   c                    t        j                  d| j                  z         | j                  j                  d   j                  d      rd}nd}| j                  j                  | |t        j                  | j                  j                  d         d      }|j                  | j                         |j                  t               y )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    !DGG+,99[)44S9G!GII!!'699TYY%6%6{%CDPQ " 
 	
d''(	Wr4   c                    t        j                         | _        | j                  j                  |        | j                  j                  | _        d }| j
                  j                  d   r)| j
                  j                  d   }|dk7  rt        |      }t        j                  t        | j                  |            | _        y )Nr   r   )r   FileTransferClientr   makeConnectiondataReceivedrj   r	   r   r   
StandardIOr   )r1   r   rp   fns       r2   r  zSSHSession._cbSubsystem  s    "557""4( KK4499[)"";/BSyH%%k$++q&AB
r4   r  r'  returnNc                     |t         j                  k(  rgt        j                  dt	        |      z         | j
                  j                  |j                  dd             | j
                  j                          y y )Nzgot %s stderr datar   backslashreplace)	r   EXTENDED_DATA_STDERRr   r   r$  rO   r   r   flush)r1   r  r'  s      r2   extReceivedzSSHSession.extReceived  s]    
///GG(3t945l KKdkk'3EFGKKq 0r4   c                 b    t        j                  d       | j                  j                          y )Nzgot eof)r   r   r   loseWriteConnectionr   s    r2   eofReceivedzSSHSession.eofReceived  s    	

&&(r4   c                 j    t        j                  d| z         | j                  j                  |        y )Nzremote side closed %s)r   r   rj   	sendCloser   s    r2   closeReceivedzSSHSession.closeReceived  s&    '$./		D!r4   c                 L    	 t        j                          y # t        $ r Y y w xY wr5   )r   rY   rZ   r   s    r2   closedzSSHSession.closed  s"    	LLN 		s    	##c                 8    | j                   j                          y r5   )r   pauseProducingr   s    r2   stopWritingzSSHSession.stopWriting  s    

!!#r4   c                 8    | j                   j                          y 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  ~  sY    D%ZZFF
	C9 S 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 : : G G 9 9 # . . ,&G(( &D,
G&		% %f"%$$ f"R Wk22 3'J,, '
h%## h%V zE r4   