
    h8                     p   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m	Z	 ddl
mZ ddlmZ ddl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mZmZ  G d
 de          Z G d de          Zeeef         Z  G d deeef                   Z! e!            xe_"        xZ#Z"d Z$d Z%d Z&d Z'd Z(ddZ)d Z*ddZ+dS )z
Interfaces management
    N)defaultdict)conf)WINDOWSLINUX)pretty_list)in6_isvalid)UserDict)
castAnyDefaultDictDictListNoReturnOptionalTupleTypeUnionc                   p    e Zd ZU dZdZeedf         ed<   dZdZ	d Z
d Zd	 Zd
 Zd Zd Zd ZdefdZdS )InterfaceProviderUnknown)IndexNameMACIPv4IPv6.headers   Fc                     t           )zEReturns a dictionary of the loaded interfaces, by their
        name.)NotImplementedErrorselfs    T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/interfaces.pyloadzInterfaceProvider.load*   s
     "!    c                 *    |                                  S )z7Same than load() but for reloads. By default calls load)r#   r    s    r"   reloadzInterfaceProvider.reload0   s     yy{{r$   c                     t           j        S )z4Return L2 socket used by interfaces of this provider)r   L2socketr!   devs     r"   	_l2socketzInterfaceProvider._l2socket5        }r$   c                     t           j        S )z:Return L2listen socket used by interfaces of this provider)r   L2listenr)   s     r"   	_l2listenzInterfaceProvider._l2listen:   r,   r$   c                     t           rG| j        s@|j        t          j        k    r+|r!ddlm} t          t          d         |          S ddlm	} |S t          j
        S )z4Return L3 socket used by interfaces of this providerr   )L3RawSocket6zscapy.supersocket.SuperSocket)L3RawSocket)r   libpcapnamer   loopback_namescapy.supersocketr1   r
   r   r2   L3socket)r!   r*   ipv6r1   r2   s        r"   	_l3socketzInterfaceProvider._l3socket?   st      	# 	##(d6H*H*H #::::::D!@A<PPP999999""}r$   c                 ^    t          |j        d         s|j        d         o|j                  S )z,Returns whether an interface is valid or not      )boolipsmacr)   s     r"   	_is_validzInterfaceProvider._is_validL   s*     SWQZ-371::37;;;r$   c                 
   |j         }|                    dd          }|r-t          j        r!|rt          j                            |          }t          |j                  }||j        |pd|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   manufdb_resolve_MACstrindexdescriptionr>   )r!   r*   kwargsr?   rB   rH   s         r"   _formatzInterfaceProvider._formatQ   s{     gjj55 	14< 	1C 	1,++C00CCIs	r371:swqzJJr$   returnc                     d| j         z  S )z
        repr
        z<InterfaceProvider: %s>)r4   r    s    r"   __repr__zInterfaceProvider.__repr__d   s     )4944r$   N)__name__
__module____qualname__r4   r   r   rG   __annotations__header_sortr3   r#   r&   r+   r/   r9   r@   rK   rN    r$   r"   r   r   $   s         DGGU38_GGGKG" " "  
  
  
  < < <
K K K&5# 5 5 5 5 5 5r$   r   c                   b    e Zd Z	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
ddZd Zd Zd Zd ZdS )NetworkInterfaceNc                     || _         d| _        d| _        d| _        d| _        d | _        t          t                    | _        d| _	        d | _
        d| _        ||                     |           d S d S )NrC   F)providerr4   rI   network_namerH   ipr   listr>   typer?   dummyupdate)r!   rY   datas      r"   __init__zNetworkInterface.__init__l   sz    
 !	
t$$	
KK r$   c                    |                     dd          | _        |                     dd          | _        |                     dd          | _        |                     dd          | _        |                     dd          | _        |                     dd	          | _        |                     d
d          | _        |                     dd          | _        |                     dd          | _	        |                     dg           D ]R}t          |          r!| j        d                             |           2| j        d                             |           S| j        d         r!| j        s| j        d         d         | _        dS dS dS )zzUpdate info about a network interface according
        to a given dictionary. Such data is provided by providers
        r4   rC   rI   rZ   rH   r   r[   r]   rX   r?   flagsr^   Fr>   r<   r;   N)rD   r4   rI   rZ   rH   r[   r]   r?   rc   r^   r   r>   append)r!   r`   r[   s      r"   r_   zNetworkInterface.update~   sj   
 HHVR((	88M266 HH^R88XXgq))
((4$$HHVR((	88E2&&XXgq))
XXgu--
((5"%% 	' 	'B2 '""2&&&&""2&&&& 8A; 	%tw 	%hqk!nDGGG	% 	% 	% 	%r$   c                     t          |t                    r|| j        | j        | j        fv S t          |t
                    r| j        |j        k    S dS NF)
isinstancerG   r4   rZ   rI   rV   __dict__r!   others     r"   __eq__zNetworkInterface.__eq__   sV    eS!! 	MTY(94;KLLLe-.. 	3=EN22ur$   c                 .    |                      |           S N)rk   ri   s     r"   __ne__zNetworkInterface.__ne__   s    ;;u%%%%r$   c                 *    t          | j                  S rm   )hashrZ   r    s    r"   __hash__zNetworkInterface.__hash__   s    D%&&&r$   c                 H    | j         rdS | j                            |           S rf   )r^   rY   r@   r    s    r"   is_validzNetworkInterface.is_valid   s'    : 	5}&&t,,,r$   c                 6    | j                             |           S rm   )rY   r+   r    s    r"   l2socketzNetworkInterface.l2socket       }&&t,,,r$   c                 6    | j                             |           S rm   )rY   r/   r    s    r"   l2listenzNetworkInterface.l2listen   rv   r$   Fc                 8    | j                             | |          S rm   )rY   r9   )r!   r8   s     r"   l3socketzNetworkInterface.l3socket   s    }&&tT222r$   c                 X    d| j         j        d| j        d| j        rdp| j        pddS )N< z [r^   rC   z]>)	__class__rO   rI   r^   rc   r    s    r"   rN   zNetworkInterface.__repr__   sF     !%!8!8!8!%!1!1!1!%!7!MDJ<L"!M!MO 	Or$   c                     | j         S rm   rZ   r    s    r"   __str__zNetworkInterface.__str__   s      r$   c                     | j         |z   S rm   r   ri   s     r"   __add__zNetworkInterface.__add__   s     5((r$   c                     || j         z   S rm   r   ri   s     r"   __radd__zNetworkInterface.__radd__   s    t(((r$   rm   )F)rO   rP   rQ   ra   r_   rk   rn   rq   rs   ru   rx   rz   rN   r   r   r   rT   r$   r"   rV   rV   k   s            $% % %4  & & &' ' '- - -- - -- - -3 3 3 3O O O! ! !) ) )) ) ) ) )r$   rV   c                   h     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZddZddZd Z xZS )NetworkInterfaceDictzDStore information about network interfaces and convert between namesc                 d    i | _         t          t          |                                            d S rm   )	providerssuperr   ra   )r!   r~   s    r"   ra   zNetworkInterfaceDict.__init__   s-    "D))2244444r$   c                     |                                 D ]*\  }}|| j        v r|j        r
|| j        |<    || j        |<   +d S rm   )itemsr`   r3   )r!   datprovifnameifaces        r"   _loadzNetworkInterfaceDict._load   s\    
 !YY[[ 	* 	*MFE""< .(-DIf%$)	&!!	* 	*r$   c                      |            }|| j         |<   | j        r*|                     |                                |           d S d S rm   )r   r`   r   r&   )r!   rY   r   s      r"   register_providerz&NetworkInterfaceDict.register_provider   sO    xzz#'x 9 	,JJt{{}}d+++++	, 	,r$   c                 l    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_ifr   r    s    r"   load_confifacez#NetworkInterfaceDict.load_confiface   s/     z 	DBCCC#%%


r$   c                     |                                   | j                                        D ]*}|                     |                                |           +d S rm   )clearr   valuesr   r&   )r!   r   s     r"   _reload_provsz"NetworkInterfaceDict._reload_provs   sU    

N))++ 	, 	,DJJt{{}}d++++	, 	,r$   c                 r    |                                   t          j        sd S |                                  d S rm   )r   r   r   r   r    s    r"   r&   zNetworkInterfaceDict.reload   s;    z 	Fr$   c                     	 t          fd|                                 D                       S # t          t          f$ r t	          dz            w xY w)zNReturn the first network device name for a given
        device name.
        c              3   H   K   | ]}|j         k    s|j        k    |V  d S rm   )r4   rI   ).0r   r4   s     r"   	<genexpr>z5NetworkInterfaceDict.dev_from_name.<locals>.<genexpr>  sL       N N%!J$..%2Ct2K2K 2K2K2K2KN Nr$   Unknown network interface %rnextr   StopIterationRuntimeErrorr   )r!   r4   s    `r"   dev_from_namez"NetworkInterfaceDict.dev_from_name  s    
	D N N N N4;;== N N N N N N|, 	D 	D 	D;dBCCC	D	   ,0 $Ac                     	 t          fd|                                 D                       S # t          t          f$ r t	          dz            w xY w)z1Return interface for a given network device name.c              3   2   K   | ]}|j         k    |V  d S rm   r   )r   r   rZ   s     r"   r   z<NetworkInterfaceDict.dev_from_networkname.<locals>.<genexpr>  s<       ? ?% -== ====? ?r$   r   r   )r!   rZ   s    `r"   dev_from_networknamez)NetworkInterfaceDict.dev_from_networkname  s    	 ? ? ? ?4;;== ? ? ? ? ? ?|, 	 	 	.  	r   c                 4   	 t                    t          fd|                                 D                       S # t          t          f$ rG t                    dk    r!|                     t          j                  cY S t          dz            w xY w)z*Return interface name from interface indexc              3   2   K   | ]}|j         k    |V  d S rm   )rH   )r   r   if_indexs     r"   r   z6NetworkInterfaceDict.dev_from_index.<locals>.<genexpr>   s;       4 4% ;(22 22224 4r$   1z"Unknown network interface index %r)
intr   r   r   r   rG   r   r   r5   r   )r!   r   s    `r"   dev_from_indexz#NetworkInterfaceDict.dev_from_index  s    	N8}}H 4 4 4 44;;== 4 4 4 4 4 4|, 	N 	N 	N8}}##001CDDDDDAHLMMM		Ns   ;? ABB00:00:00:00:00:00c                    |||dd|dddgdt          j                    z  ddg d}t          r4ddlm}m}  G d	 d
|          } | |            |          | j        |<   dS t          t                      |          | j        |<   dS )z,Internal function used for a testing purposeiTr   z	127.0.0.1z::z{%s})r4   rI   rZ   rH   r^   r?   rc   r>   guidipv4_metricipv6_metricnameservers)NetworkInterface_WinWindowsInterfacesProviderc                       e Zd ZdZdS )6NetworkInterfaceDict._add_fake_iface.<locals>.FakeProvfakeN)rO   rP   rQ   r4   rT   r$   r"   FakeProvr   >  s        r$   r   N)	uuiduuid1r   scapy.arch.windowsr   r   r`   rV   r   )r!   r   r?   r`   r   r   r   s          r"   _add_fake_ifacez$NetworkInterfaceDict._add_fake_iface(  s     !"&TZ\\)
 
  	L* * * * * * * *    4    !5 4

! !DIf
 !11B1D1Dd K KDIfr$   TFc           	         t          t                    }t          | j                  D ]i}| j        |         }|s|                                s&|j        }||j        |j        f                             |j	        f |j
        |fi |z              jd}|D ])}	|	\  }
}|t          ||	         d|
z   g|          dz   z  }*|dd         }|rt          |           dS |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
        rC   )Source)sortBy
NrX   )r   r\   sortedr`   rs   rY   r   rS   rd   r4   rK   r   print)r!   print_resulthiddenrJ   res
iface_namer*   r   outputkeyhdrsr   s               r"   showzNetworkInterfaceDict.showH  s*    $ ++ 	 	J)J'C #,,.. <Dt/0188|t|C::6:::     	 	CLD&kCt#$   	 FF
  	&MMM4Mr$   c                 .    |                      d          S )NF)r   )r   r    s    r"   rN   zNetworkInterfaceDict.__repr__h  s    yyey,,,r$   )r   )TF)rO   rP   rQ   __doc__ra   r   r   r   r   r&   r   r   r   r   r   rN   __classcell__)r~   s   @r"   r   r      s        NN5 5 5 5 5
* * *, , ,& & &, , ,  	D 	D 	D	 	 	N N NL L L L@   @- - - - - - -r$   r   c                  X    t          t          j                                                  S )z Return a list of interface names)r\   r   ifaceskeysrT   r$   r"   get_if_listr   p  s        ""###r$   c                     t           j        j        dd         } |                     d            d | D             }t	          j        |t           j                                                  D ]J}	 t           j                            |          }|	                                r|c S ;# t          $ r Y Gw xY w	 t           j                            t           j                  S # t          $ r Y dS w xY w)zReturn an interface that worksNc                     | d         S )Nr   rT   )xs    r"   <lambda>z get_working_if.<locals>.<lambda>|  s
    ad r$   )r   c              3   &   K   | ]}|d          V  dS )   NrT   )r   r   s     r"   r   z!get_working_if.<locals>.<genexpr>}  s&      ##qad######r$   )r   r   routessort	itertoolschainr   r   r   rs   r   r5   )r   r   r   r   s       r"   r   r   v  s   
 Zqqq!F
KKNNK#####F###F /&$+*<*<*>*>??  	K44V<<E~~  	 	 	D	{//0BCCC   tts$   14B))
B65B6:(C# #
C10C1c                  R    d t           j                                        D             S )zReturn all interfaces that workc                 :    g | ]}|                                 |S rT   )rs   )r   r   s     r"   
<listcomp>z&get_working_ifaces.<locals>.<listcomp>  s'    HHHeu~~7G7GHEHHHr$   )r   r   r   rT   r$   r"   get_working_ifacesr     s'     IHt{1133HHHHr$   c                 @    t           j                            |           S )z6Return Scapy device name for given network device name)r   r   r   r   s    r"   r   r     s     ;++L999r$   c                 @    t           j                            |           S )z,Return interface for a given interface index)r   r   r   )r   s    r"   r   r     s     ;%%h///r$   Tc                 z   t          | t                    r| S 	 t          j                            |           S # t
          $ r5 	 t          j                            |           cY S # t
          $ r Y nw xY wY nw xY w|st          d| z            t          j                                         t          | d          S )z6
    Resolve an interface name into the interface
    zInterface '%s' not found !F)retry)	rg   rV   r   r   r   r   r   r&   resolve_iface)r*   r   s     r"   r   r     s    
 #'(( 
{((---   	;33C88888 	 	 	D	D	
  =5;<<<KE****s3   8 
A7A$!A7$
A1.A70A11A76A7c                 *    t          |           j        S )zP
    Resolves the device network name of a device or Scapy NetworkInterface
    )r   rZ   )r*   s    r"   rZ   rZ     s    
 **r$   c                 @    t           j                            |           S )z*Print list of available network interfaces)r   r   r   )rB   s    r"   show_interfacesr     s     ;K(((r$   )T),r   r   r   collectionsr   scapy.configr   scapy.constsr   r   scapy.utilsr   scapy.utils6r   scapyscapy.compatr	   typingr
   r   r   r   r   r   r   r   r   r   objectr   rV   rG   _GlobInterfaceTyper   r   IFACESr   r   r   r   r   r   rZ   r   rT   r$   r"   <module>r      s}         # # # # # #       ' ' ' ' ' ' ' ' # # # # # # $ $ $ $ $ $  ! ! ! ! ! !                       D5 D5 D5 D5 D5 D5 D5 D5N_) _) _) _) _)v _) _) _)D +S01 Z- Z- Z- Z- Z-8C)9$9: Z- Z- Z-z !5 4 6 6 6 6fv$ $ $  0I I I: : :0 0 0+ + + +*+ + +) ) ) ) ) )r$   