3
Z_ð]  ã               @   s  d dl mZ d dlm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mZ y
ej W n ek
rˆ   de_Y nX y
ej W n ek
r®   de_Y nX G dd	„ d	eƒZG d
d„ dejƒZddd„Zddd„Zedk�r eejdƒi ƒ dS )é    )Úprint_function)ÚInteractiveConsoleN)Úhubs)Ú	greenletsÚ	get_errnoz>>> z... 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 )Ú	FileProxyc             C   s
   || _ d S )N)Úf)Úselfr   © r
   ú5/tmp/pip-build-yz_zf6az/eventlet/eventlet/backdoor.pyÚ__init__   s    zFileProxy.__init__c             C   s   dS )NTr
   )r	   r
   r
   r   Úisatty   s    zFileProxy.isattyc             C   s   d S )Nr
   )r	   r
   r
   r   Úflush   s    zFileProxy.flushc             O   s"   | j j|f|ž|Ž | j jƒ  d S )N)r   Úwriter   )r	   ÚdataÚaÚkwr
   r
   r   r   "   s    zFileProxy.writec             G   s   | j j|Ž jddƒS )Nz
Ú
)r   ÚreadlineÚreplace)r	   r   r
   r
   r   r   &   s    zFileProxy.readlinec             C   s   t | j|ƒS )N)Úgetattrr   )r	   Úattrr
   r
   r   Ú__getattr__)   s    zFileProxy.__getattr__N)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r
   r
   r
   r   r      s   r   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚSocketConsolec             C   s&   || _ || _t|ƒ| _tjj| ƒ d S )N)ÚhostportÚlocalsr   Údescr   Úgreenletr   )r	   r   r   r   r
   r
   r   r   0   s    
zSocketConsole.__init__c          
   C   s.   zt | jƒ}|jƒ  W d | jƒ  | jƒ  X d S )N)r   r   ZinteractÚ
switch_outÚfinalize)r	   Úconsoler
   r
   r   Úrun7   s
    
zSocketConsole.runc             O   s>   t jt jt jf| _| j t _ t _t _tjj| f|ž|Ž d S )N)	ÚsysÚstdinÚstderrÚstdoutÚsavedr   r   r    Úswitch)r	   Úargsr   r
   r
   r   r*   ?   s    zSocketConsole.switchc             C   s   | j \t_t_t_d S )N)r)   r%   r&   r'   r(   )r	   r
   r
   r   r!   D   s    zSocketConsole.switch_outc             C   sF   d | _ t| jƒdkr:| jd }| jd }td||f ƒ ntdƒ d S )Né   r   é   zbackdoor closed to %s:%szbackdoor closed)r   Úlenr   Úprint)r	   ÚhostÚportr
   r
   r   r"   G   s    

zSocketConsole.finalizeN)r   r   r   r   r$   r*   r!   r"   r
   r
   r
   r   r   /   s
   r   c             C   s¶   | j ƒ }| jtjkrd| }n$| jtjkrB|\}}}}d||f }td|f ƒ zVyx| jƒ }t||ƒ qVW W n4 tjk
r¢ } zt	|ƒt
jkr’‚ W Y dd}~X nX W d| jƒ  X dS )aZ   Blocking function that runs a backdoor server on the socket *sock*,
    accepting connections and running backdoor consoles for each client that
    connects.

    The *locals* argument is a dictionary that will be included in the locals()
    of the interpreters.  It can be convenient to stick important application
    variables in here.
    z%s:%szbackdoor server listening on %sN)ÚgetsocknameÚfamilyÚsocketÚAF_INETÚAF_INET6r/   ÚacceptÚbackdoorÚerrorr   ÚerrnoÚEPIPEÚclose)Úsockr   Zlistening_onÚipr1   Ú_Ú
socketpairÚer
   r
   r   Úbackdoor_serverR   s     	
rB   c       
      C   s�   | \}}|j tjkr.|\}}td||f ƒ n2|j tjkrX|\}}}}td||f ƒ ntdƒ |jdƒ}t|||ƒ}tjƒ }	|	j	d|j
ƒ dS )a  Sets up an interactive console on a socket with a single connected
    client.  This does not block the caller, as it spawns a new greenlet to
    handle the console.  This is meant to be called from within an accept loop
    (such as backdoor_server).
    zbackdoor to %s:%szbackdoor openedÚrwr   N)r3   r4   r5   r/   r6   Úmakefiler   r   Zget_hubZschedule_call_globalr*   )
Z	conn_infor   ÚconnÚaddrr0   r1   r?   Úflr#   Zhubr
   r
   r   r8   r   s    
r8   Ú__main__ú	127.0.0.1é(#  )N)N)rI   rJ   )Ú
__future__r   Úcoder   r:   r4   r%   Ú	tracebackZeventletr   Zeventlet.supportr   r   Zps1ÚAttributeErrorZps2Úobjectr   r    r   rB   r8   r   Úlistenr
   r
   r
   r   Ú<module>   s.   

#
 

