a
    kÄ#d14  ã                   @   s4  d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlm  mZ ddlZdd	lmZmZmZmZmZmZmZmZmZ G d
d„ deƒZG dd„ deƒZeee f Z!G dd„ deƒZ"e"ƒ  e_# Z$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S )"z
Interfaces management
é    N)Údefaultdict)Úconf)ÚWINDOWS)Úpretty_list)Úin6_isvalid)ÚUserDict)	ÚAnyÚDefaultDictÚDictÚListÚNoReturnÚOptionalÚTupleÚTypeÚUnionc                   @   sT   e Zd ZdZd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S )ÚInterfaceProviderÚUnknown)ÚIndexÚNameZMACZIPv4ZIPv6é   Fc                 C   s   t ‚dS )zEReturns a dictionary of the loaded interfaces, by their
        name.N)ÚNotImplementedError©Úself© r   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/interfaces.pyÚload+   s    zInterfaceProvider.loadc                 C   s   |   ¡ S )z7Same than load() but for reloads. By default calls load)r   r   r   r   r   Úreload1   s    zInterfaceProvider.reloadc                 C   s   t jS )z4Return L2 socket used by interfaces of this provider)r   ZL2socketr   r   r   r   Úl2socket6   s    zInterfaceProvider.l2socketc                 C   s   t jS )z:Return L2listen socket used by interfaces of this provider)r   ZL2listenr   r   r   r   Úl2listen;   s    zInterfaceProvider.l2listenc                 C   s   t jS )z4Return L3 socket used by interfaces of this provider)r   ZL3socketr   r   r   r   Úl3socket@   s    zInterfaceProvider.l3socketc                 C   s   t |jd s|jd o|jƒS )z,Returns whether an interface is valid or noté   é   )ÚboolÚipsÚmac)r   Údevr   r   r   Ú	_is_validE   s    zInterfaceProvider._is_validc                 K   sV   |j }| dd¡}|r,tjr,|r,tj |¡}t|jƒ}||j|pBd|jd |jd fS )a)  Returns the elements used by show()

        If a tuple is returned, this consist of the strings that will be
        inlined along with the interface.
        If a list of tuples is returned, they will be appended one above the
        other and should all be part of a single interface.
        Úresolve_macTÚ r    r!   )	r$   Úgetr   ZmanufdbZ_resolve_MACÚstrÚindexÚdescriptionr#   )r   r%   Úkwargsr$   r'   r+   r   r   r   Ú_formatJ   s    
zInterfaceProvider._formatN)Ú__name__Ú
__module__Ú__qualname__ÚnameÚheadersÚheader_sortÚlibpcapr   r   r   r   r   r&   r.   r   r   r   r   r   %   s   r   c                   @   sv   e Z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d„ Zdd„ Zdd„ Zdd„ ZdS )ÚNetworkInterfaceNc                 C   sP   || _ d| _d| _d| _d| _d | _ttƒ| _d | _	d| _
|d urL|  |¡ d S )Nr(   éÿÿÿÿF)Úproviderr2   r,   Únetwork_namer+   Úipr   Úlistr#   r$   ÚdummyÚupdate)r   r8   Údatar   r   r   Ú__init___   s    
zNetworkInterface.__init__c                 C   sÐ   |  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  d	d¡| _|  d
d¡| _|  dg ¡D ].}t	|ƒrš| j
d  |¡ q|| j
d  |¡ q|| j
d rÌ| jsÌ| j
d d | _dS )zzUpdate info about a network interface according
        to a given dictionary. Such data is provided by providers
        r2   r(   r,   r9   r+   r   r:   r$   Úflagsr<   Fr#   r!   r    N)r)   r2   r,   r9   r+   r:   r$   r@   r<   r   r#   Úappend)r   r>   r:   r   r   r   r=   p   s    zNetworkInterface.updatec                 C   s8   t |tƒr|| j| j| jfv S t |tƒr4| j|jkS dS ©NF)Ú
isinstancer*   r2   r9   r,   r6   Ú__dict__©r   Úotherr   r   r   Ú__eq__‰   s
    

zNetworkInterface.__eq__c                 C   s   |   |¡ S ©N)rG   rE   r   r   r   Ú__ne__‘   s    zNetworkInterface.__ne__c                 C   s
   t | jƒS rH   )Úhashr9   r   r   r   r   Ú__hash__•   s    zNetworkInterface.__hash__c                 C   s   | j r
dS | j | ¡S rB   )r<   r8   r&   r   r   r   r   Úis_valid™   s    zNetworkInterface.is_validc                 C   s
   | j  ¡ S rH   )r8   r   r   r   r   r   r   Ÿ   s    zNetworkInterface.l2socketc                 C   s
   | j  ¡ S rH   )r8   r   r   r   r   r   r   £   s    zNetworkInterface.l2listenc                 C   s
   | j  ¡ S rH   )r8   r   r   r   r   r   r   §   s    zNetworkInterface.l3socketc                 C   s$   d| j j| j| jrdp| jpdf S )Nz<%s %s [%s]>r<   r(   )Ú	__class__r/   r,   r<   r@   r   r   r   r   Ú__repr__«   s    þzNetworkInterface.__repr__c                 C   s   | j S rH   ©r9   r   r   r   r   Ú__str__±   s    zNetworkInterface.__str__c                 C   s
   | j | S rH   rO   rE   r   r   r   Ú__add__µ   s    zNetworkInterface.__add__c                 C   s
   || j  S rH   rO   rE   r   r   r   Ú__radd__¹   s    zNetworkInterface.__radd__)N)r/   r0   r1   r?   r=   rG   rI   rK   rL   r   r   r   rN   rP   rQ   rR   r   r   r   r   r6   ^   s    þ
r6   c                   @   sr   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d„Zdd„ ZdS )ÚNetworkInterfaceDictzDStore information about network interfaces and convert between namesc                 C   s   i | _ t | ¡ d S rH   )Ú	providersr   r?   r   r   r   r   r?   Ä   s    zNetworkInterfaceDict.__init__c                 C   s>   t  |¡D ].\}}|| jv r.|jr8|| j|< q
|| j|< q
d S rH   )ÚsixÚ	iteritemsr>   r5   )r   ZdatÚprovÚifnameÚifacer   r   r   Ú_loadÉ   s
    
zNetworkInterfaceDict._loadc                 C   s   |ƒ }|| j |< d S rH   )rT   )r   r8   rW   r   r   r   Úregister_providerÖ   s    z&NetworkInterfaceDict.register_providerc                 C   s   t jstdƒ‚tƒ t _dS )z#
        Reload conf.iface
        z#Error: conf.route isn't populated !N)r   ÚrouteÚ
ValueErrorÚget_working_ifrY   r   r   r   r   Úload_confifaceÛ   s    z#NetworkInterfaceDict.load_confifacec                 C   s,   |   ¡  | j ¡ D ]}|  | ¡ |¡ qd S rH   )ÚclearrT   ÚvaluesrZ   r   )r   rW   r   r   r   Ú_reload_provså   s    z"NetworkInterfaceDict._reload_provsc                 C   s   |   ¡  tjr|  ¡  d S rH   )rb   r   r\   r_   r   r   r   r   r   ë   s    zNetworkInterfaceDict.reloadc              	      sF   zt ‡ fdd„t | ¡D ƒƒW S  ttfy@   tdˆ  ƒ‚Y n0 dS )zNReturn the first network device name for a given
        device name.
        c                 3   s&   | ]}|j ˆ ks|jˆ kr|V  qd S rH   )r2   r,   ©Ú.0rY   ©r2   r   r   Ú	<genexpr>÷   s   ÿz5NetworkInterfaceDict.dev_from_name.<locals>.<genexpr>úUnknown network interface %rN©ÚnextrU   Ú
itervaluesÚStopIterationÚRuntimeErrorr]   )r   r2   r   re   r   Údev_from_nameñ   s    z"NetworkInterfaceDict.dev_from_namec              	      sF   zt ‡ fdd„t | ¡D ƒƒW S  ttfy@   tdˆ  ƒ‚Y n0 dS )z1Return interface for a given network device name.c                 3   s   | ]}|j ˆ kr|V  qd S rH   rO   rc   rO   r   r   rf      s   
ÿz<NetworkInterfaceDict.dev_from_networkname.<locals>.<genexpr>rg   Nrh   )r   r9   r   rO   r   Údev_from_networknameü   s    ÿÿz)NetworkInterfaceDict.dev_from_networknamec              	      sj   z&t ˆ ƒ‰ t‡ fdd„t | ¡D ƒƒW S  ttfyd   tˆ ƒdkrT|  tj	¡ Y S t
dˆ  ƒ‚Y n0 dS )z*Return interface name from interface indexc                 3   s   | ]}|j ˆ kr|V  qd S rH   )r+   rc   ©Úif_indexr   r   rf     s   
ÿz6NetworkInterfaceDict.dev_from_index.<locals>.<genexpr>Ú1z"Unknown network interface index %rN)Úintri   rU   rj   rk   rl   r*   rn   r   Úloopback_namer]   )r   rp   r   ro   r   Údev_from_index  s    z#NetworkInterfaceDict.dev_from_indexc                 C   sv   |||ddddddgdt  ¡  dddœ}tr`dd	lm}m} G d
d„ d|ƒ}||ƒ |ƒ| j|< nttƒ |ƒ| j|< dS )z,Internal function used for a testing purposeiüÿÿTz00:00:00:00:00:00r   z	127.0.0.1z::z{%s})r2   r,   r9   r+   r<   r$   r@   r#   ZguidZipv4_metricZipv6_metric)ÚNetworkInterface_WinÚWindowsInterfacesProviderc                   @   s   e Zd ZdZdS )z6NetworkInterfaceDict._add_fake_iface.<locals>.FakeProvZfakeN)r/   r0   r1   r2   r   r   r   r   ÚFakeProv)  s   rw   N)	ÚuuidÚuuid1r   Zscapy.arch.windowsru   rv   r>   r6   r   )r   rX   r>   ru   rv   rw   r   r   r   Ú_add_fake_iface  s(    
ôþz$NetworkInterfaceDict._add_fake_ifaceTFc           
      K   s°   t tƒ}t| jƒD ]F}| j| }|s.| ¡ s.q|j}||  |jf|j|fi |¤Ž ¡ qd}|D ](}	|t	||	 d|	j
 g|	jd�d 7 }qb|dd… }|r¨t|ƒ dS |S dS )zÜ
        Print list of available network interfaces in human readable form

        :param print_result: print the results if True, else return it
        :param hidden: if True, also displays invalid interfaces
        r(   )ZSource)ZsortByÚ
Nr7   )r   r;   Úsortedr>   rL   r8   rA   r2   r.   r   r3   r4   Úprint)
r   Úprint_resultZhiddenr-   ÚresZ
iface_namer%   rW   Úoutputr8   r   r   r   Úshow3  s.    
ÿ
ýüzNetworkInterfaceDict.showc                 C   s   | j dd�S )NF)r~   )r�   r   r   r   r   rN   R  s    zNetworkInterfaceDict.__repr__N)TF)r/   r0   r1   Ú__doc__r?   rZ   r[   r_   rb   r   rm   rn   rt   rz   r�   rN   r   r   r   r   rS   Á   s   

rS   c                   C   s   t tj ¡ ƒS )z Return a list of interface names)r;   r   ÚifacesÚkeysr   r   r   r   Úget_if_listZ  s    r…   c                  C   sh   t jjdd… } | jdd„ d� dd„ | D ƒ}t |t j ¡ ¡D ]}t|ƒ}| 	¡ r@|  S q@tt j
ƒS )zReturn an interface that worksNc                 S   s   | d S )Nr   r   )Úxr   r   r   Ú<lambda>f  ó    z get_working_if.<locals>.<lambda>)Úkeyc                 s   s   | ]}|d  V  qdS )é   Nr   )rd   r†   r   r   r   rf   g  rˆ   z!get_working_if.<locals>.<genexpr>)r   r\   ÚroutesÚsortÚ	itertoolsÚchainrƒ   ra   Úresolve_ifacerL   rs   )r‹   rƒ   rX   rY   r   r   r   r^   `  s    
r^   c                   C   s   dd„ t j ¡ D ƒS )zReturn all interfaces that workc                 S   s   g | ]}|  ¡ r|‘qS r   )rL   rc   r   r   r   Ú
<listcomp>u  rˆ   z&get_working_ifaces.<locals>.<listcomp>)r   rƒ   ra   r   r   r   r   Úget_working_ifacesr  s    r‘   c                 C   s   t j | ¡S )z6Return Scapy device name for given network device name)r   rƒ   rn   rO   r   r   r   rn   x  s    rn   c                 C   s   t j | ¡S )z,Return interface for a given interface index)r   rƒ   rt   ro   r   r   r   rt   ~  s    rt   c                 C   sj   t | tƒr| S ztj | ¡W S  tyP   zt| ƒW  Y S  tyJ   Y n0 Y n0 ttƒ | | | ddœd�S )z6
    Resolve an interface name into the interface
    T)r2   r,   r9   r<   )r>   )rC   r6   r   rƒ   rm   r]   rn   r   ©r%   r   r   r   r�   „  s"    
üþr�   c                 C   s
   t | ƒjS )zP
    Resolves the device network name of a device or Scapy NetworkInterface
    )r�   r9   r’   r   r   r   r9   ž  s    r9   Tc                 C   s   t j | ¡S )z*Print list of available network interfaces)r   rƒ   r�   )r'   r   r   r   Úshow_interfaces¦  s    r“   )T)-r‚   r�   rx   Úcollectionsr   Zscapy.configr   Zscapy.constsr   Zscapy.utilsr   Zscapy.utils6r   Zscapy.libs.six.movesr   Zscapy.libs.sixZlibsrU   ZscapyZscapy.compatr   r	   r
   r   r   r   r   r   r   Úobjectr   r6   r*   Z_GlobInterfaceTyperS   rƒ   ZIFACESr…   r^   r‘   rn   rt   r�   r9   r“   r   r   r   r   Ú<module>   s2   ,9` 