
    h                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJrJrJrJr  SSKJrJrJr  SSKJrJrJrJr  SSKJrJrJrJr  SSKJr  SSK J!r!J"r"J#r#  SS	K$J%r%   " S
 S\RL                  5      r'S r(S r)S r*S r+S r, " S S5      r- " S S\R\                  5      r/\0" \/S\/Rb                  5         " S S\Rd                  5      r2 " S S\Rf                  5      r4\5S:X  a  \(" 5         gg)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                       \ rS rSr% SrSr/ SQ/ SQ/ SQ/ SQ/r\\\\	\
\4            \S'   \R                  " S	S
0\R                  " 5       \R                   " SS9/S9rSS jrSrg)ClientOptions   zUsage:   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                     SU S'   SU;   a+  UR                  SS5      u  oS'   U S   R                  S5        XS'   X S'   g )N 
remotePath:   /host	localPath)splitrstrip)selfr.   r/   s      a/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/conch/scripts/cftp.py	parseArgsClientOptions.parseArgs5   sM    \$;'+zz#q'9$D|$%%c*V%[     N)__name__
__module____qualname____firstlineno__synopsislongdescr$   r   r   r   strint__annotations__r   CompletionsCompleteUserAtHostCompleteFilescompDatar4   __static_attributes__r7   r6   r3   r   r      s    H
	B  	WQVM	<M4XeCHo678    "$RS$$&l3
H&r6   r   c                  B   [         R                  SS  n SU ;   a%  U R                  S5      nXUS-    U -   n XS-   US-   2	 [        5       n UR                  " U 5        US   (       a@  [         R                  n[        R                  " [         R                  5        U[         l	        O[        R                  " 5         [        U5        [        R                   " 5         g ! [
        R                   a.  n[        SU-  5        [         R                  " S5         S nANS nAff = f)Nr,   z-l      z	ERROR: %sr   )sysargvindexr   parseOptionsr   
UsageErrorprintexitstdoutr   startLoggingstderrdiscardLogs	doConnectr   run)argsir	   urealouts        r3   rV   rV   >   s    88AB<Dt|JJtA%QQoGT" u~**$
gKKM  kAos   
C D0$DDc                      Sq  [        R                  " 5         [        R
                  " [        R                  " 5       5        e ! [         a     N6f = f)NrH   )
exitStatusr   stopBaseExceptionr   errr   Failurer7   r6   r3   handleErrorra   T   sA    J GGGOO	  s   A 
AAc                    SU S   ;   a  U S   R                  SS5      u  U S'   U S'   U S   nU S   (       d  [        R                  " 5       U S'   U S   (       d  SU S'   O[        U S   5      U S'   U S   nU S   n[	        5       nXl        [        R                  n[        R                  " U S   X5      n[        R                  " XXU5      R                  [        5        g )N@r.   r,   userport   )r0   getpassgetuserr@   SSHConnectionr	   r   verifyHostKeySSHUserAuthClientr   
addErrback_ebExit)r	   r.   re   connvhkuaos         r3   rU   rU   _   s    
gfo+26?+@+@a+H(6?D6?!//+6?gfo.6?D6?D?DL


C

#
#GFOW
CCOODc2==gFr6   c                     [        U R                  S5      (       a  U R                  R                  nO[        U 5      n[        U5         [        R
                  " 5         g ! [         a     g f = f)Nvalue)hasattrrr   r?   rO   r   r]   r^   )fr"   s     r3   rm   rm   r   sP    qww  GGMMF	!H s   
A   
A-,A-c                      g r8   r7   )rW   s    r3   _ignorerv   ~   s    r6   c                        \ rS rSrS rS rSrg)FileWrapper   c                 l    Xl         SU l        UR                  SS5        UR                  5       U l        g )N        r   rH   )rt   totalseektellsizer2   rt   s     r3   __init__FileWrapper.__init__   s(    
	q!FFH	r6   c                 .    [        U R                  U5      $ r8   )getattrrt   )r2   attrs     r3   __getattr__FileWrapper.__getattr__   s    tvvt$$r6   )rt   r   r|   N)r9   r:   r;   r<   r   r   rF   r7   r6   r3   rx   rx      s    %r6   rx   c                      \ rS rSr\rSrSr\rSAS jr	S r
S rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rSBS jrS rS rS rS rS rS rS r S r!S r"S r#S  r$S! r%SCS" jr&S# r'S$ r(S% r)S& r*S' r+S( r,S) r-S* r.S+ r/S, r0S- r1S. r2S/ r3S0 r4S1 r5\5r6S2 r7S3 r8S4 r9S5 r:S6 r;S7 r<S8 r=S9 r>S: r?S; r@S< rAS= rBS> rCS? rDS@rEg)DStdioClient   zcftp>    
Nc                 f    Xl         SU l        X l        U(       + =(       a    S=(       d    SU l        g )Nr)   r,   r   )clientcurrentDirectoryfileuseProgressBar)r2   r   rt   s      r3   r   StdioClient.__init__   s'     "	#$u{0qr6   c                 l    U R                   R                  S5      R                  U R                  5        g )Nr)   )r   realPathaddCallback_cbSetCurDirr2   s    r3   connectionMadeStdioClient.connectionMade   s%    R ,,T->->?r6   c                 0    Xl         U R                  5         g r8   )r   _newLiner2   paths     r3   r   StdioClient._cbSetCurDir   s     $r6   c                     [        U[        5      (       a  UR                  S5      nU R                  R	                  U5      $ )Nutf-8)
isinstancer?   encode	transportwrite)r2   msgs     r3   _writeToTransportStdioClient._writeToTransport   s2    c3**W%C~~##C((r6   c                 *   U R                   R                  R                  (       a  g [        U[        5      (       a  UR                  S5      n[        R                  " SU-  5        UR                  5       nU(       d  U R                  5         g U R                  (       a#  UR                  S5      (       a  SU l        USS  nOSU l        U R                  U5      nUb7  UR                  U R                  5        UR!                  U R"                  5        g g )Nr   zgot line %s-r,   r   )r   r   localClosedr   bytesdecoder   r   lstripr   r   
startswithignoreErrors_dispatchCommandr   
_cbCommandrl   
_ebCommand)r2   lineds      r3   lineReceivedStdioClient.lineReceived   s    ;;  ,,dE"";;w'D$%{{}MMO99-- !D8D !D!!$'=MM$//*LL) r6   c                    SU;   a%  UR                  SS5      u  p#UR                  5       nOUSp2UR                  S5      (       a&  U R                  nUSS  S-   U-   R	                  5       nO9UR                  5       n[        R                  " SU-  5        [        U SU-  S 5      nUb  [        R                  " XC5      $ SU-  nU R                  [        R                  " [        U5      5      5        U R                  5         g )N r,   r)   !zlooking up cmd %szcmd_%szNo command called `%s')r0   r   r   cmd_EXECstripupperr   r   r   r   maybeDeferredr   r   r`   NotImplementedErrorr   )r2   r   commandrestrt   errMsgs         r3   r   StdioClient._dispatchCommand   s    $; JJsA.MG;;=D "Tc""AABK#%,335DmmoGGG''12h0$7A=&&q//-9FOOGOO,?,GHIMMOr6   c                 .   [         R                  " U5        UR                  [        [        R
                  [        [        5      nU[        :X  a!  U R                  U R                  S5      5        g U[        R
                  :X  aA  SUR                  R                  UR                  R                  4-  nU R                  U5        g U[        [        4;   aA  SUR                  R                  UR                  R                  4-  nU R                  U5        g g )Nr)   zremote error %i: %s
zlocal error %i: %s
)r   r   trapr   r   	SFTPErrorOSErrorIOErrorr   cmd_HELPrr   codemessageerrnostrerror)r2   rt   er   s       r3   _printFailureStdioClient._printFailure   s    
FF&(>(>Q##""4==#45,(((,aggoo/NNF""6*7G$$+qww}}agg>N>N.OOF""6* %r6   c                    U R                   R                  R                  (       a  g U R                  U R                  5        SU l        U R                  (       aw  U R                  R                  5       nU(       d%  U R                   R                  R                  5         g U R                  U5        U R                  UR                  5       5        g g )Nr   )r   r   r   r   psr   r   readlineloseConnectionr   r   )r2   ls     r3   r   StdioClient._newLine   s    ;;  ,,tww'99		""$A%%446&&q)!!!''), r6   c                     Ub^  [        U[        5      (       a  UR                  S5      nU R                  U5        UR	                  S5      (       d  U R                  S5        U R                  5         g )Nr   r   )r   r?   r   r   endswithr   )r2   results     r3   r   StdioClient._cbCommand   sW    &#&&w/""6*??5))&&u-r6   c                     U R                  U5        U R                  (       a5  U R                  (       d$  U R                  R                  R                  5         U R                  5         g r8   )r   r   r   r   r   r   r   r   s     r3   r   StdioClient._ebCommand   s>    199T..KK!!002r6   c                 |   U R                  U5      u  pUR                  S5      (       d  US-  nU=(       a*    [        R                  R	                  U R
                  U5      =(       d    SnU R                  R                  U5      nUR                  U R                  5        UR                  U R                  5        U$ )Nr-   r)   )_getFilenamer   osr   joinr   r   openDirectoryr   _cbCdrl   r   )r2   r   r   newPathr   s        r3   cmd_CDStdioClient.cmd_CD   s    &&t,
}}S!!CKDD277<<(=(=tDJKK%%g.	djj!	T__%r6   c                     UR                  5         U R                  R                  UR                  5      nUR	                  U R
                  5        U$ r8   )closer   r   namer   	_cbCurDir)r2   	directoryr   s      r3   r   StdioClient._cbCd  s9    KK  0	dnn%r6   c                     Xl         g r8   r   r   s     r3   r   StdioClient._cbCurDir  s     $r6   c                     UR                  S S5      u  p!U R                  U5      u  p1[        U5      nU R                  R	                  U5      nUR                  U R                  X2S9  U$ )Nr,   )grpr0   r   r@   r   getAttrsr   _cbSetUsrGrp)r2   r   r   r   r   s        r3   	cmd_CHGRPStdioClient.cmd_CHGRP
  ^    JJtQ'	&&t,
#hKK  &	d''7r6   c                     UR                  S S5      u  p!U R                  U5      u  p1[        US5      nU R                  R	                  USU05      nUR                  [        5        U$ )Nr,      permissions)r0   r   r@   r   setAttrsr   rv   )r2   r   modr   r   s        r3   	cmd_CHMODStdioClient.cmd_CHMOD  s]    JJtQ'	&&t,
#qkKK  s';<	gr6   c                     UR                  S S5      u  p!U R                  U5      u  p1[        U5      nU R                  R	                  U5      nUR                  U R                  X2S9  U$ )Nr,   )usrr   )r2   r   r   r   r   s        r3   	cmd_CHOWNStdioClient.cmd_CHOWN  r   r6   c                     0 nUS L=(       a    U=(       d    US   US'   US L=(       a    U=(       d    US   US'   U R                   R                  X%5      nUR                  [        5        U$ )Nuidgid)r   r   r   rv   )r2   attrsr   r   r   newr   s          r3   r   StdioClient._cbSetUsrGrp"  sb    o.3>%,E
o.3>%,E
KK  +	gr6   c                 
   U R                  U5      u  p!SU;   d  SU;   aq  U(       a9  U R                  U5      u  p1[        R                  R                  U5      (       d  gOSnU R	                  U5      nUR                  U R                  U5        U$ U(       a  U R                  U5      u  p1O"[        R                  R                  U5      S   n[        R                  " X#45        [        USS5      n[        U R                  5      R                  U5      nU R                  R                  UR                  [         R"                  0 5      nUR                  U R$                  U5        UR'                  U R(                  U5        U$ )N*?z'Wildcard get with non-directory target.r6   r,   wbr   )r   r   r   isdir_remoteGlobr   _cbGetMultipler0   r   r   openr   r   childr   openFiler   FXF_READ_cbGetOpenFilerl   
_ebCloseLf)r2   r   remotelocalr   lfr   s          r3   cmd_GETStdioClient.cmd_GET*  s3   ((.&=C6M"//5ww}}U++D ,   (AMM$--u5H++D1KE4GGMM&)!,E %q!--.44V<KK  L,A,A2F	d))2.	T__b)r6   c                 &    U R                  S X5      $ r8   )_cbGetMultipleNext)r2   filesr  s      r3   r  StdioClient._cbGetMultipleB  s    &&tU::r6   c                    [        U[        R                  5      (       a  U R                  U5        O?U(       a8  U R	                  U5        UR                  S5      (       d  U R	                  S5        U(       d  g UR                  S5      S   n[        [        R                  R                  U[        R                  R                  U5      S   5      SS5      n[        U R                  5      R                  U5      nU R                  R!                  UR                  ["        R$                  0 5      nUR'                  U R(                  U5        UR+                  U R,                  U5        UR/                  U R0                  X#5        U$ )N
r   r,   r	  )r   r   r`   r   r   r   popr  r   r   r   r0   r   r   r  r   r  r   r  r   r  rl   r  addBothr  )r2   resr  r  rt   r  r   r   s           r3   r  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r6   c                 &    UR                  5         U$ r8   )r   )r2   rt   r  s      r3   r  StdioClient._ebCloseLfX  s    

r6   c                 V    UR                  5       R                  U R                  X5      $ r8   )r   r   _cbGetFileSize)r2   rfr  s      r3   r  StdioClient._cbGetOpenFile\  s!    {{}(()<)<bEEr6   c           
         [         R                  " US   5      (       d/  UR                  5         UR                  5         SUR                  -  $ US   Ul        U R
                  R                  R                  R                  S   nU R
                  R                  R                  R                  S   nSUl	        / n/ nU R                  R                  5       n[        U5       H)  n	U R                  SX#USXH5      n
UR                  U
5        M+     [        R                   " US	S
9nUR#                  U R$                  X#5        U$ )Nr   zCan't get non-regular file: %sr   r   r   r{   r)   r   r,   fireOnOneErrback)statS_ISREGr   r   r   r   r   rn   r	   r|   r   secondsrange
_cbGetReadappendr   DeferredListr   
_cbGetDone)r2   r  r&  r  
bufferSizenumRequestsdListchunks	startTimerX   r   dls               r3   r%  StdioClient._cbGetFileSize_  s    ||E-011HHJHHJ3bgg==-[[**//77E
kk++0088DLL((*	{#ABFAzMALLO $ :
t/	r6   c                 B   SnU HJ  nUS:X  a    g X#S   :w  a2  UR                  U5      nUR                  XBUS   45        X#S   U-
  4s  $ US   nML     [        U R                  R                  R
                  R                  S   5      nUR                  X"U-   45        X%4$ )Nr   eofr,   r   )rL   insertr@   r   r   rn   r	   r0  )r2   r6  endchunkrX   bufSizes         r3   _getNextChunkStdioClient._getNextChunkr  s    Ee|AhLL'auQx11X^,,(C  dkk++0088FGs'M*+~r6   c           	         U(       az  [        U[        R                  5      (       a[  [        R                  " SU-  5        UnUR                  [        5        UR                  XUU-   45      n	XI	 UR                  XS45        OU(       a  [        R                  " S[        U5      -  5        UR                  U5        UR                  U5        [        U5      U:w  aZ  [        R                  " S[        U5      U4-  5        UR                  XUU-   45      n	XI	 UR                  XU[        U5      -   45        U=R                  [        U5      -  sl        U R                  (       a  U R                  X'5        U R                  U5      n
U
(       d  g U
u  p[[        R                  " SXUU-   4-  5        UR!                  X[5      nUR#                  U R$                  X#XEX5        U$ )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   EOFErrorrL   r<  lenr}   r   r|   r   _printProgressBarr@  	readChunkr  r/  )r2   datar&  r  r6  startr   r7  reasonrX   r>  lengthr   s                r3   r/  StdioClient._cbGetRead  st   JtW__55GG&-.FKK!eT\23A	MM!U^,GG'#d)34GGENHHTN4yD =TD@QQRLL%!67IaT):!;<HHD	!H""21""6*!ME%(??@LL'			$//26&Lr6   c                     [         R                  " S5        UR                  5         UR                  5         U R                  (       a  U R	                  S5        SUR
                   SUR
                   3$ )Nzget doner  Transferred  to )r   r   r   r   r   r   r2   ignoredr&  r  s       r3   r2  StdioClient._cbGetDone  sR    




""4(bggYd277)44r6   c                    U R                  U5      u  p!SU;   d  SU;   an  U(       a>  U R                  U5      u  p1[        R                  R                  U R                  U5      nOSn[
        R
                  " U5      nU R                  XC5      $ U(       a  U R                  U5      u  p1O"[        R                  R                  U5      S   nU R                  X#5      $ )z
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_putMultipleFilesr0   _putSingleFile)r2   r   r  r  r  s        r3   cmd_PUTStdioClient.cmd_PUT  s     ''- %<3%<#006d&;&;VDIIe$E))%88 #006u-a0&&u55r6   c                 (    U R                  SU/USS9$ )a  
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)r2   r  r  s      r3   rU  StdioClient._putSingleFile  s      &&teWfT&JJr6   c                 &    U R                  SX5      $ )a  
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.
NrZ  )r2   r  r  s      r3   rT  StdioClient._putMultipleFiles  s     &&tU;;r6   c                 L   [        U[        R                  5      (       a  U R                  U5        OeU(       a^  [        U[        5      (       a  UR                  S5      nU R                  U5        UR                  S5      (       d  U R                  S5        SnU(       a5  U(       d.   UR                  S5      n[        US5      nU(       a	  U(       d  M.  U(       d  gU(       a  UnOY[        R                  R                  U5      S   n[        R                  R                  X85      n[        R                   " XU45        U R#                  WU5      n	U	R%                  U R&                  X#5        U	$ ! [         a)    U R                  [        R                  " 5       5        Sn Nf = f)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  r^   r   r   r0   r   r   r   _putRemoteFiler  r[  )
r2   previousResultr  r*   rY  currentFilelocalStreamr  r   r   s
             r3   r[  StdioClient._cbPutMultipleNext  sA   ( ngoo66~..#..!/!6!6w!?"">2!**511&&u-K##iil";5 KK F77==-a0DWW\\*3FGGT:./V4			$))5=# ! #""7??#45"#s   (E0 00F#"F#c                 f   [         R                  R                  U R                  U5      n[        R
                  [        R                  -  [        R                  -  nU R                  R                  X40 5      nUR                  U R                  U5        UR                  U R                  U5        U$ )a  
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   _cbPutOpenFilerl   r  )r2   rd  r*   r  flagsr   s         r3   ra  StdioClient._putRemoteFile  s     d33Z@&&)?)??,BXBXXKK  3	d));7	T__k2r6   c                    U R                   R                  R                  R                  S   nU R                  (       a  [        U5      n/ n/ nU R                  R                  5       n[        U5       H0  nU R                  S XXV5      nU(       d  M  UR                  U5        M2     [        R                  " USS9n	U	R                  U R                  X5        U	$ )Nr   r,   r)  )r   r   rn   r	   r   rx   r   r-  r.  _cbPutWriter0  r   r1  r   
_cbPutDone)
r2   r&  r  r4  r5  r6  r7  rX   r   r8  s
             r3   rj  StdioClient._cbPutOpenFile+  s    kk++0088DRBLL((*	{#A  rvAAqQ $ :
t/	r6   c                 `   U R                  U5      nUu  pxUR                  U5        UR                  U5      n	U R                  (       a/  U=R                  [        U	5      -  sl        U R                  X55        U	(       a0  UR                  Xy5      n
U
R                  U R                  X#XE5        U
$ g r8   )
r@  r}   readr   r|   rD  rE  
writeChunkr   rn  )r2   rP  r&  r  r6  r7  r>  rH  r   rG  r   s              r3   rn  StdioClient._cbPutWrite:  s    ""6*
wwt}HHD	!H""21e*AMM$**BFFHr6   c                     UR                  5         UR                  5         U R                  (       a  U R                  S5        SUR                   SUR                   3$ )Nr  rM  rN  )r   r   r   r   rO  s       r3   ro  StdioClient._cbPutDoneI  sF    



""4(bggYd277)44r6   c                 0    [         R                  " U5        g r8   )r   chdirr   s     r3   cmd_LCDStdioClient.cmd_LCDP  s    
r6   c                    ^  T R                  U5      u  p!T R                  U5      u  p1[        U 4S jX#45      u  p#T R                  R                  X#5      R	                  [
        5      $ )Nc                 X   > [         R                  R                  TR                  U 5      $ r8   r   r   r   r   xr2   s    r3   <lambda>$StdioClient.cmd_LN.<locals>.<lambda>W      bggll4#8#8!<r6   )r   mapr   makeLinkr   rv   )r2   r   linkpath
targetpaths   `   r3   cmd_LNStdioClient.cmd_LNS  s_    **40,,T2
"<x>T 
 {{##H9EEgNNr6   c                 h   / nUR                  5       nU(       a  US   (       a|  US   S   S:X  ap  UR                  S5      SS  nU H7  nUS:X  a  UR                  " S5        M  US:X  d  M%  UR                  " S5        M9     U(       a  US   (       a  US   S   S:X  a  Mp  SR                  U5      nU R	                  U5      u  pQU(       d  U R
                  S	-   nO*[        R                  R                  U R
                  U5      nU R                  U5      nUR                  U R                  U5        U$ )
Nr   r   r,   r   verboseaallr   r-   )r0   r  r0  r   r   r   r   r   r  r   _cbDisplayFiles)r2   r   r	   optsor   fullPathr   s           r3   cmd_LSStdioClient.cmd_LS[  s     zz|tAw471:#488A;qr?D8NN9-#XNN5)	  tAw471:#4 xx~&&t,
,,s2Hww||D$9$94@HX&	d**G4r6   c                 4   UR                  5         SU;  a,  U Vs/ s H  o3S   R                  S5      (       a  M  UPM!     nnSU;   a  U Vs/ s H  o3S   PM	     nnOU Vs/ s H  o3S   PM	     nnU(       d  g SR                  U5      $ s  snf s  snf s  snf )Nr  r      .r  r,   r   )sortr   r   )r2   r  r	   rt   liness        r3   r  StdioClient._cbDisplayFilest  s    

 %C1qT__T-BQEC#()5aqT5E)E#()5aqT5E)::e$$ D))s   BBB"Bc                     U R                  U5      u  p[        R                  R                  U R                  U5      nU R
                  R                  U0 5      R                  [        5      $ r8   )	r   r   r   r   r   r   makeDirectoryr   rv   r2   r   r   s      r3   	cmd_MKDIRStdioClient.cmd_MKDIR  sP    &&t,
ww||D1148{{((r2>>wGGr6   c                     U R                  U5      u  p[        R                  R                  U R                  U5      nU R
                  R                  U5      R                  [        5      $ r8   )	r   r   r   r   r   r   removeDirectoryr   rv   r  s      r3   	cmd_RMDIRStdioClient.cmd_RMDIR  sN    &&t,
ww||D1148{{**40<<WEEr6   c                 6    [         R                  " SU-  5        g )Nzmkdir %sr   systemr   s     r3   
cmd_LMKDIRStdioClient.cmd_LMKDIR  s    
		*t#$r6   c                     U R                  U5      u  p[        R                  R                  U R                  U5      nU R
                  R                  U5      R                  [        5      $ r8   )	r   r   r   r   r   r   
removeFiler   rv   r  s      r3   cmd_RMStdioClient.cmd_RM  sN    &&t,
ww||D1148{{%%d+77@@r6   c                 6    [         R                  " SU-  5        g )Nzls %sr  )r2   r   s     r3   cmd_LLSStdioClient.cmd_LLS  s    
		'D.!r6   c                    ^  T R                  U5      u  p!T R                  U5      u  p1[        U 4S jX#45      u  p#T R                  R                  X#5      R	                  [
        5      $ )Nc                 X   > [         R                  R                  TR                  U 5      $ r8   r}  r~  s    r3   r  (StdioClient.cmd_RENAME.<locals>.<lambda>  r  r6   )r   r  r   
renameFiler   rv   )r2   r   oldpathnewpaths   `   r3   
cmd_RENAMEStdioClient.cmd_RENAME  s^    ))$/))$/<w>P
 {{%%g7CCGLLr6   c                 L    U R                   R                  R                  5         g r8   )r   r   r   r2   rP  s     r3   cmd_EXITStdioClient.cmd_EXIT  s    ,,.r6   c                     SU R                   R                  -  n[        U[        5      (       a  UR	                  S5      nU$ )NzSFTP version %ir   )r   versionr   r?   r   )r2   rP  r  s      r3   cmd_VERSIONStdioClient.cmd_VERSION  s6    #dkk&9&99gs##nnW-Gr6   c                     g)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'.
r7   r  s     r3   r   StdioClient.cmd_HELP  s    r6   c                     U R                   $ r8   r   r  s     r3   cmd_PWDStdioClient.cmd_PWD  s    $$$r6   c                 ,    [         R                  " 5       $ r8   )r   getcwdr  s     r3   cmd_LPWDStdioClient.cmd_LPWD  s    yy{r6   c                 p    U R                   (       + U l         SU R                   =(       a    S=(       d    S-  $ )Nz%ssing progess bar.UzNot u)r   r  s     r3   cmd_PROGRESSStdioClient.cmd_PROGRESS  s.    "&"5"55$(;(;(C(NwOOr6   c                     U R                   R                  [        R                  " 5       5      S   nU(       d  SnU(       a  SU/n[        R
                  " X#SS9$ [        R                  " U5        g)zJ
Run C{rest} using the user's shell (or /bin/sh if they do not have
one).
   z/bin/shz-cr,   )errortooN)_pwdgetpwnamrg   rh   r   getProcessOutputr   r  )r2   r   shellcmdss       r3   r   StdioClient.cmd_EXEC  sW    
 		""7??#45a8E$<D))%BBIIer6   c                    [         R                  " SU-  5        [        R                  R	                  U5      u  p#SU;   d  SU;   a  SnOSnU(       a\  U(       dU  U R
                  R                  U5      nUR                  U R                  S5        UR                  U R                  X#5        U$ U R
                  R                  U5      nUR                  U R                  U5        U$ )Nzlooking up %sr  r  r,   r   r)   )r   r   r   r   r0   r   r   r   _cbOpenListrl   _ebNotADirectory)r2   r  headtailrS  r   s         r3   r  StdioClient._remoteGlob  s    (*+WW]]8,
$;#+DD))(3AMM$**B/LL..;  ))$/AMM$**D1r6   c                 d    / nUR                  5       nUR                  U R                  X1U5        U$ r8   )rr  r  _cbReadFile)r2   r   rS  r  r   s        r3   r  StdioClient._cbOpenList  s.    NN			$""Ed;r6   c                 t    U R                   R                  U5      nUR                  U R                  U5        U$ r8   )r   r   r   r  )r2   rI  r   rS  r   s        r3   r  StdioClient._ebNotADirectory  s/    KK%%d+	d&&-r6   c           	         [        U[        R                  5      (       d  U(       aV  UR                  " S5      nUR	                  U Vs/ s H&  n[
        R
                  " US   U5      (       d  M$  UPM(     sn5        OUR	                  U5        UR                  5       nUR                  U R                  X#U5        U$ UnUR                  [        5        UR                  5         U$ s  snf )Nr   r   )r   r   r`   r   extendfnmatchrr  r  r  r   rC  r   )r2   r  matchedFilesr   rS  rt   r   rI  s           r3   r  StdioClient._cbReadFile  s    %11{{7+##$U11t9TQ$UV##E* AIId&&FHFKK!OO %Vs   #C&/C&c                 D    / SQnU H  u  p4X:  d  M    O   SUW-  -  W-   $ )N))l           PB)l        TB)i   @GB)i   MB)i   kB)r,   r   z%.1fr7   )r2   r   _abbrevsfactorsuffixs        r3   _abbrevSizeStdioClient._abbrevSize
  s5    
 'NF} ' '&00r6   c                     US:  a3  [        US-  5      nUSU-  -  n[        US-  5      nUSU-  -  nSX#U4-  $ [        US-  5      nUSU-  -  nSX14-  $ )Ni  <   z%i:%02i:%02iz	%02i:%02i)r@   )r2   thoursminss       r3   _abbrevTimeStdioClient._abbrevTime  su    t8DMEAq2v;DdNA!U!$444q2v;DdNA$**r6   c                    U R                   R                  5       U-
  nUR                  n [        R                  " S[
        R                  " S[        R                  S5      5      nUS:X  a  SnOXC-  nU(       a  UR                  U-
  U-  nOSnUR                  nUR                  (       a  XAR                  -  S-  n	OSn	SU	U R                  U5      U R                  U5      U R                  U5      4-  n
US	   [        U5      [        U
5      -   S	-   -
  S
-  nSU U U
 3nU R                  U5        g! [         a    SS/n Nf = f)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   r{   d   z%3i%% %s %sps %s r,   r   )r   r-  r|   structunpackfcntlioctltty
TIOCGWINSZr   r   r   r  r  rD  r   )r2   rt   r7  diffr|   winSizespeedtimeLeftfront
percentagebackspacesr   s                r3   rE  StdioClient._printProgressBar&  s=    ||##%	1	!mmD%++a*TUG 3;ELE%/HH66&&.C/JJ"U#U#X&	&
 
 !*E
SY 6 :;sBugfXdV,w'/  	!RjG	!s   ;D4 4EEc                 D   UR                  5       nU(       d  gUS   S;   a  / n[        U5      n [        S[        U5      5       H  nX   nXAS   :X  a7  SR	                  U5      SR	                  XS-   S 5      R                  5       4s  $ US:X  a/  X	 X   S;  a  [        S	X    35      eUR                  X   5        M{  UR                  X   5        M     UR                  SS5      n[        U5      S:X  a  US   S4$ US   US   4$ ! [         a    [        S
5      ef = f)a  
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.  rD  r   r   
IndexErrorr0  r0   )r2   r   retrX   cs        r3   r   StdioClient._getFilenameP  s&    zz|7eC:D7q#d),AAG|!wws|RWWTa%']-C-J-J-LLLd G7'1",}TWI-F"GG

47+

47+ - jjq!s8q=q62:q63q6>!  7 !5667s   AD	 AD	 	D)r   r   r   r   r   r8   )NN)F)Fr9   r:   r;   r<   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/  r2  rV  rU  rT  r[  ra  rj  rn  ro  ry  r  r  r  r  r  r  r  r  r  r  cmd_QUITr  r   r  r  r  r   r  r  r  r  r  r  rE  r   rF   r7   r6   r3   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#"r6   r   zcmd_?c                       \ rS rSrS rSrg)ri   iy  c                 6    U R                  [        5       5        g r8   )openChannel
SSHSessionr   s    r3   serviceStartedSSHConnection.serviceStartedz  s    &r6   r7   N)r9   r:   r;   r<   r  rF   r7   r6   r3   ri   ri   y  s    'r6   ri   c                       \ rS rSr% Sr\\S'   \R                  r\	\S'   S r
S rS\S\S	S
4S jrS rS rS rS rS rSrg
)r  i~  s   sessionr   rS   c                    [         R                  " SU R                  -  5        U R                  R                  S   R                  S5      (       a  SnOSnU R                  R                  X[        R                  " U R                  R                  S   5      SS9nUR                  U R                  5        UR                  [        5        g )Nzsession %s openr!   r-   execr,   )	wantReply)r   r   idrn   r	   r   sendRequestr   NSr   _cbSubsystemrl   rm   )r2   foorequestr   s       r3   channelOpenSSHSession.channelOpen  s    !DGG+,99[)44S99G!GII!!699TYY%6%6{%CDPQ " 
 	
d''(	Wr6   c                    [         R                  " 5       U l        U R                  R                  U 5        U R                  R                  U l        S nU R
                  R                  S   (       a*  U R
                  R                  S   nUS:w  a  [        U5      n[        R                  " [        U R                  U5      5      U l        g )Nr   r   )r   FileTransferClientr   makeConnectiondataReceivedrn   r	   r  r   
StandardIOr   )r2   r   rt   fns       r3   r!  SSHSession._cbSubsystem  s    "557""4( KK4499[)"";/BSyH%%k$++q&AB
r6   r  rG  returnNc                     U[         R                  :X  ah  [        R                  " S[	        U5      -  5        U R
                  R                  UR                  SS5      5        U R
                  R                  5         g g )Nzgot %s stderr datar   backslashreplace)	r   EXTENDED_DATA_STDERRr   r   rD  rS   r   r   flush)r2   r  rG  s      r3   extReceivedSSHSession.extReceived  s]    
///GG(3t945l KKdkk'3EFGKKq 0r6   c                 d    [         R                  " S5        U R                  R                  5         g )Nzgot eof)r   r   r   loseWriteConnectionr   s    r3   eofReceivedSSHSession.eofReceived  s    	

&&(r6   c                 l    [         R                  " SU -  5        U R                  R                  U 5        g )Nzremote side closed %s)r   r   rn   	sendCloser   s    r3   closeReceivedSSHSession.closeReceived  s&    '$./		D!r6   c                 P     [         R                  " 5         g ! [         a     g f = fr8   )r   r]   r^   r   s    r3   closedSSHSession.closed  s"    	LLN 		s    
%%c                 8    U R                   R                  5         g r8   )r   pauseProducingr   s    r3   stopWritingSSHSession.stopWriting  s    

!!#r6   c                 8    U R                   R                  5         g r8   )r   resumeProducingr   s    r3   startWritingSSHSession.startWriting  s    

""$r6   )r   r)  r   )r9   r:   r;   r<   r   r   rA   rJ   rS   r   r$  r!  r@   r2  r6  r:  r=  rA  rE  rF   r7   r6   r3   r  r  ~  sY    D%ZZFF
	C9 S 9  9 $ 9 v)"$%r6   r  __main__)6__doc__r  r  rg   rS  r   r  r+  r  rJ   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   rV   ra   rU   rm   rv   rx   LineReceiverr   setattrr   ri   
SSHChannelr  r9   r7   r6   r3   <module>rT     s   
     	 
   
 
 0 0 : : G G 9 9 # . . ,&G(( &D,
G&		% %f"%$$ f"R Wk22 3'J,, '
h%## h%V zE r6   