o
    ¯bÞ\  ã                   @   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 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| g|¢R i |¤Ž | 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ÚleftÚHostname)ÚanchorÚjustifyÚtexté   )ÚcolumnÚrowÚstickyé   Únesw)r   Ú
columnspanr    r!   ÚPortÚUsernameé   ÚCommandé   ÚIdentityé   ÚBrowse)Úcommandr   zPort Forwarding)r   é   r   )ÚheightÚwidthÚAdd)r   r-   é   )r   r    ÚRemoveé   ÚHostÚLocal)r   ÚvariableÚvalueé	   ÚRemoteÚremotezAdvanced Optionsé
   ÚCipheré   Úcipher)ÚnameÚMACé   ÚmaczEscape Charé   ÚescapezConnect!é   é@   )ÚweightÚminsizeÚWM_DELETE_WINDOW)$ÚTkinterÚFrameÚ__init__ÚmasterÚtitleÚ	StringVarÚlocalRemoteVarÚsetÚLabelÚgridÚEntryÚhostÚportÚuserr-   ÚidentityÚButtonÚgetIdentityFileÚListboxÚforwardsÚ
addForwardÚremoveForwardÚforwardPortÚforwardHostÚRadiobuttonÚlocalForwardÚremoteForwardr?   rC   rE   Ú	doConnectÚgrid_rowconfigureÚgrid_columnconfigurer   ÚsysÚexit)ÚselfÚargsÚparams© rm   ú?/usr/lib/python3/dist-packages/twisted/conch/scripts/tkconch.pyrM   '   sš   
ÿÿÿÿÿÿÿ
ÿ
ÿÿÿÿÿÿzTkConchMenu.__init__c                 C   s4   t  ¡ }|r| j dtj¡ | j tj|¡ d S d S ©Nr   )ÚtkFileDialogÚaskopenfilenamerY   ÚdeleterK   ÚENDÚinsert)rj   Úrrm   rm   rn   r[   …   s
   þzTkConchMenu.getIdentityFilec                 C   s‚   | j  ¡ }| j  dtj¡ | j ¡ }| j dtj¡ | j ¡ dkr1| j tjd|› d|› �¡ d S | j tjd|› d|› �¡ d S )Nr   r   úL:ú:úR:)	r`   Úgetrr   rK   rs   ra   rQ   r]   rt   )rj   rW   rV   rm   rm   rn   r^   ‹   s   

  zTkConchMenu.addForwardc                 C   s&   | j  ¡ }|r| j  |d ¡ d S d S ro   )r]   ÚcurselectionÚremove)rj   Úcurrm   rm   rn   r_   •   s   
ÿzTkConchMenu.removeForwardc           	      C   s   d}| j  ¡ td< | j ¡ td< | j ¡ td< | j ¡ td< | j ¡ }| j ¡ }| j ¡ }|rA|t	j
v r9|gt	_
nt dd¡ d}|rW|t	jv rM|gt	_n
|rWt dd	¡ d}|r’|d
krbd td< n0|d dkr{t|ƒdkr{tt|d ƒd ƒtd< nt|ƒdkr†|td< n|r’t dd| ¡ d}| j ¡ r tj | j ¡ ¡ | j dtj¡D ]}|d dkrºt |dd … ¡ q¨t |dd … ¡ q¨dtd v rØtd  dd¡\td< td< td ràtd sê|rêt dd¡ d}|�rJ| j ¡  | j ¡  td �r	tj}t  tj!¡ |t_nt "¡  t#t_$tj�sddgt_td }t%td �p$dƒ}t &||f¡ t' (||t)ƒ ¡ t*j +¡  t*j ,d -td td ¡¡ d S |  .¡  d S )Nr   rV   rW   rX   r-   r   zBad cipher.r   zBad MAC.ÚnonerE   ú^r"   rG   zBad escape character '%s'.ÚLú@zMissing host or username.r   z~/.ssh/id_rsaz~/.ssh/id_dsaé   z{}@{} - TkConch)/rV   ry   ÚoptionsrW   rX   r-   r?   rC   rE   ÚSSHClientTransportÚsupportedCiphersÚtkMessageBoxÚ	showerrorÚsupportedMACsÚlenÚchrÚordrY   Ú	identitysÚappendr]   rK   rs   Úopt_localforwardÚopt_remoteforwardÚsplitrN   ÚquitÚdestroyrh   Ústdoutr   ÚstartLoggingÚstderrÚdiscardLogsÚhandleErrorÚdeferrÚintÚmsgr   Ú
connectTCPÚSSHClientFactoryÚframeÚ	deiconifyrO   ÚformatÚfocus)	rj   Úfinishedr?   rC   rE   ÚlineÚrealoutrV   rW   rm   rm   rn   re   š   sx   














ÿzTkConchMenu.doConnectN)Ú__name__Ú
__module__Ú__qualname__rM   r[   r^   r_   re   rm   rm   rm   rn   r   &   s    ^
r   c                	   @   sj  e Zd ZU dZg d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢gZg d
¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢gZejjZ	ejj
Zejdge dd„ e	D ƒ¡e dd„ eD ƒ¡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d< 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d'd(„ Zd)d*„ Zd+S ),ÚGeneralOptionsz,Usage:    tkconch [options] host [command]
 )rX   ÚlNzLog in using this user name.)rY   Úiz~/.ssh/identityz&Identity for public key authentication)rE   Úeú~z(Set escape character; ``none'' = disable)r?   ÚcNzSelect encryption algorithm.)ÚmacsÚmNz.Specify MAC algorithms for protocol version 2.)rW   ÚpNz7Connect to this port.  Server must be on the same port.)Úlocalforwardr   Nz<listen-port:host:port   Forward local port to remote address)ÚremoteforwardÚRNz<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   ó   g | ]}|  ¡ ‘qS rm   ©Údecode©Ú.0r¾   rm   rm   rn   Ú
<listcomp>  ó    zGeneralOptions.<listcomp>c                 C   rÁ   rm   rÂ   rÄ   rm   rm   rn   rÆ     rÇ   zlisten-port:host:port)Údescr)r?   r¬   r¯   r°   r-   ÚargumentT)rÈ   Úrepeat)ÚmutuallyExclusiveÚ
optActionsÚextraActionsr‹   ÚlocalForwardsÚremoteForwardsc                 C   s   | j  |¡ d S ©N)r‹   rŒ   )rj   r¨   rm   rm   rn   Úopt_identity  ó   zGeneralOptions.opt_identityc                 C   ó8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ d S ©Nrw   )r�   r˜   rÎ   rŒ   )rj   ÚfÚ	localPortÚ
remoteHostÚ
remotePortrm   rm   rn   r�      ó   zGeneralOptions.opt_localforwardc                 C   rÓ   rÔ   )r�   r˜   rÏ   rŒ   )rj   rÕ   rØ   ÚconnHostÚconnPortrm   rm   rn   rŽ   &  rÙ   z GeneralOptions.opt_remoteforwardc                 C   s   dgt jdd…< d S )NÚzlibr   r   )rƒ   ÚsupportedCompressions©rj   rm   rm   rn   Úopt_compress,  s   zGeneralOptions.opt_compressc                 G   s>   |r|d | d< d  |dd … ¡| d< d S d| d< d| d< d S )Nr   rV   ú r   r-   Ú )Újoin)rj   rk   rm   rm   rn   Ú	parseArgs/  s
   zGeneralOptions.parseArgsN)r£   r¤   r¥   ÚsynopsisÚoptParametersÚoptFlagsr   rƒ   r„   Ú_ciphersr‡   Ú_macsr   ÚCompletionsÚCompleteListÚ	CompleterÚCompleteUserAtHostÚcompDatar‹   r   ÚstrÚ__annotations__rÎ   r   r˜   rÏ   rÑ   r�   rŽ   rß   rã   rm   rm   rm   rn   r¦   ã   sT   
 óø

ü
ýø  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r%t d¡ d |¡}~d t_ˆ  |¡ d S dt| ƒ  kr1dk rCn n| | ¡ ˆrAt | ¡ d S d S t| ƒdkrX|rZˆrRt d¡ | ¡  d S d S d S )	Núúz
rá   é    é   r4   z )	r   Ústoprœ   Úwriterâ   ÚcallbackrŠ   rŒ   Úpop)ÚchÚrespÚstresp©ÚdÚechorm   rn   ÚgotCharE  s*   



ÿ
ýz!deferredAskFrame.<locals>.gotChar)rœ   rö   Ú
ValueErrorr   ÚDeferredrõ   ÚcanvasÚfocus_force)Úquestionrý   rù   rþ   rm   rû   rn   ÚdeferredAskFrame?  s   

r  c               
   C   sˆ  t jdd … } d| v r#|  d¡}| ||d … |  } | |d |d …= | d d … D ],}z!|  |¡}|d d… dkrK| |d  d dkrKg | ||d …< W q) tyU   Y q)w t ¡ }| ¡  t ¡ }t|ƒa	t	j
tjtjdd� tƒ azt | ¡ W n" tjyœ } ztd	| ƒ t ¡  t  d¡ W Y d }~nd }~ww t ¡ D ]\}}|r¶tt	|ƒr¶tt	|ƒ tj|¡ q¡tjD ]\}\}	}
t	j tjd
|› d|	› d|
› �¡ qºg t_tjD ]\}\}	}
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 �s0dtd v �r5t	 '¡  n| (¡  t) *¡  t  t+¡ d S )Nr   z-lr"   r)   z-or   ú-)ÚsideÚfillÚexpandz	ERROR: %srv   rw   rx   )rö   z%dx%dr'   )r  rV   rX   r€   ),rh   ÚargvÚindexrÿ   rK   ÚTkÚwithdrawÚToplevelr   ÚmenuÚpackÚTOPÚBOTHr¦   r‚   ÚparseOptionsr   Ú
UsageErrorÚprintÚopt_helpri   ÚitemsÚhasattrÚgetattrrt   rs   rÎ   r]   rÏ   r   Ú
VT100Framerœ   ÚgeometryÚ	fontWidthr0   Ú
fontHeightr/   r   Úinstallre   Úmainloopr   ÚrunÚ
exitStatus)rk   r¨   ÚargÚrootÚtopÚuÚkr¾   r®   ÚrhÚrprm   rm   rn   r  `  sh   

$€ÿ€ý€$$ÿÿ
"
r  c                  C   s(   ddl m}  dat |  ¡ ¡ t ¡  ‚ )Nr   ©Úfailurer"   )Útwisted.pythonr)  r   r   ÚerrÚFailurer   rô   r(  rm   rm   rn   r–   “  s
   r–   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r›   Tc                 C   s   t  ¡  d S rÐ   )r   rô   rÞ   rm   rm   rn   ÚstopFactory   s   zSSHClientFactory.stopFactoryc                 C   s   t ƒ S rÐ   )rƒ   )rj   Úaddrrm   rm   rn   ÚbuildProtocol£  s   zSSHClientFactory.buildProtocolc                 C   s    t  dd|j› d|j› �¡ d S )Nr   zConnection Failed, Reason:
 z: )r…   ÚshowwarningÚtyper8   )rj   Ú	connectorÚreasonrm   rm   rn   ÚclientConnectionFailed¦  s   þz'SSHClientFactory.clientConnectionFailedN)r£   r¤   r¥   Únoisyr-  r/  r4  rm   rm   rm   rn   r›   �  s
    r›   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 )rƒ   c                 C   s   d||f a d S )NzDconch:	Remote side disconnected with error code %i
conch:	reason: %s)r   )rj   ÚcodeÚdescrm   rm   rn   Ú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   rƒ   ÚsendDisconnect)rj   r6  r3  rm   rm   rn   r9  µ  s
   ÿÿz!SSHClientTransport.sendDisconnectc                 C   s"   |st d rt d| ¡ d S d S )Nr   zReceived Debug Message: %s)r‚   r   r™   )rj   ÚalwaysDisplayÚmessageÚlangrm   rm   rn   Ú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r2td }td }nd 
td | j ¡ j	¡}d 
td | j ¡ j	¡}t |¡d }d	 
|d
ddœ| |¡}|d7 }t|dƒ | j|||¡S )NrV   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   r‚   r   ÚsucceedÚfailr   Ú
ConchErrorr   ÚgetPeerrV   rž   r   ÚgetNSr  ÚaddCallbackÚ_cbVerifyHostKey)rj   ÚpubKeyÚfingerprintÚgoodKeyrV   ÚkhHostÚkeyTypeÚquesrm   rm   rn   ÚverifyHostKeyÂ  s,   

ýÿ

ÿz SSHClientTransport.verifyHostKeyc              	   C   sà   |  ¡ dvrtddƒ | j|||¡S |  ¡ dkr"t d¡ t d¡‚z?t d|dd	d
œ| f ¡ tt	j
 d¡dƒ�}t |¡}| d|› d|› d|› �¡ W d   ƒ W d S 1 sZw   Y  W d S  tyo   t ¡  tj‚w )N)ÚyesÚnozPlease type  'yes' or 'no': r   rQ  zHost key verification failed.
r>  zBWarning: Permanently added '%s' (%s) to the list of known hosts.
r?  r@  rA  z~/.ssh/known_hostsrÀ   Ú
rà   )Úlowerr  rG  rH  rœ   rõ   r   rD  ÚopenÚosÚpathÚ
expanduserÚbase64Ú	b64encodeÚBaseExceptionr   r—   )rj   ÚansrI  rL  rM  Úknown_hostsÚ
encodedKeyrm   rm   rn   rH  ß  s*   

ÿ

þÿ
&þþz#SSHClientTransport._cbVerifyHostKeyc                 C   s0   t d r	t d }nt ¡ }|  t|tƒ ƒ¡ d S )NrX   )r‚   ÚgetpassÚgetuserÚrequestServiceÚSSHUserAuthClientÚSSHConnection)rj   rX   rm   rm   rn   ÚconnectionSecureô  s   
z#SSHClientTransport.connectionSecureN)	r£   r¤   r¥   r8  r9  r=  rO  rH  rc  rm   rm   rm   rn   rƒ   ­  s    rƒ   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 )ra  Ú	usedFilesNc                 C   s    |sd  | jtd ¡}t|dƒS )Nz{}@{}'s password: rV   r   )rž   rX   r‚   r  )rj   Úpromptrm   rm   rn   Ú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yE   ˆ  ¡  Y S w )Nc                    s   g | ]	}|ˆ j vr|‘qS rm   )rd  )rÅ   ÚxrÞ   rm   rn   rÆ     s    z2SSHUserAuthClient.getPublicKey.<locals>.<listcomp>r   z.pub)r‚   r‹   r   r™   rd  rŒ   rU  rV  rW  Úexistsr
   ÚKeyÚfromFileÚblobrZ  ÚgetPublicKey)rj   ÚfilesÚfilerm   rÞ   rn   rl    s   
ÿzSSHUserAuthClient.getPublicKeyc              
   C   sž   t j | jd ¡}t j |¡sd S zt tj 	|¡j
¡W S  tjyN } z%|jd dkrCd| jd  }t|dƒ | jd¡W  Y d }~S W Y d }~d S d }~ww )Néÿÿÿÿr   zencrypted key with no passwordúEnter passphrase for key '%s': )rU  rV  rW  rd  rh  r   rB  r
   ri  rj  Ú	keyObjectÚBadKeyErrorrk   r  rG  Ú_cbGetPrivateKey)rj   rn  r©   re  rm   rm   rn   ÚgetPrivateKey  s    þ€ÿzSSHUserAuthClient.getPrivateKeyc                 C   sl   t j | jd ¡}z
tjj||d�jW S  tjy5   |dkr ‚ d| jd  }t	|dƒ 
| j|d ¡ Y S w )Nro  )Úpasswordr"   rp  r   r   )rU  rV  rW  rd  r
   ri  rj  rq  rr  r  rG  rs  )rj   r[  Úcountrn  re  rm   rm   rn   rs    s   

ÿüz"SSHUserAuthClient._cbGetPrivateKeyrÐ   )r£   r¤   r¥   rd  r   rî   rï   rf  rl  rt  rs  rm   rm   rm   rn   ra  ü  s   
 
ra  c                   @   s   e Zd Zdd„ ZdS )rb  c              	   C   s–   t d s
|  tƒ ¡ t jr!t jD ]\}}t |t | |tj¡¡ qt j	rGt j	D ]!\}}t
 d ||¡¡ t d|f¡}|  d|¡ || j	|< q'd S d S )Nrº   z&asking for remote forwarding for {}:{}z0.0.0.0ztcpip-forward)r‚   ÚopenChannelÚ
SSHSessionrÎ   r   Ú	listenTCPr	   ÚSSHListenForwardingFactoryÚ SSHListenClientForwardingChannelrÏ   r   r™   rž   ÚpackGlobal_tcpip_forwardÚsendGlobalRequest)rj   rÖ   ÚhostportrØ   Údatarm   rm   rn   ÚserviceStarted-  s,   ÿþÿÿ÷zSSHConnection.serviceStartedN)r£   r¤   r¥   r€  rm   rm   rm   rn   rb  ,  s    rb  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 )rx  s   sessionc                 C   s  d| _ t ¡ }td r| j|_n| j|_| j|_|jt	_
t	j ¡  td r3| j | dt td ¡¡ nRtd ratd rStj dd¡}d	}t ||d
¡}| j | d|¡ | j | dt td ¡¡ n$td s}tj dd¡}d	}t ||d
¡}| j | d|¡ | j | dd¡ | jjj d¡ d S )Nr   rE   r¼   s	   subsystemr-   r²   ÚTERMÚxterm)é   éP   r   r   rá   s   pty-reqÚexecr´   s   shelló    )Ú
escapeModer   ÚSSHSessionClientr‚   ÚhandleInputÚdataReceivedrõ   ÚsendEOFÚconnectionLostrœ   rö   r  r  ÚconnÚsendRequestr   ÚNSrU  Úenvironry   ÚpackRequest_pty_reqr   ÚsetTcpNoDelay)rj   Úfoor«   ÚtermÚwinSizeÚ
ptyReqDatarm   rm   rn   ÚchannelOpenH  s0   

zSSHSession.channelOpenc                 C   sÐ   |dv rd| _ |  |¡ d S | j dkr|td krd| _ d S | j dkr^d| _ |dkr5t d¡ t ¡  d S |dkrDt t 	¡ t
j¡ d S |dkrUt d	¡ | jj ¡  d S |  d
| ¡ d S d| _ |  |¡ d S )N)rR  rñ   r   rE   r"   Ú.zdisconnecting from escapeúr±   zrekeying connectionrª   r   )r‡  rõ   r‚   r   r™   r   rô   rU  ÚkillÚgetpidÚsignalÚSIGSTOPr�  r   ÚsendKexInit)rj   Úcharrm   rm   rn   r‰  i  s*   



zSSHSession.handleInputc                 C   s,   |  d¡}td rtt|ƒƒ t |¡ d S )Nzutf-8r¿   )rÃ   r‚   r  Úreprrœ   rõ   ©rj   r  rm   rm   rn   rŠ  ƒ  s   
zSSHSession.dataReceivedc                 C   s:   |t jkrt dt|ƒ ¡ tj |¡ tj ¡  d S d S )Nzgot %s stderr data)	r   ÚEXTENDED_DATA_STDERRr   r™   rˆ   rh   r”   rõ   Úflush)rj   r³   r  rm   rm   rn   ÚextReceived‰  s
   
ýzSSHSession.extReceivedc                 C   s   t  d¡ tj ¡  d S )Nzgot eof)r   r™   rh   ÚstdinÚcloserÞ   rm   rm   rn   ÚeofReceived�  s   
zSSHSession.eofReceivedc                 C   s.   t  d|  ¡ t| jjƒdkrt ¡  d S d S )Nz	closed %sr   )r   r™   rˆ   r�  Úchannelsr   rô   rÞ   rm   rm   rn   Úclosed“  s   ÿzSSHSession.closedc                 C   s&   t t d|¡d ƒat dt ¡ d S )Nz>Lr   zexit status: %s)r˜   ÚstructÚunpackr   r   r™   r¡  rm   rm   rn   Úrequest_exit_status˜  s   zSSHSession.request_exit_statusc                 C   s   | j  | ¡ d S rÐ   )r�  r‹  rÞ   rm   rm   rn   r‹  �  rÒ   zSSHSession.sendEOFN)r£   r¤   r¥   r@   r—  r‰  rŠ  r¤  r§  r©  r¬  r‹  rm   rm   rm   rn   rx  D  s    !rx  Ú__main__)<Ú__doc__rX  r^  rU  rœ  rª  rh   ÚtkinterrK   Útkinter.filedialogÚ
filedialogrp   Útkinter.messageboxÚ
messageboxr…   Útypingr   r   Útwisted.conchr   Útwisted.conch.client.defaultr   Útwisted.conch.sshr   r   r   r	   r
   r   r   r   Útwisted.conch.uir   Útwisted.internetr   r   r   r   r*  r   r   rL   r   ÚOptionsr¦   r‚   r  r   rœ   r  r  r–   ÚClientFactoryr›   rƒ   ra  rb  Ú
SSHChannelrx  r£   rm   rm   rm   rn   Ú<module>   sF   (
 >V!3
O0]
ÿ