U
    -WjG  ã                   @   s¾  U 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
 d dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZmZ d dlmZmZ d d	lm Z m!Z! G d
d„ deƒZ"da#ee$d< da%d a&da'd a(da)dd„ Z*dd„ Z+dd„ Z,ddœdd„Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dd„ Z2G d d!„ d!ƒZ3G d"d#„ d#ej4ƒZ4G d$d%„ d%ej5ƒZ6G d&d'„ d'ej7ƒZ7G d(d)„ d)ej8ƒZ8d*d+„ Z9d,d-„ Z:e;d.k�rºe*ƒ  dS )/é    N)ÚAnyÚListÚTuple)ÚconnectÚdefault)ÚConchOptions)Ú
ConchError)ÚchannelÚcommonÚ
connectionÚ
forwardingÚsession)ÚreactorÚstdioÚtask)ÚlogÚusage)ÚioTypeÚnetworkStringc                	   @   s  e Zd ZU dZdZdddgdddd	gd
dddggZdddgdddgdddgdddgdddgdddggZejdgej	d d!�ej	d d!�d"œe 
¡ ej	d#d!�ej	d$d%d&�gd'�Zg Zeeeeeef f  ed(< g Zeeeeeef f  ed)< d*d+„ Zd,d-„ Zd.d/„ Zd0d1„ ZdS )2ÚClientOptionsz(Usage:   conch [options] host [command]
zYconch is a SSHv2 client that allows logging into a remote machine and executing commands.ÚescapeÚeú~ÚlocalforwardÚLNz<listen-port:host:port   Forward local port to remote addressÚremoteforwardÚRz<listen-port:host:port   Forward remote port to local addressÚnullÚnzRedirect input from /dev/null.ÚforkÚfz(Fork to background after authentication.ÚttyÚtz-Tty; allocate a tty even if command is given.ÚnottyÚTzDo not allocate a tty.ÚnoshellÚNz"Do not execute a shell or command.Ú	subsystemÚsz-Invoke command (mandatory) as SSH2 subsystem.)r!   r#   zlisten-port:host:port)Údescr)r   r   ÚcommandZargumentT)r)   Úrepeat)ZmutuallyExclusiveZ
optActionsZextraActionsÚlocalForwardsÚremoteForwardsc                 C   sp   |dkrd| d< nZ|d dkrDt |ƒdkrDtt|d ƒd ƒ| d< n(t |ƒdkrZ|| d< nt d	|› d
�¡ dS )z:
        Set escape character; ``none'' = disable
        ÚnoneNr   r   ú^é   é   é@   zBad escape character 'z'.)ÚlenÚchrÚordÚsysÚexit)ÚselfÚesc© r:   úfc:\users\psant\downloads\hotstarbackend\school\venv38\Lib\site-packages\twisted/conch/scripts/conch.pyÚ
opt_escapeO   s    

zClientOptions.opt_escapec                 C   s8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ dS )zH
        Forward local port to remote address (lport:host:port)
        ú:N)ÚsplitÚintr,   Úappend)r8   r    Ú	localPortZ
remoteHostÚ
remotePortr:   r:   r;   Úopt_localforward\   s    zClientOptions.opt_localforwardc                 C   s8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ dS )zH
        Forward remote port to local address (rport:host:port)
        r=   N)r>   r?   r-   r@   )r8   r    rB   ZconnHostZconnPortr:   r:   r;   Úopt_remoteforwarde   s    zClientOptions.opt_remoteforwardc                 G   s   || d< d  |¡| d< d S )NÚhostú r*   )Újoin)r8   rE   r*   r:   r:   r;   Ú	parseArgsn   s    zClientOptions.parseArgs)Ú__name__Ú
__module__Ú__qualname__ZsynopsisZlongdescZoptParametersZoptFlagsr   ZCompletionsZ	CompleterZCompleteUserAtHostZcompDatar,   r   r   r?   Ú__annotations__r-   r<   rC   rD   rH   r:   r:   r:   r;   r      sL   
ÿüüøú	

þ
ýú  		r   Úoptionsc                  C   sv  t jdd … } d| krF|  d¡}| ||d … |  } | |d |d …= | d d … D ]\}zB|  |¡}|d d… dkr–| |d  d dkr–g | ||d …< W qR tk
r¬   Y qRX qRtƒ azt | ¡ W nF tjk
�r
 } z$t	d|› �ƒ t 
¡  t  d¡ W 5 d }~X Y nX td	 �rdtd
 �rFtd
 dk�r6t j}nttd
 dƒ}nt j}t j}t |¡ |t _nt ¡  tƒ  t j ¡ }zt |¡aW n tk
�r¤   d aY nX zt tjdd„ ¡}W n tk
�rÖ   d }Y nX zt  ¡  W 5 t�rüt |tjt¡ |�rt tj|¡ td �r$td �s.td �s>t tjtj¡ X t j !¡ �rhtd �sht	d "td ¡ƒ t  t#¡ d S )Nr1   z-lr0   é   z-or   ú-zERROR: r   Úlogfileza+c                  W   s   t  dt¡S ©Nr   )r   Ú	callLaterÚ	reConnect)Úar:   r:   r;   Ú<lambda>¦   ó    zrun.<locals>.<lambda>r*   r!   r#   zConnection to {} closed.rE   )$r6   ÚargvÚindexÚ
ValueErrorr   rM   ZparseOptionsr   Z
UsageErrorÚprintZopt_helpr7   ÚstdoutÚopenÚstderrr   ZstartLoggingZdiscardLogsÚ	doConnectÚstdinÚfilenor!   Ú	tcgetattrÚoldÚBaseExceptionÚsignalZSIGUSR1Ú	tcsetattrÚTCSANOWÚSIGWINCHÚSIG_DFLr   ÚrunÚisattyÚformatÚ
exitStatus)ÚargsÚiÚargÚur    ZrealoutÚfdZoldUSR1r:   r:   r;   ri   |   sj    

$




 ÿ
ri   c                  C   s0   ddl m}  dat dt¡ t |  ¡ ¡ ‚ d S )Nr   ©Úfailurer0   g{®Gáz„?)	Útwisted.pythonrs   rl   r   rR   Ú_stopReactorr   ÚerrZFailurerr   r:   r:   r;   ÚhandleError¸   s
    rw   c                   C   s&   zt  ¡  W n tk
r    Y nX d S ©N)r   Ústoprc   r:   r:   r:   r;   ru   Â   s    ru   )Úreturnc                  C   sÌ   dt d kr(t d  dd¡\t d< t d< t js8ddgt _t d sLt ¡ t d< t d s^dt d< ntt d ƒt d< t d } t d }tj}t d	 sœt | t ¡t d	< t 	t d t t
ƒ ¡}t | |t ||¡ t¡ d S )
Nú@rE   r1   Úuserz~/.ssh/id_rsaz~/.ssh/id_dsaÚporté   zhost-key-algorithms)rM   r>   Z	identitysÚgetpassÚgetuserr?   r   ZverifyHostKeyZgetHostKeyAlgorithmsZSSHUserAuthClientÚSSHConnectionr   Ú
addErrbackÚ_ebExit)rE   r}   ZvhkZuaor:   r:   r;   r^   É   s     

r^   c                 C   s   d| › �a t dt¡ d S )Nzconch: exiting with error çš™™™™™¹?)rl   r   rR   ru   )r    r:   r:   r;   rƒ   ß   s    
rƒ   c                  C   s0  t tjdƒrttƒ tjrLtjD ]*\} }t | t 	t|t
¡¡}tj |¡ q tjr’tjD ]*\}}t d|› d|› �¡ t ||¡ qXt ddt¡ td r¢td r®t tƒ ¡ td �r,t ¡ rÊt d	¡ t ¡  td
ƒD ]P}zt |¡ W qÚ tk
�r( } zd	d l}|j|jk�r‚ W 5 d }~X Y qÚX qÚd S )NZ
sendIgnorez!asking for remote forwarding for r=   ÚbeforeÚshutdownr%   Úagentr   r   é   )ÚhasattrÚconnÚ	transportÚ
_KeepAliverM   r,   r   Z	listenTCPr   ZSSHListenForwardingFactoryÚ SSHListenClientForwardingChannelr@   r-   r   ÚmsgÚrequestRemoteForwardingZaddSystemEventTriggerÚbeforeShutdownZopenChannelÚ
SSHSessionÚosr   Ú_exitZsetsidÚrangeÚcloseÚOSErrorÚerrnoÚEBADF)rA   Úhostportr(   rB   rn   r   r—   r:   r:   r;   Ú	onConnectå   s>      ÿþ

rš   c                   C   s   t ƒ  tjj ¡  d S rx   )r�   rŠ   r‹   ÚloseConnectionr:   r:   r:   r;   rS   	  s    rS   c                  C   s8   t j} | D ](\}}t d|› d|› �¡ t |¡ q
d S )Nzcancelling r=   )rM   r-   r   rŽ   rŠ   ÚcancelRemoteForwarding)r-   rB   r™   r:   r:   r;   r�     s    r�   c                   C   s   t d st dt¡ d S )NZ	reconnectr„   )rM   r   rR   ru   r:   r:   r:   r;   ÚstopConnection  s    r�   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
rŒ   c                 C   s*   || _ d | _t | j¡| _| j d¡ d S )Ni,  )rŠ   ÚglobalTimeoutr   ZLoopingCallÚ
sendGlobalÚlcÚstart)r8   rŠ   r:   r:   r;   Ú__init__  s    z_KeepAlive.__init__c                 C   s2   | j jdddd�}| | j¡ t d| j¡| _d S )Ns"   conch-keep-alive@twistedmatrix.comrV   r1   ©Z	wantReplyé   )rŠ   ÚsendGlobalRequestÚaddBothÚ	_cbGlobalr   rR   Ú	_ebGlobalrž   )r8   Údr:   r:   r;   rŸ   !  s      ÿz_KeepAlive.sendGlobalc                 C   s   | j r| j  ¡  d | _ d S rx   )rž   Úcancel)r8   Úresr:   r:   r;   r§   (  s    
z_KeepAlive._cbGlobalc                 C   s   | j rd | _ | jj ¡  d S rx   )rž   rŠ   r‹   r›   ©r8   r:   r:   r;   r¨   -  s    z_KeepAlive._ebGlobalN)rI   rJ   rK   r¢   rŸ   r§   r¨   r:   r:   r:   r;   rŒ     s   rŒ   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )r�   c                 C   s   | a g | _i | _tƒ  d S rx   )rŠ   r,   r-   rš   r¬   r:   r:   r;   ÚserviceStarted4  s    zSSHConnection.serviceStartedc                 C   s(   | j }g | _ |D ]}| ¡  qtƒ  d S rx   )r,   r›   r�   )r8   Úlfr(   r:   r:   r;   ÚserviceStopped;  s
    
zSSHConnection.serviceStoppedc                 C   sX   t  d|f¡}| jd|dd�}t d|› d|› �¡ | | j||¡ | | j||¡ d S )Nú0.0.0.0s   tcpip-forwardr1   r£   zrequesting remote forwarding r=   )	r   ÚpackGlobal_tcpip_forwardr¥   r   rŽ   ZaddCallbackÚ_cbRemoteForwardingr‚   Ú_ebRemoteForwarding)r8   rB   r™   Údatar©   r:   r:   r;   r�   B  s
    z%SSHConnection.requestRemoteForwardingc                 C   s4   t  d|› d|› �¡ || j|< t  t| jƒ¡ d S )Nzaccepted remote forwarding r=   )r   rŽ   r-   Úrepr)r8   ÚresultrB   r™   r:   r:   r;   r²   I  s    
z!SSHConnection._cbRemoteForwardingc                 C   s&   t  d|› d|› d�¡ t  |¡ d S )Nzremote forwarding r=   z failed©r   rŽ   )r8   r    rB   r™   r:   r:   r;   r³   N  s    z!SSHConnection._ebRemoteForwardingc                 C   s`   t  d|f¡}|  d|¡ t d|› �¡ z| j|= W n tk
rJ   Y nX t t| jƒ¡ d S )Nr°   s   cancel-tcpip-forwardzcancelling remote forwarding )r   r±   r¥   r   rŽ   r-   Ú	Exceptionrµ   )r8   rB   r´   r:   r:   r;   rœ   R  s    z$SSHConnection.cancelRemoteForwardingc                 C   s€   t  d|›�¡ t |¡\}}t  | j¡ t  |¡ |d | jkrp| j|d  }t  d|› �¡ t|||| d�S ttjdƒ‚d S )NzFTCP r1   zconnect forwarding )ZremoteWindowZremoteMaxPacketrŠ   zdon't know about that port)	r   rŽ   r   ZunpackOpen_forwarded_tcpipr-   ÚSSHConnectForwardingChannelr   r   ZOPEN_CONNECT_FAILED)r8   Z
windowSizeZ	maxPacketr´   ZremoteHPZorigHPZ	connectHPr:   r:   r;   Úchannel_forwarded_tcpip\  s"    
   ÿ ÿz%SSHConnection.channel_forwarded_tcpipc                 C   sT   t  d|› �¡ t  | j¡ t| jƒdkr<t  d¡ tƒ  n| jjd  | |¡ d S )Nzconnection closing r1   zstopping connectionr   )r   rŽ   Úchannelsr3   r�   Ú	__class__Ú	__bases__ÚchannelClosed)r8   r	   r:   r:   r;   r¾   l  s    
zSSHConnection.channelClosedN)rI   rJ   rK   r­   r¯   r�   r²   r³   rœ   rº   r¾   r:   r:   r:   r;   r�   3  s   
r�   c                   @   sp   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r‘   s   sessionc           	         sÐ  t  dˆ j› d�¡ td r>ˆ jjˆ dddd�}| dd	„ ¡ td
 rJd S td rZtd sbtd shtƒ  t 	¡ }td r�td s�dˆ _
ˆ j|_nˆ j|_‡ fdd	„|_t |¡ˆ _d}td rÚˆ j ˆ dt td ¡¡ nòtd �r^td �rBtjd }t |tjd¡}t d|¡}t ||d¡}ˆ j ˆ d|¡ t tjˆ j¡ ˆ j ˆ dt td ¡¡ nntd �s¼tjd }t |tjd¡}t d|¡}t ||d¡}ˆ j ˆ d|¡ t tjˆ j¡ ˆ j ˆ dd¡ d S )Nzsession z openr‡   s   auth-agent-req@openssh.comrV   r1   r£   c                 S   s
   t  | ¡S rx   r·   ©Úxr:   r:   r;   rU   €  rV   z(SSHSession.channelOpen.<locals>.<lambda>r%   r*   r!   r#   r   c                    s   ˆ   ¡ S rx   )ÚsendEOFr¿   r¬   r:   r;   rU   ‹  rV   r   r'   s	   subsystemÚTERMÚ12345678Ú4HÚ s   pty-reqs   execs   shell)r   rŽ   ÚidrM   rŠ   ÚsendRequestr¦   Ú_enterRawModer   ZSSHSessionClientÚ
escapeModeÚhandleInputÚdataReceivedÚwriteZconnectionLostr   Z
StandardIOr
   ZNSr’   ÚenvironÚfcntlÚioctlr!   Ú
TIOCGWINSZÚstructÚunpackZpackRequest_pty_reqrd   rg   Ú_windowResized)	r8   Zfoor©   Úcrq   ZtermÚwinszÚwinSizeZ
ptyReqDatar:   r¬   r;   ÚchannelOpenz  sP       ÿ





zSSHSession.channelOpenc              	   C   s&  |dkrd| _ |  |¡ �n| j dkr:|td kr:d| _ nè| j dk�rd| _ |dkrht d¡ tƒ  d S |dkrˆdd	„ }t d
|¡ d S |dkrªt d¡ | jj	 
¡  d S |dk�r| j d¡ | jj ¡ }| ¡  |D ]$}| j td || jj| ¡ƒ¡ qØd S |  d| ¡ nd
| _ |  |¡ d S )N)ó   
ó   r1   r   r0   ó   .zdisconnecting from escapeó   c                   S   s6   t ƒ  tj ¡  tj ¡  t t ¡ tj	¡ t
ƒ  d S rx   )Ú_leaveRawModer6   r[   Úflushr_   r’   ÚkillÚgetpidrd   ZSIGTSTPrÈ   r:   r:   r:   r;   Ú_³  s
    

z!SSHSession.handleInput.<locals>._r   ó   Rzrekeying connectionó   #s'   
The following connections are open:
z
  #{} {}
ó   ~)rÉ   rÌ   rM   r   rŽ   r�   r   rR   rŠ   r‹   ZsendKexInitr   r»   ÚkeysÚsortr   rk   )r8   Úcharrà   r»   Z	channelIdr:   r:   r;   rÊ   ¥  sH    


 
ÿÿÿzSSHSession.handleInputc                 C   s   | j  |¡ d S rx   )r   rÌ   ©r8   r´   r:   r:   r;   rË   Ò  s    zSSHSession.dataReceivedc                 C   sN   |t jkrJt dt|ƒ› d�¡ ttjƒtkr>tjj	 
|¡ ntj 
|¡ d S )Nzgot z stderr data)r   ZEXTENDED_DATA_STDERRr   rŽ   r3   r   r6   r]   ÚstrÚbufferrÌ   )r8   r"   r´   r:   r:   r;   ÚextReceivedÕ  s
    
zSSHSession.extReceivedc                 C   s   t  d¡ | j ¡  d S )Nzgot eof)r   rŽ   r   ZloseWriteConnectionr¬   r:   r:   r;   ÚeofReceivedÝ  s    
zSSHSession.eofReceivedc                 C   s    t  d| › �¡ | j | ¡ d S )Nzremote side closed )r   rŽ   rŠ   Z	sendCloser¬   r:   r:   r;   ÚcloseReceivedá  s    zSSHSession.closeReceivedc                 C   s&   t  d| › �¡ t  t| jjƒ¡ d S )Nzclosed )r   rŽ   rµ   rŠ   r»   r¬   r:   r:   r;   Úclosedå  s    zSSHSession.closedc                 C   s(   t t d|¡d ƒat dt› �¡ d S )Nz>Lr   zexit status: )r?   rÑ   rÒ   rl   r   rŽ   rç   r:   r:   r;   Úrequest_exit_statusê  s    zSSHSession.request_exit_statusc                 C   s   | j  | ¡ d S rx   )rŠ   rÁ   r¬   r:   r:   r;   rÁ   ï  s    zSSHSession.sendEOFc                 C   s   | j  ¡  d S rx   )r   ZpauseProducingr¬   r:   r:   r;   ÚstopWritingò  s    zSSHSession.stopWritingc                 C   s   | j  ¡  d S rx   )r   ZresumeProducingr¬   r:   r:   r;   ÚstartWritingõ  s    zSSHSession.startWritingc                 G   sV   t  dtjd¡}t d|¡}|d |d |d |d f}| j | dtjd	|žŽ ¡ d S )
Nr   rÃ   rÄ   r1   r0   rˆ   s   window-changeú!4L)rñ   )	rÎ   rÏ   r!   rÐ   rÑ   rÒ   rŠ   rÇ   Úpack)r8   rm   rÕ   rÖ   ZnewSizer:   r:   r;   rÓ   ø  s    zSSHSession._windowResizedN)rI   rJ   rK   Únamer×   rÊ   rË   rê   rë   rì   rí   rî   rÁ   rï   rð   rÓ   r:   r:   r:   r;   r‘   w  s   +-r‘   c                   @   s   e Zd ZdS )r�   N©rI   rJ   rK   r:   r:   r:   r;   r�   ÿ  s   r�   c                   @   s   e Zd ZdS )r¹   Nrô   r:   r:   r:   r;   r¹     s   r¹   c                  C   s*   t sd S tj ¡ } t | tjt¡ da d S rQ   )Ú
_inRawModer6   r_   r`   r!   re   rf   Ú_savedRawMode)rq   r:   r:   r;   rÜ     s
    
rÜ   c                  C   sZ  t rd S tj ¡ } zt | ¡}|d d … }W n  tk
rL   t d¡ Y �n
X |d tj	B |d< |d tj
tjB tjB tjB tjB tjB tjB  @ |d< ttdƒr¶|d tj @ |d< |d tjtjB tjB tjB tjB tjB tjB  @ |d< ttdƒ�r|d tj @ |d< |d tj @ |d< d|d tj< d|d tj< |at | tj|¡ da d S )Nznot a typewriter!r   ÚIUCLCrˆ   ÚIEXTENr1   é   ) rõ   r6   r_   r`   r!   ra   rc   r   rŽ   ZIGNPARZISTRIPZINLCRZIGNCRZICRNLZIXONZIXANYZIXOFFr‰   r÷   ZISIGZICANONÚECHOZECHOEZECHOKZECHONLrø   ZOPOSTZVMINZVTIMErö   re   rf   )rq   rb   Únewr:   r:   r;   rÈ     sb    

ÿþýüûúÿ
	
ÿþýüûúÿ
	rÈ   Ú__main__)<rÎ   r   r’   rd   rÑ   r6   r!   Útypingr   r   r   Ztwisted.conch.clientr   r   Ztwisted.conch.client.optionsr   Ztwisted.conch.errorr   Ztwisted.conch.sshr	   r
   r   r   r   Ztwisted.internetr   r   r   rt   r   r   Ztwisted.python.compatr   r   r   rM   rL   rŠ   rl   rb   rõ   rö   ri   rw   ru   r^   rƒ   rš   rS   r�   r�   rŒ   r�   Z
SSHChannelr‘   r�   r¹   rÜ   rÈ   rI   r:   r:   r:   r;   Ú<module>   sR    V<
$D 		2
