
    h!                         d 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mZmZmZ ddlmZmZmZmZmZmZ  G d d	          Z e            e_        ej                                         d
S )z-
Routing and handling of network interfaces.
    )	plain_str)conf)Scapy_Exceptionwarning)resolve_iface)atolltoaitompretty_list)AnyDictListOptionalTupleUnionc                   v    e Zd Zd Zd Zd Zd Z	 	 	 	 	 ddZd Zd	 Z	d
 Z
d Zd Zddej        dfdZd ZdS )Routec                     g | _         |                                  t          j        r|                                  d S d S N)routesinvalidate_cacher   route_autoloadresyncselfs    O/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/route.py__init__zRoute.__init__    sA     	KKMMMMM	 	    c                     i | _         d S r   )cacher   s    r   r   zRoute.invalidate_cache'   s    


r   c                 X    ddl m} |                                   |            | _        d S )Nr   )read_routes)
scapy.archr"   r   r   )r   r"   s     r   r   zRoute.resync+   s7    ******!kmmr   c                     g }| j         D ]_\  }}}}}}t          |          j        }|                    t	          |          t	          |          |||t          |          f           `t          |dg          S )N)NetworkNetmaskGatewayIfacez	Output IPMetric)r   r   descriptionappendr	   strr   )	r   rtlstnetmskgwifaceaddrmetricif_reprs	            r   __repr__zRoute.__repr__1   s    15 	( 	(-Cb%v#E**6GLL$s))s))!f++' ( ( ( ( 5]^` ` 	`r   N   c                    ||d}}n9|(|                     d          \  }}t          |          }nt          d          |d}|!|r|}	n|}	|                     |	          \  }}
}nd}
t	          |          t          |          |||
|fS )N    /zDmake_route: Incorrect parameters. You should specify a host or a net0.0.0.0)splitintr   router   r
   )r   hostr.   r0   devr3   thenetr/   msk_bnhopifaddr_s               r   
make_routezRoute.make_route@   s     CFF_IIcNNMFEe**CC!"hiii:B; !ZZ--NCFVd3iiS&&AAr   c                 x    |                                   | j                             | j        |i |           dS )a  Add a route to Scapy's IPv4 routing table.
        add(host|net, gw|dev)

        :param host: single IP to consider (/32)
        :param net: range to consider
        :param gw: gateway
        :param dev: force the interface to use
        :param metric: route metric

        Examples:

        - `ip route add 192.168.1.0/24 via 192.168.0.254`::
            >>> conf.route.add(net="192.168.1.0/24", gw="192.168.0.254")

        - `ip route add 192.168.1.0/24 dev eth0`::
            >>> conf.route.add(net="192.168.1.0/24", dev="eth0")

        - `ip route add 192.168.1.0/24 via 192.168.0.254 metric 1`::
            >>> conf.route.add(net="192.168.1.0/24", gw="192.168.0.254", metric=1)
        N)r   r   r+   rE   )r   argskargss      r   addz	Route.add[   sC    , 	?4?D:E::;;;;;r   c                     |                                    | j        |i |}	 | j                            |          }| j        |= dS # t          $ r t	          d          w xY w)zuRemove a route from Scapy's IPv4 routing table.
        delt(host|net, gw|dev)

        Same syntax as add()
        zNo matching route found!N)r   rE   r   index
ValueError)r   rG   rH   r=   is        r   deltz
Route.deltt   s}     	///	9!!%((AA 	9 	9 	97888	9s   "A A!c                    |                                   |                    d          dgz   d d         \  }}t          t          |                    }t	          |          }||z  }t          | j                  D ]<\  }}	|	\  }
}}}}}||k    r|dk    r||||||f| j        |<   ,|
|||||f| j        |<   =t          j        	                                 d S )Nr9   32   r:   )
r   r;   r
   r<   r   	enumerater   r   netcacheflush)r   iffr2   the_addr	the_msk_bthe_mskthe_rawaddrthe_netrM   r=   r.   r/   r0   r1   r3   s                  r   ifchangezRoute.ifchange   s    #zz#$7!<)s9~~&&8nn'!$+.. 	I 	IHAu05-Cb%ve||Y")7Bx!PA"%sBx!HAr   c                     |                                   g }| j        D ]$}||d         k    r|                    |           %|| _        d S )N   )r   r   r+   )r   rU   
new_routesrts       r   ifdelzRoute.ifdel   s\    
+ 	" 	"Bbe||b!!!! r   c                    |                                   |                    d          dgz   d d         \  }}t          t          |                    }t	          |          }||z  }| j                            ||d||df           d S )Nr9   rP   rQ   r:   r6   )r   r;   r
   r<   r   r   r+   )r   rU   r2   rV   rW   rX   rY   rZ   s           r   ifaddzRoute.ifadd   s    #zz#$7!<)s9~~&&8nn'GWihJKKKKKr   Fc                    |pd}t          |t                    r.	 t          |          }n# t          $ r t	          d          w xY w||f| j        v r| j        ||f         S |                    d          d                             dd          }	 |                    d          }|dk     rn9||d	         d
z                       d
          }|d	|         |||z   d	         z   }Ut          |          }g }	| j
        D ]v\  }
}}}}}|s|||k    rt          |          }||k    r%|	                    ddt          j        |dff           ||z  |
|z  k    r|	                    |||||ff           w|	s#|rt          d|           |pt          j        ddfS |	                    d            |	d         d         }|d         dk    r4|s2|d         |                     |d         d          d         |d         f}|| j        ||f<   |S )a  Returns the IPv4 routes to a host.

        :param dst: the IPv4 of the destination host
        :param dev: (optional) filtering is performed to limit search to route
                    associated to that interface.

        :returns: tuple (iface, output_ip, gateway_ip) where
            - ``iface``: the interface used to connect to the host
            - ``output_ip``: the outgoing IP that will be used
            - ``gateway_ip``: the gateway IP that will be used
        r:   z Unknown IP address input (bytes)r9   r   *0T-N.    r6   z:No route found for IPv4 destination %s (no default route?)c                 $    | d          | d         fS )Nr   r6    )xs    r   <lambda>zRoute.route.<locals>.<lambda>   s    1Q4%1 r   )keyrQ   )	_internal)
isinstancebytesr   UnicodeDecodeError	TypeErrorr    r;   replacefindr   r   r+   r   loopback_namer   sortr=   )r   dstr?   verbosern   _dstidxmatol_dstpathsdr0   rM   ameaarets                    r   r=   zRoute.route   s    Yc5!! 	DDnn% D D D BCCCD:##:sCj))yy~~a ((c22	/))C..CQwwcddc!'',,A:S1WXX.D	/ ::"&+ 	2 	2Aq"aB 188aBX~~T%7I$FG   1!a%((aaBZ0111 	E 4 ./24 4 4-4-y)DD 	

..
///Ahqkq6Yyq64::c!f:==a@#a&IC!$
C:
s	   + Ac                     g }| j         D ]I\  }}}}}}|dk    r|dk    r||k    r|| dz  z  }	|                    t          |	                     J|st          d|           |S )Nr   rh   z(No broadcast address found for iface %s
)r   r+   r	   r   )
r   rU   
bcast_listr.   r/   r0   r1   r2   r3   bcasts
             r   get_if_bcastzRoute.get_if_bcast   s    
15 	+ 	+-Cb%vaxx
""e||C4*,-Ed5kk**** 	F?EEEr   )NNNNr6   )__name__
__module____qualname__r   r   r   r5   rE   rI   rN   r[   r`   rb   r   verbr=   r   rj   r   r   r   r      s            $ $ $` ` `  B B B B6< < <29 9 9  $! ! !L L L $	U < < < <|    r   r   N)__doc__scapy.compatr   scapy.configr   scapy.errorr   r   scapy.interfacesr   scapy.utilsr   r	   r
   r   typingr   r   r   r   r   r   r   r=   ifacesload_confifacerj   r   r   <module>r      s/   
 # " " " " "       0 0 0 0 0 0 0 0 * * * * * * 5 5 5 5 5 5 5 5 5 5 5 5               U U U U U U U Up UWW
        r   