
    h                        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mZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZ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$ de%dee%         dee%ee%         f         dee%ee"e%df                  f         fdZ& G d de          Z' G d de          Z( G d de          Z)ddZ*dS )zb
Wireshark extcap API utils
https://www.wireshark.org/docs/wsdg_html_chunked/ChCaptureExtcap.html
    N)conf)WINDOWS)MTU)warning)network_nameresolve_ifaceInterfaceProviderNetworkInterface)Packet)SuperSocket)
PcapReader_create_fifo
_open_fifo)	castAnyDictListNoReturnOptionalTupleTypeUnionprogargsformatreturn.c                   	
 t          j        | g|z   t           j        t           j        d          }|                                \  }}|j        dk    rt          | d|j        d|          t          j        t                    }|	                    d          D ]


                                
|                                D ]i\  }}
                    |          sdt          dt          d	t          fd
	||                             t          	
fd|D                                   t!          t"          t          t$          t&          t          df                  f         |          S )z]
    Function used to call a program using the extcap format,
    then parse the results
    T)stdoutstderrtextr   z returned with error code z: 
valifar   c                 d    t          j        d| z  |          }|r|                    d          S dS )Nz{%s=([^}]*)}    )researchgroup)r"   r#   ms      U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/libs/extcap.py_matchz_extcap_call.<locals>._matchD   s5    Io3S99 &771::%r    c                 (    g | ]} |          S  r/   ).0r"   r,   r#   s     r+   
<listcomp>z _extcap_call.<locals>.<listcomp>K   s%    888#VVC%%888r-   .)
subprocessPopenPIPEcommunicate
returncodeOSErrorcollectionsdefaultdictlistsplitstripitems
startswithstrappendtupler   r   r   r   )r   r   r   pdataerrreskeywordvaluesr,   r#   s            @@r+   _extcap_callrH   -   sz    		z	 	 	A
 ID#|qdddALLLRURUVWWW

!$
'
'Czz$  iikk%||~~ 	 	OGV>>'** C c c    
 L88888888   
 S$uS#X//0#666r-   c                   j    e Zd ZdZdeeeedf         f         fdZdeeef         dee         fdZ	dS )_ExtcapNetworkInterfacez!
    Extcap NetworkInterface
    r   .c                 V    t          | j        j        d| j        dgg dg dd          S )zY
        Return a list of available configuration options on an extcap interface
        --extcap-interfacez--extcap-config)numbercalldisplaydefaultrequired)argvaluerO   rP   )rR   rS   )rH   providercmdprogr   selfs    r+   get_extcap_configz)_ExtcapNetworkInterface.get_extcap_configW   sH     M!!4#46GHKKK??? 
 
 	
r-   kwargc                    g }|                                  d         D ]}|d                             d                              dd          }||v r!||d         t          ||                   gz  }V|d         dk    rt	          d|d| j        d	          |d
         r|d
         dk    r|d
         dk    r||d         gz  }||d         |d
         gz  }|S )z8
        Return the extcap command line options
        rR   r%   -_   truezMissing required argument: 'z' on iface .   false)rX   r<   replacer?   
ValueErrorr   )rW   rY   cmdsxkeys        r+   get_extcap_cmdz&_ExtcapNetworkInterface.get_extcap_cmdd   s    ''))%0 	) 	)AA$**S//))#s33Ce||1s5:// Q46>>$*CC ---   1 1Q46>>QqTFNDDQqT1Q4L(DDr-   N)
__name__
__module____qualname____doc__r   r?   r   rX   r   rg   r/   r-   r+   rJ   rJ   R   sy         
4U38_(<#= 
 
 
 
d38n c      r-   rJ   c            	           e Zd ZdZdZe	 ddee         dee	         dee         fd            Z
ded	eddfd
ZefdededefdZddZdS )_ExtcapSocketz9
    Read packets at layer 2 using an extcap command
    TNsocketsremainr   c                     | S Nr/   )rn   ro   s     r+   selectz_ExtcapSocket.select   s	     r-   r\   rY   c                    |                     d          }|                     dd           }|t          d          t          |          }t          |t                    st          d           |j        di |}t          |          }d | _        t                      \  }}d|dd|g|z   }t          j        |g|z             | _        t          |          | _        t          | j                  | _        | j        | _        d S )	NrU   ifacez.Must select an interface for a extcap socket !z.Interface should be an _ExtcapNetworkInterfacerL   z	--capturez--fifor/   )pop	NameErrorr   
isinstancerJ   rc   rg   r   outsr   r2   r3   procr   fdr   readerins)rW   r\   rY   rU   rt   r   fiforz   s           r+   __init__z_ExtcapSocket.__init__   s   ))I&&		'4((=LMMMe$$%!899 	OMNNN#u#,,e,,U##	>>b$e[(DIDP$I
 
	 R.. ));r-   re   kwargsc                 (     | j         j        |fi |S rq   )r{   recv)rW   re   r   s      r+   r   z_ExtcapSocket.recv   s    t{,,V,,,r-   c                     | j                                          | j                             d           t          j        |            | j                                         d S )N   )timeout)ry   killwaitr   closerz   rV   s    r+   r   z_ExtcapSocket.close   sN    		q!!!$r-   rq   r   N)rh   ri   rj   rk   nonblocking_socketstaticmethodr   r   r   floatrr   r   r~   r   intr   r   r   r/   r-   r+   rm   rm      s          )- [) 26{2C   \3      *   - -c -3 -6 - - - -     r-   rm   c            
            e Zd ZdZdZdZdededdf fdZdee	e
f         fd	Zd
edee         fdZd
edefdZeZde
defdZde
dedeee	ee	         f         df         fdZ xZS )_ExtcapInterfaceProviderz<
    Interface provider made to hook on a extcap binary
    )IndexNameAddressr%   r   r   r   Nc                 |    |                     d          | _         t          t          |           j        |i | d S )NrU   )ru   rU   superr   r~   )rW   r   r   	__class__s      r+   r~   z!_ExtcapInterfaceProvider.__init__   s?    zz),,6&--6GGGGGGr-   c                    i }	 t          | j        dgdddgi          d         }ng# t          $ rZ}t          d| j        t          |                                                              d          d                    i cY d }~S d }~ww xY w|D ]^\  }}t          j	        d|          }|r&t          |                    d	                    d
z   }nd
}||||d}t          | |          ||<   _|S )Nz--extcap-interfaces	interfacerS   rO   zextcap %s failed to load: %sr!   z.*(\d+)r%   d   )namer   descriptionindex)rH   rU   r7   r   r   r?   r<   r;   r'   r(   r   r)   rJ   )	rW   rC   
interfacesex	netw_namer   _indexr   if_datas	            r+   loadz_ExtcapInterfaceProvider.load   s6   ,.	%&'w	23  	JJ
  	 	 	.	B%%d++B/  
 IIIIII	  * 	E 	EOItYz400F FLLOO,,s2 )#	 G 6dGDDDOOs   !& 
B
AB?B
B
r\   c                 B    t          j        t          | j                  S )NrU   )	functoolspartialrm   rU   rW   r\   s     r+   	_l2listenz"_ExtcapInterfaceProvider._l2listen   s     EEEEr-   c                      t          d          )Nz3Only sniffing is available for an extcap provider !)rc   r   s     r+   	_l3socketz"_ExtcapInterfaceProvider._l3socket   s    NOOOr-   devc                     dS )NTr/   )rW   r   s     r+   	_is_validz"_ExtcapInterfaceProvider._is_valid   s    tr-   .c                 D    t          |j                  |j        |j        fS )z.Returns a tuple of the elements used by show())r?   r   r   r   )rW   r   r   s      r+   _formatz _ExtcapInterfaceProvider._format   s    
 CI#*:;;r-   )rh   ri   rj   rk   headersheader_sortr   r~   r   r?   r
   r   r   r   r   r   r   	_l2socketboolr   r   r   r   r   __classcell__)r   s   @r+   r   r      s[         +GKHc HS HT H H H H H Hd3 001    <F3 F4#4 F F F FPC PH P P P P I- $    <%<< 5d3i0#56< < < < < < < <r-   r   c                     t           rt          j        d          } nt          j        d          } t          j        j        D ]}t          j        |          }|                    d          D ]}|	                                r| 
                    |j                  s1t          ||z                                            }t          j        |          j                            dd          d          G fddt                    }t          j                            t%          j        ||	                     ьd
S )zB
    Load extcap folder from wireshark and populate providers
    z^[^.]+(?:\.bat|\.exe)?$z^[^.]+(?:\.sh)?$*r_   r%   r   c                       e Zd Z ZdS )load_extcap.<locals>._provN)rh   ri   rj   r   )provnames   r+   _provr      s        r-   r   r   N)r   r'   compiler   r   extcap_folderspathlibPathglobis_filematchr   r?   absolutersplitr   ifacesregister_providerr   r   )patternfldroot_cmdprogrU   r   r   s         @r+   load_extcapr      sS     2*788*011y'  |C  		# 	 	H##%% W]]8=-I-I 4(?446677G|G,,188a@@CH             0       K))!%999   	 r-   r   )+rk   r8   r   r   r'   r2   scapy.configr   scapy.constsr   
scapy.datar   scapy.errorr   scapy.interfacesr   r   r	   r
   scapy.packetr   scapy.supersocketr   scapy.utilsr   r   r   typingr   r   r   r   r   r   r   r   r   r?   rH   rJ   rm   r   r   r/   r-   r+   <module>r      s|   
          				                                                     ) ) ) ) ) ) < < < < < < < < < <
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
"7s "7Cy"7c49n-"7 3U38_ 556"7 "7 "7 "7J+ + + + +. + + +\( ( ( ( (K ( ( (V:< :< :< :< :<0 :< :< :<z     r-   