a
    kÄ#dtb  ã                   @   s(  d dl mZ d dlZd dlZd dlZd dlm  mZ d dlm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% G d
d„ dee& ƒZ'G dd„ de$ƒZ(e#ddd�Z)e#ddd�Z*e +e(¡G dd„ dƒƒZ,G dd„ de,ee ƒZ-G dd„ de,ƒZ.G dd„ de,ƒZ/G dd„ de/ƒZ0G dd„ de-ƒZ1G dd„ de1ƒZ2G dd „ d e/ƒZ3G d!d"„ d"e/ƒZ4G d#d$„ d$e1ƒZ5G d%d&„ d&e5ƒZ6G d'd(„ d(e2ƒZ7G d)d*„ d*e/ƒZ8G d+d,„ d,e/ƒZ9G d-d.„ d.e.ƒZ:G d/d0„ d0e.ƒZ;G d1d2„ d2e.ƒZ<dS )3é    )Úprint_functionN)ÚLockÚThread)ÚMessageÚ
ObjectPipeÚselect_objects)ÚWINDOWS)Úlog_runtimeÚwarning)Úconf)Úget_temp_fileÚdo_graph)ÚAnyÚCallableÚDictÚIterableÚOptionalÚSetÚTupleÚUnionÚTypeÚTypeVarÚ_Generic_metaclassÚcastc                   @   s’   e Zd Zi Zedd„ ƒZe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d„Zdd„ Zdd„ Zd S )"Ú
PipeEnginec                 C   sF   t | j ¡ ƒD ]2\}}|jpd}|r0| ¡ d }td||f ƒ qd S )NÚ r   z%20s: %s)ÚsortedÚpipesÚitemsÚ__doc__Ú
splitlinesÚprint)ÚclsÚpnÚpcÚdoc© r&   úE/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/pipetool.pyÚ
list_pipes*   s
    
zPipeEngine.list_pipesc                 C   sB   t | j ¡ ƒD ].\}}|jr0td||jf ƒ qtd| ƒ qd S )Nz###### %s
 %sz	###### %s)r   r   r   r   r!   )r"   r#   r$   r&   r&   r'   Úlist_pipes_detailed3   s    zPipeEngine.list_pipes_detailedc                 G   sP   t  | d¡ tƒ | _tƒ | _tƒ | _tƒ | _| j|Ž  tƒ | _	tƒ | _
d | _d S )Nr   )r   Ú__init__ÚsetÚactive_pipesÚactive_sourcesÚactive_drainsÚactive_sinksÚ
_add_pipesr   Úthread_lockÚcommand_lockÚthread)Úselfr   r&   r&   r'   r*   <   s    
zPipeEngine.__init__c                    s>   |  d¡r2|dd … ‰ ˆ ˆjv r2‡ ‡fdd„}|S t|ƒ‚d S )NZspawn_é   c                     s&   ˆj ˆ  }|| i |¤Ž}ˆ |¡ |S ©N)r   Úadd)ÚargsÚkargsÚkÚp©Údnamer4   r&   r'   ÚfM   s    

z!PipeEngine.__getattr__.<locals>.f)Ú
startswithr   ÚAttributeError)r4   Úattrr>   r&   r<   r'   Ú__getattr__H   s    

zPipeEngine.__getattr__c                 C   s   |   ¡ S r6   )Úrecv©r4   r&   r&   r'   Ú	_read_cmdV   s    zPipeEngine._read_cmdc                 C   s   |   |¡ d S r6   )Úsend©r4   Ú_cmdr&   r&   r'   Ú
_write_cmdZ   s    zPipeEngine._write_cmdc                 C   sR   | j  |¡ t|tƒr"| j |¡ t|tƒr8| j |¡ t|tƒrN| j |¡ d S r6   )	r,   r7   Ú
isinstanceÚSourcer-   ÚDrainr.   ÚSinkr/   )r4   Úpiper&   r&   r'   Úadd_one_pipe^   s    


zPipeEngine.add_one_pipec                    s    ‡ fdd„‰ t ƒ }ˆ ||ƒ |S )Nc                    s>   |  | ¡ | j| jB | jB | jB D ]}||vr"ˆ ||ƒ q"d S r6   )r7   ÚsourcesÚsinksÚhigh_sourcesÚ
high_sinks)r;   ZliÚq©Úflattenr&   r'   rV   j   s    
z)PipeEngine.get_pipe_list.<locals>.flatten)r+   )r4   rN   Úplr&   rU   r'   Úget_pipe_listh   s    
zPipeEngine.get_pipe_listc                 G   s@   t ƒ }|D ]}||  |¡O }q
|| j8 }|D ]}|  |¡ q,|S r6   )r+   rX   r,   rO   )r4   r   rW   r;   rT   r&   r&   r'   r0   v   s    
zPipeEngine._add_pipesc           
      C   sä  t  d¡ �zŠ�z(| jD ]}| ¡  q| j}| | ¡ tg ƒ}d}d}|�r6|r^t|ƒdk�r6t|dƒ}|D ]Æ}|| u rÊ|  	¡ }|dkr’d} qFn6|dkr d}n(|dkr¾| j| }| | ¡ n
t
d	|ƒ ql||v rlz| ¡  W n6 t�y }	 zt  d
|j|	¡ W Y d }	~	qld }	~	0 0 | ¡ rl| |¡ | |¡ qlqFW n t�yL   Y n0 W z.| jD ]}| ¡  �qXW | j ¡  t  d¡ n| j ¡  t  d¡ 0 nHz.| jD ]}| ¡  �q W | j ¡  t  d¡ n| j ¡  t  d¡ 0 0 d S )NzPipe engine thread started.TFé   g      à?ÚXÚBÚAz3Unknown internal pipe engine command: %r. Ignoring.zpiping from %s failed: %szPipe engine thread stopped.)r	   Údebugr,   Ústartr-   r7   r+   Úlenr   rE   r
   ÚdeliverÚ	ExceptionÚ	exceptionÚnameÚ	exhaustedÚremoveÚKeyboardInterruptÚstopr1   Úrelease)
r4   r;   rP   rd   ÚRUNZSTOP_IF_EXHAUSTEDÚfdsÚfdÚcmdÚer&   r&   r'   Úrun€   sf    





ÿÿ


ÿ
û

ÿ
zPipeEngine.runc                 C   s>   | j  d¡r0t| jdd�}d|_| ¡  || _n
t d¡ d S )NFzscapy.pipetool.PipeEngine©Útargetrc   TzPipe engine already running)	r1   Úacquirer   rn   Údaemonr^   r3   r	   r]   )r4   Z_tr&   r&   r'   r^   ¯   s    zPipeEngine.startc                 C   s   | j dd� d S )Nr[   )rH   )rg   rD   r&   r&   r'   Úwait_and_stop¹   s    zPipeEngine.wait_and_stoprZ   c              	   C   s–   zv| j �\ | jd urL|  |¡ | j ¡  z| j ¡  W qV tyH   Y qV0 n
t d¡ W d   ƒ n1 sj0    Y  W n t	y�   t
dƒ Y n0 d S )NzPipe engine thread not runningzInterrupted by user.)r2   r3   rI   Újoinr1   rh   ra   r	   r]   rf   r!   rG   r&   r&   r'   rg   ½   s    


,zPipeEngine.stopc                 G   sZ   | j |Ž }| j�6 | jd ur8|D ]}| ¡  q |  d¡ W d   ƒ n1 sL0    Y  d S )Nr\   )r0   r2   r3   r^   rI   )r4   r   Ú_pipesr;   r&   r&   r'   r7   Í   s    


zPipeEngine.addc                 K   s&  ddg}| j D ]}| dt|ƒ|jf ¡ q| d¡ | d¡ | j D ]*}|jD ]}| dt|ƒt|ƒf ¡ qPqF| d¡ | d¡ | j D ]*}|jD ]}| dt|ƒt|ƒf ¡ q–qŒ| d¡ | d¡ | j D ]*}|jD ]}| dt|ƒt|ƒf ¡ qÜqÒ| d	¡ d
 |¡}t|fi |¤Ž d S )Nzdigraph "pipe" {z	node [shape=rectangle];z	"%i" [label="%s"];r   z"	edge [color=blue, arrowhead=vee];z	"%i" -> "%i";z'	edge [color=purple, arrowhead=veevee];z%	edge [color=red, arrowhead=diamond];Ú}Ú
)	r,   ÚappendÚidrc   rQ   rS   Útrigger_sinksrt   r   )r4   r9   Úgr;   ÚsÚhsÚtsÚgraphr&   r&   r'   r   Ö   s*    














zPipeEngine.graphN)rZ   )Ú__name__Ú
__module__Ú__qualname__r   Úclassmethodr(   r)   r*   rB   rE   rI   rO   rX   r0   rn   r^   rs   rg   r7   r   r&   r&   r&   r'   r   '   s$   



/

	r   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú	_PipeMetac                    s*   t dtt| ƒ | |||¡ƒ}|tj|< |S )Nz
Type[Pipe])r   Úsuperr„   Ú__new__r   r   )r"   rc   ÚbasesÚdctÚc©Ú	__class__r&   r'   r†   ð   s
    ÿ
z_PipeMeta.__new__)r€   r�   r‚   r†   Ú__classcell__r&   r&   rŠ   r'   r„   ï   s   r„   Ú_SrM   )ÚboundÚ_TSÚTriggerSinkc                   @   sp   e Zd Zddd„Zdd„ Zdd„ Zd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 )ÚPipeNc                 C   sN   t ƒ | _t ƒ | _t ƒ | _t ƒ | _t ƒ | _t ƒ | _|d u rDd| jj }|| _	d S )Nz%s)
r+   rP   rQ   rR   rS   Útrigger_sourcesrz   r‹   r€   rc   ©r4   rc   r&   r&   r'   r*     s    zPipe.__init__c                 C   s   | j D ]}| |¡ qd S r6   )rQ   Úpush©r4   Úmsgr|   r&   r&   r'   Ú_send  s    
z
Pipe._sendc                 C   s   | j D ]}| |¡ qd S r6   )rS   Ú	high_pushr•   r&   r&   r'   Ú
_high_send  s    
zPipe._high_sendc                 C   s   | j D ]}| |¡ qd S r6   )rz   Ú
on_triggerr•   r&   r&   r'   Ú_trigger  s    
zPipe._triggerc                 C   s   | j  |¡ |j | ¡ |S r6   ©rQ   r7   rP   ©r4   Úotherr&   r&   r'   Ú__gt__  s    zPipe.__gt__c                 C   s   | j  |¡ |j | ¡ |S r6   )rS   r7   rR   r�   r&   r&   r'   Ú
__rshift__#  s    zPipe.__rshift__c                 C   s   | j  |¡ |j | ¡ |S r6   )rz   r7   r’   r�   r&   r&   r'   Ú__xor__)  s    zPipe.__xor__c                 C   s
   t  | ¡S r6   )ÚobjectÚ__hash__rD   r&   r&   r'   r£   /  s    zPipe.__hash__c                 C   s   t  | |¡S r6   )r¢   Ú__eq__r�   r&   r&   r'   r¤   3  s    zPipe.__eq__c                    s>  t j‰ dˆ  d¡ˆ  | j¡f }| js,| jrÊ|dˆ  d¡ 7 }| jrv|dˆ  d¡ ‡ fdd„| jD ƒ¡ˆ  d¡f 7 }|ˆ  d	¡7 }| jr¼|dˆ  d¡ˆ  d¡ ‡ fd
d„| jD ƒ¡f 7 }|ˆ  d¡7 }| j	sØ| j
�rz|dˆ  d¡ 7 }| j	�r$|dˆ  d¡ ‡ fdd„| j	D ƒ¡ˆ  d¡f 7 }|ˆ  d	¡7 }| j
�rl|dˆ  d¡ˆ  d¡ ‡ fdd„| j
D ƒ¡f 7 }|ˆ  d¡7 }| j�sŠ| j�r,|dˆ  d¡ 7 }| j�rÖ|dˆ  d¡ ‡ fdd„| jD ƒ¡ˆ  d¡f 7 }|ˆ  d	¡7 }| j�r|dˆ  d¡ˆ  d¡ ‡ fdd„| jD ƒ¡f 7 }|ˆ  d¡7 }|ˆ  d¡7 }|S )Nz%s%sú<z %sú[ú,c                 3   s   | ]}ˆ   |j¡V  qd S r6   ©Ú
field_namerc   ©Ú.0r|   ©Úctr&   r'   Ú	<genexpr>>  ó    z Pipe.__repr__.<locals>.<genexpr>ú>ú#c                 3   s   | ]}ˆ   |j¡V  qd S r6   r¨   rª   r¬   r&   r'   r®   C  r¯   ú]c                 3   s   | ]}ˆ   |j¡V  qd S r6   r¨   rª   r¬   r&   r'   r®   I  r¯   ú>>c                 3   s   | ]}ˆ   |j¡V  qd S r6   r¨   rª   r¬   r&   r'   r®   N  r¯   c                 3   s   | ]}ˆ   |j¡V  qd S r6   r¨   rª   r¬   r&   r'   r®   T  r¯   ú^c                 3   s   | ]}ˆ   |j¡V  qd S r6   r¨   rª   r¬   r&   r'   r®   Y  r¯   )r   Zcolor_themeÚpunctZ
layer_namerc   rP   rQ   rt   Zfield_valuerR   rS   r’   rz   )r4   r|   r&   r¬   r'   Ú__repr__7  sP    "ÿÿ"ÿÿ"ÿÿzPipe.__repr__c                 C   s   d S r6   r&   rD   r&   r&   r'   r^   _  s    z
Pipe.startc                 C   s   d S r6   r&   rD   r&   r&   r'   rg   c  s    z	Pipe.stop)N)N)r€   r�   r‚   r*   r—   r™   r›   rŸ   r    r¡   r£   r¤   r¶   r^   rg   r&   r&   r&   r'   r‘      s   

(r‘   c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )rK   Nc                 C   s$   t j| |d� t | |¡ d| _d S ©N©rc   F)r‘   r*   r   Úis_exhaustedr“   r&   r&   r'   r*   i  s    zSource.__init__c                 C   s   t ƒ S r6   )r   rD   r&   r&   r'   Ú_read_messageo  s    zSource._read_messagec                 C   s   | j }|  |¡ d S r6   )rº   r—   ©r4   r–   r&   r&   r'   r`   s  s    zSource.deliverc                 C   s   | j S r6   ©r¹   rD   r&   r&   r'   rd   x  s    zSource.exhausted)N)r€   r�   r‚   r*   rº   r`   rd   r&   r&   r&   r'   rK   h  s   
rK   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rL   z¸Repeat messages from low/high entries to (resp.) low/high exits

    .. code::

         +-------+
      >>-|-------|->>
         |       |
       >-|-------|->
         +-------+
    c                 C   s   |   |¡ d S r6   ©r—   r»   r&   r&   r'   r”   ‰  s    z
Drain.pushc                 C   s   |   |¡ d S r6   ©r™   r»   r&   r&   r'   r˜   �  s    zDrain.high_pushN©r€   r�   r‚   r   r”   r˜   r&   r&   r&   r'   rL   }  s   rL   c                   @   s@   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S )rM   zÃ
    Does nothing; interface to extend for custom sinks.

    All sinks have the following constructor parameters:

    :param name: a human-readable name for the element
    :type name: str
    c                 C   s   dS )z»
        Called by :py:class:`PipeEngine` when there is a new message for the
        low entry.

        :param msg: The message data
        :returns: None
        :rtype: None
        Nr&   r»   r&   r&   r'   r”   ›  s    
z	Sink.pushc                 C   s   dS )z¼
        Called by :py:class:`PipeEngine` when there is a new message for the
        high entry.

        :param msg: The message data
        :returns: None
        :rtype: None
        Nr&   r»   r&   r&   r'   r˜   §  s    
zSink.high_pushc                 C   s   |j  | ¡ | j |¡ |S r6   rœ   r�   r&   r&   r'   Ú__lt__³  s    zSink.__lt__c                 C   s   | j  |¡ |j | ¡ |S r6   )rR   r7   rS   r�   r&   r&   r'   Ú
__lshift__¹  s    zSink.__lshift__c                 C   s   | |?  || ?  |S r6   r&   r�   r&   r&   r'   Ú__floordiv__¿  s    zSink.__floordiv__c                 C   s   | |k || k |S r6   r&   r�   r&   r&   r'   Ú__mod__Å  s    zSink.__mod__N)
r€   r�   r‚   r   r”   r˜   rÀ   rÁ   rÂ   rÃ   r&   r&   r&   r'   rM   ’  s   c                   @   s   e Zd Zdd„ ZdS )r�   c                 C   s   d S r6   r&   r»   r&   r&   r'   rš   Í  s    zTriggerSink.on_triggerN)r€   r�   r‚   rš   r&   r&   r&   r'   r�   Ì  s   c                   @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú
AutoSourceNc                 C   s   t j| |d� d S ©Nr¸   )rK   r*   r“   r&   r&   r'   r*   Ó  s    zAutoSource.__init__c                 C   s   t  | |ddf¡ d S ©NF©r   rF   r»   r&   r&   r'   Ú	_gen_data×  s    zAutoSource._gen_datac                 C   s   t  | |ddf¡ d S ©NTFrÇ   r»   r&   r&   r'   Ú_gen_high_dataÛ  s    zAutoSource._gen_high_datac                 C   s   t  | d¡ d S )N)NNTrÇ   rD   r&   r&   r'   Ú_exhaustß  s    zAutoSource._exhaustc                 C   s0   |   ¡ \}}}|r|r"|  |¡ n
|  |¡ d S r6   )rC   r™   r—   )r4   r–   ÚhighZexhaustr&   r&   r'   r`   ã  s
    zAutoSource.deliver)N)r€   r�   r‚   r*   rÈ   rÊ   rË   r`   r&   r&   r&   r'   rÄ   Ò  s
   
rÄ   c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚThreadGenSourceNc                 C   s   t j| |d� d| _d S r·   )rÄ   r*   ri   r“   r&   r&   r'   r*   ï  s    zThreadGenSource.__init__c                 C   s   d S r6   r&   rD   r&   r&   r'   Úgenerateô  s    zThreadGenSource.generatec                 C   s   d| _ t| jdd� ¡  d S )NTzscapy.pipetool.ThreadGenSourcero   )ri   r   rÎ   r^   rD   r&   r&   r'   r^   ø  s    ÿzThreadGenSource.startc                 C   s
   d| _ d S rÆ   )ri   rD   r&   r&   r'   rg   þ  s    zThreadGenSource.stop)N)r€   r�   r‚   r*   rÎ   r^   rg   r&   r&   r&   r'   rÍ   î  s   
rÍ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚConsoleSinkz­Print messages on low and high entries to ``stdout``

    .. code::

         +-------+
      >>-|--.    |->>
         | print |
       >-|--'    |->
         +-------+
    c                 C   s   t dt|ƒ ƒ d S )Nr°   ©r!   Úreprr»   r&   r&   r'   r”     s    zConsoleSink.pushc                 C   s   t dt|ƒ ƒ d S )Nr³   rÐ   r»   r&   r&   r'   r˜     s    zConsoleSink.high_pushNr¿   r&   r&   r&   r'   rÏ     s   rÏ   c                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd	„ ZdS )ÚRawConsoleSinka>  Print messages on low and high entries, using os.write

    .. code::

         +-------+
      >>-|--.    |->>
         | write |
       >-|--'    |->
         +-------+

    :param newlines: Include a new-line character after printing each packet.
                     Defaults to True.
    :type newlines: bool
    NTc                 C   s   t j| |d� || _d| _d S )Nr¸   rY   )rM   r*   ÚnewlinesÚ_write_pipe)r4   rc   rÓ   r&   r&   r'   r*   (  s    zRawConsoleSink.__init__c                 C   s&   | j r|d7 }t | j| d¡¡ d S ©Nrw   Úutf8©rÓ   ÚosÚwriterÔ   Úencoder»   r&   r&   r'   r”   .  s    zRawConsoleSink.pushc                 C   s&   | j r|d7 }t | j| d¡¡ d S rÕ   r×   r»   r&   r&   r'   r˜   4  s    zRawConsoleSink.high_push)NT©r€   r�   r‚   r   r*   r”   r˜   r&   r&   r&   r'   rÒ     s   
rÒ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	CLIFeederz¥Send messages from python command line:

    .. code::

         +--------+
      >>-|        |->>
         | send() |
       >-|   `----|->
         +--------+
    c                 C   s   |   |¡ dS ©NrY   )rÈ   r»   r&   r&   r'   rF   G  s    
zCLIFeeder.sendc                 C   s
   d| _ d S )NTr¼   rD   r&   r&   r'   ÚcloseL  s    zCLIFeeder.closeN)r€   r�   r‚   r   rF   rÞ   r&   r&   r&   r'   rÜ   ;  s   rÜ   c                   @   s   e Zd ZdZdd„ ZdS )ÚCLIHighFeederz´Send messages from python command line to high output:

    .. code::

         +--------+
      >>-|   .----|->>
         | send() |
       >-|        |->
         +--------+
    c                 C   s   |   |¡ dS rÝ   )rÊ   r»   r&   r&   r'   rF   ]  s    
zCLIHighFeeder.sendN)r€   r�   r‚   r   rF   r&   r&   r&   r'   rß   Q  s   rß   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	ÚPeriodicSourcez¤Generage messages periodically on low exit:

    .. code::

         +-------+
      >>-|       |->>
         | msg,T |
       >-|  `----|->
         +-------+
    r   Nc                 C   s>   t j| |d� t|tttfƒs(|g| _n|| _|| _|| _d S rÅ   )	rÍ   r*   rJ   Úlistr+   Útupler–   ÚperiodÚperiod2)r4   r–   rã   rä   rc   r&   r&   r'   r*   o  s    
zPeriodicSource.__init__c                 C   sT   | j rPd}| jD ]}d}|  |¡ t | j¡ q|rBd| _|  ¡  t | j¡ q d S rÉ   )	ri   r–   rÈ   ÚtimeÚsleeprã   r¹   rË   rä   )r4   Z	empty_genÚmr&   r&   r'   rÎ   y  s    

zPeriodicSource.generate)r   N)r€   r�   r‚   r   r*   rÎ   r&   r&   r&   r'   rà   c  s   

rà   c                   @   sh   e Zd ZdZddd„Zer,dd„ Zdd	„ Znd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTermSinkaß  
    Prints messages on the low and high entries, on a separate terminal (xterm
    or cmd).

    .. code::

         +-------+
      >>-|--.    |->>
         | print |
       >-|--'    |->
         +-------+

    :param keepterm: Leave the terminal window open after :py:meth:`~Pipe.stop`
                     is called. Defaults to True.
    :type keepterm: bool
    :param newlines: Include a new-line character after printing each packet.
                     Defaults to True.
    :type newlines: bool
    :param openearly: Automatically starts the terminal when the constructor is
                      called, rather than waiting for :py:meth:`~Pipe.start`.
                      Defaults to True.
    :type openearly: bool
    NTc                 C   s8   t j| |d� || _|| _|| _d| _| jr4|  ¡  d S r·   )rM   r*   ÚkeeptermrÓ   Ú	openearlyÚopenedr^   )r4   rc   ré   rÓ   rê   r&   r&   r'   r*      s    zTermSink.__init__c                 C   s–   | j s’d| _ tƒ | _t| jdƒ ¡  | jd u r2dn| j| _d| j| j dd¡f }tjt	t
jdƒ|gtjd�}| ¡ \}}t|ƒ| _td	| j ƒ d S )
NTÚaZScapyzŽ$app = Start-Process PowerShell -ArgumentList '-command &{$host.ui.RawUI.WindowTitle=\"%s\";Get-Content \"%s\" -wait}' -passthru; echo $app.Idú\z\\Ú
powershell)ÚstdoutzPID: %d)rë   r   Ú_TermSink__fÚopenrÞ   rc   ÚreplaceÚ
subprocessÚPopenÚgetattrr   ÚprogÚPIPEÚcommunicateÚintÚpidr!   )r4   rl   ÚprocÚoutputÚ_r&   r&   r'   Ú_start_windows¬  s    
þû
zTermSink._start_windowsc                 C   sN   | j sJd| _dd l}d}|jj |d| j¡}|jj |d¡ |jj |¡ d S )NFr   rY   éÿÿÿÿ)	ré   rë   ÚctypesZwindllZkernel32ZOpenProcessrú   ZTerminateProcessZCloseHandle)r4   r   ZPROCESS_TERMINATEÚhandler&   r&   r'   Ú_stop_windowsÁ  s    zTermSink._stop_windowsc                 C   sz   | j svd| _ t ¡ \}| _dg}| jd ur:| d| jg¡ | jrJ| d¡ | dd| g¡ tj	|dd�| _
t |¡ d S )	NTZxtermz-titlez-holdz-ezcat <&%dF)Ú	close_fds)rë   rØ   rN   Úwdescrc   Úextendré   rx   ró   rô   rû   rÞ   )r4   Zrdescrl   r&   r&   r'   Ú_start_unixÍ  s    

zTermSink._start_unixc                 C   s$   | j s d| _| j ¡  | j ¡  d S rÆ   )ré   rë   rû   ÚkillÚwaitrD   r&   r&   r'   Ú
_stop_unixÛ  s    
zTermSink._stop_unixc                 C   s   t r|  ¡ S |  ¡ S d S r6   )r   rþ   r  rD   r&   r&   r'   r^   â  s    zTermSink.startc                 C   s   t r|  ¡ S |  ¡ S d S r6   )r   r  r	  rD   r&   r&   r'   rg   é  s    zTermSink.stopc                 C   sH   | j r|d7 }tr2t| jdƒ}| |¡ | ¡  nt | j| ¡ ¡ d S )Nrw   rì   )	rÓ   r   rñ   rð   rÙ   rÞ   rØ   r  rÚ   )r4   r|   r  r&   r&   r'   Ú_printð  s    

zTermSink._printc                 C   s   |   t|ƒ¡ d S r6   ©r
  Ústrr»   r&   r&   r'   r”   û  s    zTermSink.pushc                 C   s   |   t|ƒ¡ d S r6   r  r»   r&   r&   r'   r˜   ÿ  s    zTermSink.high_push)NTTT)r€   r�   r‚   r   r*   r   rþ   r  r  r	  r^   rg   r
  r”   r˜   r&   r&   r&   r'   rè   ‡  s     ÿ

rè   c                   @   s4   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„ZdS )Ú	QueueSinka5  
    Collects messages on the low and high entries into a :py:class:`Queue`.
    Messages are dequeued with :py:meth:`recv`.
    Both high and low entries share the same :py:class:`Queue`.

    .. code::

         +-------+
      >>-|--.    |->>
         | queue |
       >-|--'    |->
         +-------+
    Nc                 C   s    t j| |d� tjj ¡ | _d S rÅ   )rM   r*   ÚsixÚmovesÚqueueÚQueuerT   r“   r&   r&   r'   r*     s    zQueueSink.__init__c                 C   s   | j  |¡ d S r6   ©rT   Úputr»   r&   r&   r'   r”     s    zQueueSink.pushc                 C   s   | j  |¡ d S r6   r  r»   r&   r&   r'   r˜     s    zQueueSink.high_pushTc                 C   s2   z| j j||d�W S  tjjjy,   Y dS 0 dS )a^  
        Reads the next message from the queue.

        If no message is available in the queue, returns None.

        :param block: Blocks execution until a packet is available in the
                      queue. Defaults to True.
        :type block: bool
        :param timeout: Controls how long to wait if ``block=True``. If None
                        (the default), this method will wait forever. If a
                        non-negative number, this is a number of seconds to
                        wait before giving up (and returning None).
        :type timeout: None, int or float
        )ÚblockÚtimeoutN)rT   Úgetr  r  r  ÚEmpty)r4   r  r  r&   r&   r'   rC      s    zQueueSink.recv)N)TN)r€   r�   r‚   r   r*   r”   r˜   rC   r&   r&   r&   r'   r    s
   
r  c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚTransformDrainz¬Apply a function to messages on low and high entry:

    .. code::

         +-------+
      >>-|--[f]--|->>
         |       |
       >-|--[f]--|->
         +-------+
    Nc                 C   s   t j| |d� || _d S rÅ   )rL   r*   r>   )r4   r>   rc   r&   r&   r'   r*   B  s    zTransformDrain.__init__c                 C   s   |   |  |¡¡ d S r6   )r—   r>   r»   r&   r&   r'   r”   G  s    zTransformDrain.pushc                 C   s   |   |  |¡¡ d S r6   )r™   r>   r»   r&   r&   r'   r˜   K  s    zTransformDrain.high_push)NrÛ   r&   r&   r&   r'   r  6  s   
r  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚUpDrainz¥Repeat messages from low entry to high exit:

    .. code::

         +-------+
      >>-|    ,--|->>
         |   /   |
       >-|--'    |->
         +-------+
    c                 C   s   |   |¡ d S r6   r¾   r»   r&   r&   r'   r”   \  s    zUpDrain.pushc                 C   s   d S r6   r&   r»   r&   r&   r'   r˜   `  s    zUpDrain.high_pushNr¿   r&   r&   r&   r'   r  P  s   r  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	DownDrainz¥Repeat messages from high entry to low exit:

    .. code::

         +-------+
      >>-|--.    |->>
         |   \   |
       >-|    `--|->
         +-------+
    c                 C   s   d S r6   r&   r»   r&   r&   r'   r”   q  s    zDownDrain.pushc                 C   s   |   |¡ d S r6   r½   r»   r&   r&   r'   r˜   u  s    zDownDrain.high_pushNr¿   r&   r&   r&   r'   r  e  s   r  )=Ú
__future__r   rØ   ró   rå   Zscapy.libs.sixZlibsr  Ú	threadingr   r   Zscapy.automatonr   r   r   Zscapy.constsr   Zscapy.errorr	   r
   Zscapy.configr   Zscapy.utilsr   r   Zscapy.compatr   r   r   r   r   r   r   r   r   r   r   r   r  r   r„   r�   r�   Úadd_metaclassr‘   rK   rL   rM   r�   rÄ   rÍ   rÏ   rÒ   rÜ   rß   rà   rè   r  r  r  r  r&   r&   r&   r'   Ú<module>   sD   8 Ig:#$}2