U
    P|jÙ\  ã                   @   s’  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	m
Z ddl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mZmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z% dd	l&m'Z'm(Z( G d
d„ dej)ƒZ*G dd„ de(j+ƒZ,da-da.da/da0dd„ Z1dd„ Z2dd„ Z3G dd„ de#j4ƒZ5G dd„ dej6ƒZ6G dd„ dej7ƒZ7G dd„ dej8ƒZ8G dd„ dej9ƒZ:e;dk�rŽe2ƒ  dS )z2
Implementation module for the `tkconch` command.
é    N)ÚListÚTuple)Úerror)ÚisInKnownHosts)ÚchannelÚcommonÚ
connectionÚ
forwardingÚkeysÚsessionÚ	transportÚuserauth)Útkvt100)ÚdeferÚprotocolÚreactorÚ	tksupport)ÚlogÚusagec                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTkConchMenuc                 O   sò  t jj| f|ž|Ž | j d¡ t  ¡ | _| j d¡ t j| dddd�j	dddd� t  
| ¡| _| jj	d	d	dd
d� t j| dddd�j	dd	dd� t  
| ¡| _| jj	d	d	d	d
d� t j| dddd�j	dddd� t  
| ¡| _| jj	d	d	dd
d� t j| dddd�j	dddd� t  
| ¡| _| jj	d	d	dd
d� t j| dddd�j	dddd� t  
| ¡| _| jj	d	dd
d� t j| | jdd�j	ddd
d� t j| dd�j	dddd� t j| ddd�| _| jj	d	d	dd
d� t j| d| jd�j	ddd� t j| d| jd�j	ddd� t  
| ¡| _| jj	d	dd
d� t j| dd�j	ddd
d� t  
| ¡| _| jj	d	dd
d� t j| d d�j	ddd
d� t j| d!| jdd"�| _| jj	d	d#d� t j| d$| jd%d"�| _| jj	dd#d� t j| d&d�j	ddd'd
d� t j| ddd(d�j	dd)dd� t j
| d*d+�| _| jj	d	d	d)d
d� t j| ddd,d�j	dd-dd� t j
| d.d+�| _| jj	d	d	d-d
d� t j| ddd/d�j	dd0dd� t j
| d1d+�| _| jj	d	d	d0d
d� t j| d2| jd�j	ddd3d
d� | jddd4d5� | j d	dd	d5� | j !d6t"j#¡ d S )7NÚTkConchÚlocalÚwÚleftZHostname)ÚanchorZjustifyÚtexté   )ÚcolumnÚrowÚstickyé   Znesw)r   Z
columnspanr   r   ZPortZUsernameé   ÚCommandé   ZIdentityé   ZBrowse)Úcommandr   zPort Forwarding)r   é   r   )ÚheightÚwidthZAdd)r   r%   é   )r   r   ZRemoveé   ÚHostZLocal)r   ÚvariableÚvalueé	   ZRemoteÚremotezAdvanced Optionsé
   ZCipheré   Úcipher)ÚnameZMACé   ÚmaczEscape Charé   ÚescapezConnect!é   é@   )ZweightZminsizeZWM_DELETE_WINDOW)$ÚTkinterÚFrameÚ__init__ÚmasterÚtitleZ	StringVarÚlocalRemoteVarÚsetZLabelZgridZEntryÚhostÚportÚuserr%   ÚidentityZButtonÚgetIdentityFileZListboxÚforwardsÚ
addForwardÚremoveForwardÚforwardPortÚforwardHostZRadiobuttonZlocalForwardZremoteForwardr2   r5   r7   Ú	doConnectZgrid_rowconfigureZgrid_columnconfigurer   ÚsysÚexit)ÚselfÚargsÚparams© rQ   úA/tmp/pip-unpacked-wheel-audpp6lv/twisted/conch/scripts/tkconch.pyr<   '   sØ    
  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ ÿ   ÿ   ÿ   ÿ  ÿ  ÿ  ÿ   ÿzTkConchMenu.__init__c                 C   s0   t  ¡ }|r,| j dtj¡ | j tj|¡ d S ©Nr   )ÚtkFileDialogZaskopenfilenamerD   Údeleter:   ÚENDÚinsert)rN   ÚrrQ   rQ   rR   rE   …   s    zTkConchMenu.getIdentityFilec                 C   s€   | j  ¡ }| j  dtj¡ | j ¡ }| j dtj¡ | j ¡ dkr`| j tjd|› d|› �¡ n| j tjd|› d|› �¡ d S )Nr   r   úL:ú:úR:)	rI   ÚgetrU   r:   rV   rJ   r?   rF   rW   )rN   rB   rA   rQ   rQ   rR   rG   ‹   s    

zTkConchMenu.addForwardc                 C   s"   | j  ¡ }|r| j  |d ¡ d S rS   )rF   ZcurselectionÚremove)rN   ÚcurrQ   rQ   rR   rH   •   s    
zTkConchMenu.removeForwardc           	      C   s²  d}| j  ¡ td< | j ¡ td< | j ¡ td< | j ¡ td< | j ¡ }| j ¡ }| j ¡ }|r‚|t	j
krr|gt	_
nt dd¡ d}|r®|t	jkrš|gt	_n|r®t dd	¡ d}|�r*|d
krÆd td< nd|d dkrøt|ƒdkrøtt|d ƒd ƒtd< n2t|ƒdk�r|td< n|�r*t dd| ¡ d}| j ¡ �rHtj | j ¡ ¡ | j dtj¡D ]:}|d dk�r~t |dd … ¡ nt |dd … ¡ �qXdtd k�r¾td  dd¡\td< td< td �rÒtd �sè|�rèt dd¡ d}|�r¦| j ¡  | j ¡  td �r&tj}t  tj!¡ |t_nt "¡  t#t_$tj�sFddgt_td }t%td �p\dƒ}t &||f¡ t' (||t)ƒ ¡ t*j +¡  t*j ,d -td td ¡¡ n|  .¡  d S )Nr   rA   rB   rC   r%   r   zBad cipher.r   zBad MAC.Únoner7   ú^r    r9   zBad escape character '%s'.ÚLú@zMissing host or username.r   z~/.ssh/id_rsaz~/.ssh/id_dsaé   z{}@{} - TkConch)/rA   r\   ÚoptionsrB   rC   r%   r2   r5   r7   ÚSSHClientTransportÚsupportedCiphersÚtkMessageBoxZ	showerrorÚsupportedMACsÚlenÚchrÚordrD   Ú	identitysÚappendrF   r:   rV   Úopt_localforwardÚopt_remoteforwardÚsplitr=   ÚquitÚdestroyrL   Ústdoutr   ZstartLoggingÚstderrZdiscardLogsÚhandleErrorÚdeferrÚintÚmsgr   Z
connectTCPÚSSHClientFactoryÚframeZ	deiconifyr>   ÚformatZfocus)	rN   Úfinishedr2   r5   r7   ÚlineZrealoutrA   rB   rQ   rQ   rR   rK   š   sx    













ÿzTkConchMenu.doConnectN)Ú__name__Ú
__module__Ú__qualname__r<   rE   rG   rH   rK   rQ   rQ   rQ   rR   r   &   s
   ^
r   c                   @   sš  e Zd ZU dZddddgdddd	gd
dddgddddgddddgd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d/d0d1gd2d3d4ggZejjZ	ejj
Zejd5ge d6d7„ e	D ƒ¡e d8d7„ eD ƒ¡ejd9d:�ejd9d:�d;œe ¡ ejd<d:�ejd=d>d?�gd@�Zg Zee edA< g Zeeeeeef f  edB< g Zeeeeeef f  edC< dDdE„ ZdFdG„ ZdHdI„ ZdJdK„ ZdLdM„ ZdS )NÚGeneralOptionsz,Usage:    tkconch [options] host [command]
 rC   ÚlNzLog in using this user name.rD   Úiz~/.ssh/identityz&Identity for public key authenticationr7   Úeú~z(Set escape character; ``none'' = disabler2   ÚczSelect encryption algorithm.ÚmacsÚmz.Specify MAC algorithms for protocol version 2.rB   Úpz7Connect to this port.  Server must be on the same port.Úlocalforwardra   z<listen-port:host:port   Forward local port to remote addressÚremoteforwardÚRz<listen-port:host:port   Forward remote port to local addressÚttyÚtz-Tty; allocate a tty even if command is given.ÚnottyÚTzDo not allocate a tty.ÚversionÚVzDisplay version number only.ÚcompressÚCzEnable compression.ÚnoshellÚNz"Do not execute a shell or command.Ú	subsystemÚsz-Invoke command (mandatory) as SSH2 subsystem.r   ÚvzLog to stderrÚansilogÚaz!Print the received data to stdout)r�   r�   c                 C   s   g | ]}|  ¡ ‘qS rQ   ©Údecode©Ú.0r™   rQ   rQ   rR   Ú
<listcomp>  s     zGeneralOptions.<listcomp>c                 C   s   g | ]}|  ¡ ‘qS rQ   rœ   rž   rQ   rQ   rR   r      s     zlisten-port:host:port)Údescr)r2   r‡   rŠ   r‹   r%   ÚargumentT)r¡   Úrepeat)ZmutuallyExclusiveZ
optActionsZextraActionsrl   ÚlocalForwardsÚremoteForwardsc                 C   s   | j  |¡ d S ©N)rl   rm   )rN   rƒ   rQ   rQ   rR   Úopt_identity  s    zGeneralOptions.opt_identityc                 C   s8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ d S ©NrZ   )rp   rw   r¤   rm   )rN   ÚfÚ	localPortZ
remoteHostÚ
remotePortrQ   rQ   rR   rn      s    zGeneralOptions.opt_localforwardc                 C   s8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ d S r¨   )rp   rw   r¥   rm   )rN   r©   r«   ZconnHostZconnPortrQ   rQ   rR   ro   &  s    z GeneralOptions.opt_remoteforwardc                 C   s   dgt jdd…< d S )NÚzlibr   r   )re   ZsupportedCompressions©rN   rQ   rQ   rR   Úopt_compress,  s    zGeneralOptions.opt_compressc                 G   s<   |r(|d | d< d  |dd … ¡| d< nd| d< d| d< d S )Nr   rA   ú r   r%   Ú )Újoin)rN   rO   rQ   rQ   rR   Ú	parseArgs/  s
    zGeneralOptions.parseArgs)r~   r   r€   ZsynopsisZoptParametersZoptFlagsr   re   rf   Z_ciphersrh   Z_macsr   ZCompletionsZCompleteListZ	CompleterZCompleteUserAtHostZcompDatarl   r   ÚstrÚ__annotations__r¤   r   rw   r¥   r§   rn   ro   r®   r²   rQ   rQ   rQ   rR   r�   ã   sb   






üüóø

ü
ýø  r�   c                    sJ   t jrtdƒ‚t ¡ ‰ g }|f‡ ‡fdd„	}|t _t  | ¡ t j ¡  ˆ S )Nzcan't ask 2 questions at once!c                    sª   | sd S | dkrt  ¡  | dkrJt d¡ d |¡}~d t_ˆ  |¡ d S dt| ƒ  krbdk r€n n| | ¡ ˆr¦t | ¡ n&t| ƒdkr¦|r¦ˆržt d¡ | ¡  d S )	Núúz
r°   é    é   r*   z )	r   Ústoprz   Úwriter±   Úcallbackrk   rm   Úpop)ÚchÚrespZstresp©ÚdÚechorQ   rR   ÚgotCharE  s&    




z!deferredAskFrame.<locals>.gotChar)rz   r»   Ú
ValueErrorr   ZDeferredrº   ÚcanvasÚfocus_force)ZquestionrÁ   r¾   rÂ   rQ   r¿   rR   ÚdeferredAskFrame?  s    

rÆ   c               
   C   s–  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 ¡ }| ¡  t ¡ }t|ƒa	t	j
tjtjdd� tƒ azt | ¡ W nD tjk
�r< } z"td	| ƒ t ¡  t  d¡ W 5 d }~X Y nX t ¡ D ]0\}}|�rFtt	|ƒ�rFtt	|ƒ tj|¡ �qFtjD ]0\}\}	}
t	j tjd
|› d|	› d|
› �¡ �q~g t_tjD ]0\}\}	}
t	j tjd|› d|	› d|
› �¡ �q¼g t_tj|d d�a|  dtj!tj" d tj#tj$ d f ¡ tj
tjd� t% &|¡ | ¡  td �r`td �sndtd k�rxt	 '¡  n| (¡  t) *¡  t  t+¡ d S )Nr   z-lr    r#   z-or   ú-)ÚsideÚfillÚexpandz	ERROR: %srY   rZ   r[   )r»   z%dx%dr!   )rÈ   rA   rC   rb   ),rL   ÚargvÚindexrÃ   r:   ZTkZwithdrawZToplevelr   ÚmenuÚpackZTOPZBOTHr�   rd   ZparseOptionsr   Z
UsageErrorÚprintZopt_helprM   ÚitemsÚhasattrÚgetattrrW   rV   r¤   rF   r¥   r   Z
VT100Framerz   ZgeometryZ	fontWidthr(   Z
fontHeightr'   r   ÚinstallrK   Zmainloopr   ÚrunÚ
exitStatus)rO   rƒ   ÚargÚrootÚtopÚuÚkr™   r‰   ZrhÚrprQ   rQ   rR   rÔ   `  s^    

$&&ÿÿ
"
rÔ   c                  C   s,   ddl m}  dat |  ¡ ¡ t ¡  ‚ d S )Nr   ©Úfailurer    )Útwisted.pythonrÝ   rÕ   r   ÚerrZFailurer   r¹   rÜ   rQ   rQ   rR   ru   “  s
    ru   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ry   Tc                 C   s   t  ¡  d S r¦   )r   r¹   r­   rQ   rQ   rR   ÚstopFactory   s    zSSHClientFactory.stopFactoryc                 C   s   t ƒ S r¦   )re   )rN   ÚaddrrQ   rQ   rR   ÚbuildProtocol£  s    zSSHClientFactory.buildProtocolc                 C   s    t  dd|j› d|j› �¡ d S )Nr   zConnection Failed, Reason:
 z: )rg   ÚshowwarningÚtyper-   )rN   Z	connectorÚreasonrQ   rQ   rR   ÚclientConnectionFailed¦  s    þz'SSHClientFactory.clientConnectionFailedN)r~   r   r€   Znoisyrà   râ   ræ   rQ   rQ   rQ   rR   ry   �  s   ry   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )re   c                 C   s   d||f a d S )NzDconch:	Remote side disconnected with error code %i
conch:	reason: %s)rÕ   )rN   ÚcodeÚdescrQ   rQ   rR   ÚreceiveError®  s    ÿÿzSSHClientTransport.receiveErrorc                 C   s    d||f a tj | ||¡ d S )Nz>conch:	Sending disconnect with error code %i
conch:	reason: %s)rÕ   r   re   ÚsendDisconnect)rN   rç   rå   rQ   rQ   rR   rê   µ  s
    ÿÿz!SSHClientTransport.sendDisconnectc                 C   s   |st d rt d| ¡ d S )Nr   zReceived Debug Message: %s)rd   r   rx   )rN   ZalwaysDisplayÚmessageÚlangrQ   rQ   rR   ÚreceiveDebug½  s    zSSHClientTransport.receiveDebugc                 C   sÞ   t td |dd iƒ}|dkr&t d¡S |dkr>t t d¡¡S td | j ¡ j	krdtd }td }n0d 
td | j ¡ j	¡}d 
td | j ¡ j	¡}t |¡d }d	 
|d
ddœ| |¡}|d7 }t|dƒ | j|||¡S d S )NrA   zknown-hostsr   r    úbad host keyz{} ({})z{},{}r   zNThe authenticity of host '{}' can't be established.
{} key fingerprint is {}.ÚDSAÚRSA©s   ssh-dsss   ssh-rsaz9
Are you sure you want to continue connecting (yes/no)? )r   rd   r   ÚsucceedZfailr   Ú
ConchErrorr   ZgetPeerrA   r{   r   ZgetNSrÆ   ÚaddCallbackÚ_cbVerifyHostKey)rN   ÚpubKeyÚfingerprintZgoodKeyrA   ÚkhHostÚkeyTypeZquesrQ   rQ   rR   ÚverifyHostKeyÂ  s.    

ü
   ÿz SSHClientTransport.verifyHostKeyc              	   C   sÐ   |  ¡ dkr$tddƒ | j|||¡S |  ¡ dkrDt d¡ t d¡‚zdt d|dd	d
œ| f ¡ tt	j
 d¡dƒ�,}t |¡}| d|› d|› d|› �¡ W 5 Q R X W n" tk
rÊ   t ¡  tj‚Y nX d S )N)ÚyesÚnozPlease type  'yes' or 'no': r   rü   zHost key verification failed.
rî   zBWarning: Permanently added '%s' (%s) to the list of known hosts.
rï   rð   rñ   z~/.ssh/known_hostsr›   Ú
r¯   )ÚlowerrÆ   rô   rõ   rz   rº   r   ró   ÚopenÚosÚpathÚ
expanduserÚbase64Ú	b64encodeÚBaseExceptionr   rv   )rN   Úansrö   rø   rù   Zknown_hostsZ
encodedKeyrQ   rQ   rR   rõ   ß  s,    
   ÿ

þÿ
*z#SSHClientTransport._cbVerifyHostKeyc                 C   s0   t d rt d }nt ¡ }|  t|tƒ ƒ¡ d S )NrC   )rd   ÚgetpassÚgetuserZrequestServiceÚSSHUserAuthClientÚSSHConnection)rN   rC   rQ   rQ   rR   ÚconnectionSecureô  s    
z#SSHClientTransport.connectionSecureN)	r~   r   r€   ré   rê   rí   rú   rõ   r  rQ   rQ   rQ   rR   re   ­  s   re   c                   @   s@   e Zd ZU g Zee ed< ddd„Zdd„ Zdd„ Z	d	d
„ Z
dS )r	  Ú	usedFilesNc                 C   s    |sd  | jtd ¡}t|dƒS )Nz{}@{}'s password: rA   r   )r{   rC   rd   rÆ   )rN   ÚpromptrQ   rQ   rR   ÚgetPasswordÿ  s    zSSHUserAuthClient.getPasswordc                    s’   ‡ fdd„t jD ƒ}|sd S |d }t |¡ ˆ j |¡ tj |¡}|d7 }tj 	|¡s^d S zt
j |¡ ¡ W S  tk
rŒ   ˆ  ¡  Y S X d S )Nc                    s   g | ]}|ˆ j kr|‘qS rQ   )r  )rŸ   Úxr­   rQ   rR   r      s     
 z2SSHUserAuthClient.getPublicKey.<locals>.<listcomp>r   z.pub)rd   rl   r   rx   r  rm   r   r  r  Úexistsr
   ÚKeyÚfromFileZblobr  ÚgetPublicKey)rN   ÚfilesÚfilerQ   r­   rR   r    s    
zSSHUserAuthClient.getPublicKeyc              
   C   sš   t j | jd ¡}t j |¡s"d S zt tj 	|¡j
¡W S  tjk
r” } z<|jd dkr„d| jd  }t|dƒ | jd¡ W Y ¢S W 5 d }~X Y nX d S )Néÿÿÿÿr   zencrypted key with no passwordúEnter passphrase for key '%s': )r   r  r  r  r  r   rò   r
   r  r  Ú	keyObjectÚBadKeyErrorrO   rÆ   rô   Ú_cbGetPrivateKey)rN   r  r„   r  rQ   rQ   rR   ÚgetPrivateKey  s    zSSHUserAuthClient.getPrivateKeyc                 C   sr   t j | jd ¡}ztjj||d�jW S  tjk
rl   |dkrB‚ d| jd  }t	|dƒ 
| j|d ¡ Y S X d S )Nr  )Úpasswordr    r  r   r   )r   r  r  r  r
   r  r  r  r  rÆ   rô   r  )rN   r  Úcountr  r  rQ   rQ   rR   r    s    
 ÿz"SSHUserAuthClient._cbGetPrivateKey)N)r~   r   r€   r  r   r³   r´   r  r  r  r  rQ   rQ   rQ   rR   r	  ü  s
   

r	  c                   @   s   e Zd Zdd„ ZdS )r
  c              	   C   s’   t d s|  tƒ ¡ t jrBt jD ] \}}t |t | |tj¡¡ q t j	rŽt j	D ]>\}}t
 d ||¡¡ t d|f¡}|  d|¡ || j	|< qNd S )Nr•   z&asking for remote forwarding for {}:{}z0.0.0.0ztcpip-forward)rd   ZopenChannelÚ
SSHSessionr¤   r   Z	listenTCPr	   ZSSHListenForwardingFactoryZ SSHListenClientForwardingChannelr¥   r   rx   r{   ZpackGlobal_tcpip_forwardZsendGlobalRequest)rN   rª   Úhostportr«   ÚdatarQ   rQ   rR   ÚserviceStarted-  s.      ÿþ ÿÿzSSHConnection.serviceStartedN)r~   r   r€   r!  rQ   rQ   rQ   rR   r
  ,  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S )r  s   sessionc                 C   s  d| _ t ¡ }td r | j|_n| j|_| j|_|jt	_
t	j ¡  td rf| j | dt td ¡¡ n¤td rÂtd r¦tj dd¡}d	}t ||d
¡}| j | d|¡ | j | dt td ¡¡ nHtd sútj dd¡}d	}t ||d
¡}| j | d|¡ | j | dd¡ | jjj d¡ d S )Nr   r7   r—   s	   subsystemr%   r�   ÚTERMZxterm)é   éP   r   r   r°   s   pty-reqÚexecr�   s   shelló    )Ú
escapeModer   ZSSHSessionClientrd   ÚhandleInputÚdataReceivedrº   ÚsendEOFZconnectionLostrz   r»   rÄ   rÅ   ÚconnZsendRequestr   ZNSr   Úenvironr\   ZpackRequest_pty_reqr   ZsetTcpNoDelay)rN   Zfoor†   ZtermZwinSizeZ
ptyReqDatarQ   rQ   rR   ÚchannelOpenG  s0    

zSSHSession.channelOpenc                 C   sÊ   |dkrd| _ |  |¡ n¬| j dkr8|td kr8d| _ nŽ| j dkr¶d| _ |dkrft d¡ t ¡  d S |dkr„t t 	¡ t
j¡ d S |dkr¦t d	¡ | jj ¡  d S |  d
| ¡ nd| _ |  |¡ d S )N)rý   r¶   r   r7   r    Ú.zdisconnecting from escapeúrŒ   zrekeying connectionr…   r   )r'  rº   rd   r   rx   r   r¹   r   ÚkillÚgetpidÚsignalÚSIGSTOPr+  r   ZsendKexInit)rN   ÚcharrQ   rQ   rR   r(  h  s*    


zSSHSession.handleInputc                 C   s,   |  d¡}td rtt|ƒƒ t |¡ d S )Nzutf-8rš   )r�   rd   rÏ   Úreprrz   rº   ©rN   r   rQ   rQ   rR   r)  ‚  s    
zSSHSession.dataReceivedc                 C   s6   |t jkr2t dt|ƒ ¡ tj |¡ tj ¡  d S )Nzgot %s stderr data)	r   ZEXTENDED_DATA_STDERRr   rx   ri   rL   rt   rº   Úflush)rN   rŽ   r   rQ   rQ   rR   ÚextReceivedˆ  s    
zSSHSession.extReceivedc                 C   s   t  d¡ tj ¡  d S )Nzgot eof)r   rx   rL   ÚstdinÚcloser­   rQ   rQ   rR   ÚeofReceivedŽ  s    
zSSHSession.eofReceivedc                 C   s*   t  d|  ¡ t| jjƒdkr&t ¡  d S )Nz	closed %sr   )r   rx   ri   r+  Zchannelsr   r¹   r­   rQ   rQ   rR   Úclosed’  s    zSSHSession.closedc                 C   s&   t t d|¡d ƒat dt ¡ d S )Nz>Lr   zexit status: %s)rw   ÚstructÚunpackrÕ   r   rx   r6  rQ   rQ   rR   Úrequest_exit_status—  s    zSSHSession.request_exit_statusc                 C   s   | j  | ¡ d S r¦   )r+  r*  r­   rQ   rQ   rR   r*  œ  s    zSSHSession.sendEOFN)r~   r   r€   r3   r-  r(  r)  r8  r;  r<  r?  r*  rQ   rQ   rQ   rR   r  D  s   !r  Ú__main__)<Ú__doc__r  r  r   r2  r=  rL   Útkinterr:   Ztkinter.filedialogZ
filedialogrT   Ztkinter.messageboxZ
messageboxrg   Útypingr   r   Ztwisted.conchr   Ztwisted.conch.client.defaultr   Ztwisted.conch.sshr   r   r   r	   r
   r   r   r   Ztwisted.conch.uir   Ztwisted.internetr   r   r   r   rÞ   r   r   r;   r   ÚOptionsr�   rd   rÍ   rÕ   rz   rÆ   rÔ   ru   ZClientFactoryry   re   r	  r
  Z
SSHChannelr  r~   rQ   rQ   rQ   rR   Ú<module>   sB   (
 >V!3
O0\
