
    /I_r                     H   S SK r S SKrS SKrS SKrS SKr S SKJr  S SKJrJ	r	  S SK
Js  Jr  S SKJr  S SKJr  S SKJr  S SKrS SKr S SKJs  Jr   " S S\\	5      rg! \\4 a)    S SKJr  S SKJrJ	r	  S SKJr  S SKJr  S SKJr  S SKJr   NOf = f! \ a	    S SKJr   NOf = f)	    N)Sysfs)CacheRequirements)utils)ifaceLinkPrivFlags)Linkc                   :   \ rS rSrSr\R                  " S5      rS rS r	S r
S rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS=S jrS=S jrS rS rS rS rS r  S>S jr S r!S r"S  r#S?S! jr$S?S" jr%S# r&S$ r'S% r(\)S& 5       r*S@S' jr+\)S( 5       r,\)S) 5       r-\)SAS* j5       r.\)S+ 5       r/\)SAS, j5       r0\)S- 5       r1\)SAS. j5       r2\)S/ 5       r3SBS0 jr4S1 r5\)S2 5       r6SBS3 jr7S4 r8S5 r9S6 r:S7 r;\)SCS8 j5       r<\)SDS9 j5       r=S: r>S?S; jr?S<r@g)EIPRoute2>   i  z\s+dst\s+(\d+.\d+.\d+.\d+)\s+c                     [         R                  " U 5        [        R                  " U 5        [        U l        0 U l        SU l        [        R                  (       d  S U l        S U l	        S U l
        g g )NFc                     g N ___s     $/usr/share/ifupdown2/lib/iproute2.py<lambda>#IPRoute2.__init__.<locals>.<lambda>O   s        c                     g r   r   r   s     r   r   r   P   s    Tr   c                     g r   r   )r   r   ___s      r   r   r   Q   s    $r   )r   __init__r   r   sysfs_IPRoute2__batch_IPRoute2__batch_modebridge_utils_is_installedbridge_set_stpbridge_del_mcqv4srcbridge_set_mcqv4srcselfs    r   r   IPRoute2.__init__C   sZ    td#
! 55"4D'9D$'>D$ 6r   c                    [         R                  " [         R                  SSS9n[         R                  [         R                  -  [         R
                  -  Ul        [        R                  " S[        R                  SSS5      Ul        UR                  [         R                  R                  U5        UR                  [         R                  R                  [         R                  R                  U[         R                  R                   0 05        UR#                  SS5        U=R$                  [         R                  -  sl         UR'                  5         U R*                  R-                  U5        g! [(         a     N(f = f)a,  
WORK AROUND - when creating tunnel via iproute2 we still need to fill
our internal cache to keep track of this interface until we receive the
NEWLINK notification. This code is a copy-paste from:
    nlcache.tx_nlpacket_get_response_with_error_and_cache_on_ack

:param ifname:
:param kind:
:return:
F)	use_colorBxxxiiir   N)nlpacketr   RTM_NEWLINKNLM_F_CREATENLM_F_REQUEST	NLM_F_ACKflagsstructpacksocket	AF_UNSPECbodyadd_attributeIFLA_IFNAMEIFLA_LINKINFOIFLA_INFO_KINDIFLA_INFO_DATAbuild_message
priv_flagsdecode_service_header	Exceptioncacheadd_link)r#   ifnamekindpackets       r   "__update_cache_after_link_creation+IPRoute2.__update_cache_after_link_creationW   s    x33UeL,,x/E/EEHZHZZkk)V-=-=q!QGX]]66?X]]88MM(($MM((";
 	 	Q" 	X333	
 ((* 	

F#  		s   E3 3
F ?F c                     XR                   ;   a  U R                   U   R                  U5        g U/U R                   U'   g r   )r   appendr#   prefixcmds      r   __add_to_batchIPRoute2.__add_to_batch   s3    \\!LL '',$'5DLL r   c                     U R                   (       a  U R                  X5        g [        R                  " U< SU< 35        g )N )r   _IPRoute2__add_to_batchr   exec_commandrE   s      r   __execute_or_batchIPRoute2.__execute_or_batch   s,    ,&#67r   c                 |    U R                   (       a  U R                  X5        gU R                  SU< SU< 35        g)z
The batch function has it's own dryrun handler so we only handle
dryrun for non-batch mode. Which will be removed once the "utils"
module has it's own dryrun handlers
zexecuting: rK   N)r   rL   log_info_dry_runrE   s      r   __execute_or_batch_dry_run#IPRoute2.__execute_or_batch_dry_run   s.     ,!!"DEr   c                 D    U R                   (       d  SU l         0 U l        g g )NT)r   r   r"   s    r   batch_startIPRoute2.batch_start   s       $DDL !r   c                 l    U R                   (       a  U R                  (       d   SU l         U ?S U l        g U R                  R                  5        H,  u  p[        R                  " SU-  SR                  U5      S9  M.      SU l         U ?S U l        g ! [         a    e f = f! SU l         U ?S U l        f = f)NFz%s -force -batch -
stdin)r   r   itemsr   rM   joinr;   )r#   rF   commandss      r   batch_commitIPRoute2.batch_commit   s    	 $$DLL !&DDL %)LL$6$6$8 ""(61))H- %9 !&DDL  		 !&DDLs   "B A
B BB! !B3c                 h    U R                   R                  U5      (       d  U R                  U5        g g r   )r<   
link_is_uplink_up_forcer#   r>   s     r   link_upIPRoute2.link_up   s*    zz$$V,,v& -r   c                 h    U R                   R                  U5      (       a  U R                  U5        g g r   )r<   ra   link_down_forcerc   s     r   	link_downIPRoute2.link_down   s*    ::  ((  ( )r   c                 &    U R                  U5        g r   )rb   rc   s     r   link_up_dry_runIPRoute2.link_up_dry_run   s    6"r   c                 &    U R                  U5        g r   )rg   rc   s     r   link_down_dry_runIPRoute2.link_down_dry_run   s    V$r   c                 J    U R                  [        R                  SU-  5        g )Nzlink set dev %s up_IPRoute2__execute_or_batchr   ip_cmdrc   s     r   rb   IPRoute2.link_up_force   s    .BV.KLr   c                 J    U R                  [        R                  SU-  5        g )Nzlink set dev %s downrq   rc   s     r   rg   IPRoute2.link_down_force   s    .Dv.MNr   c                     X R                   R                  U5      :w  a)  U R                  [        R                  SU< SU< 35        g g Nlink set dev z master )r<   
get_masterrr   r   rs   r#   r>   masters      r   link_set_masterIPRoute2.link_set_master   s9    ZZ**622##/5v> 3r   c                 T    U R                  [        R                  SU< SU< 35        g rx   rq   r{   s      r   link_set_master_dry_run IPRoute2.link_set_master_dry_run   s    LL+16:	
r   c                     [         R                  " U5      U R                  R                  U5      :w  aK  U R	                  U5        U R                  [         R                  SU< SU< 35        U R                  U5        g g Nry   z	 address r   mac_str_to_intr<   get_link_address_rawrh   rr   rs   rd   r#   r>   addresss      r   link_set_addressIPRoute2.link_set_address   sa    (DJJ,K,KF,SSNN6"##06@ LL  Tr   c                     U R                  U5        U R                  [        R                  SU< SU< 35        U R	                  U5        g r   rh   rr   r   rs   rd   r   s      r   link_set_address_dry_run!IPRoute2.link_set_address_dry_run   s9    vLL,2G<	
 	Vr   c                    [         R                  " U5      U R                  R                  U5      :w  aS  U R	                  U5        U R                  [         R                  SU< SU< 35        U(       d  U R                  U5        g g g r   r   r#   r>   r   	keep_downs       r   link_set_address_and_keep_down'IPRoute2.link_set_address_and_keep_down   si    (DJJ,K,KF,SSNN6"##06@ V$  Tr   c                     U R                  U5        U R                  [        R                  SU< SU< 35        U(       d  U R	                  U5        g g r   r   r   s       r   &link_set_address_and_keep_down_dry_run/IPRoute2.link_set_address_and_keep_down_dry_run   sA    vLL,2G<	
 LL  r   c                 b    [         R                  " [         R                  < SU< SU< 35        g )N
 link add  type r   rM   rs   )r#   r>   	link_types      r   link_addIPRoute2.link_add       ||VY0	
r   c           	      j    [         R                  " [         R                  < SU< SU< SU< 35        g )N link add link  name  type macvlan mode r   r#   r>   macvlan_ifnamemacvlan_modes       r   link_add_macvlanIPRoute2.link_add_macvlan	  s#    ||V^\C	
r   c                 d    U R                  US[        R                  < SU< SU< SU< 35        g )Nz
executing r   r   r   )log_info_ifname_dry_runr   rs   r   s       r   link_add_macvlan_dry_run!IPRoute2.link_add_macvlan_dry_run  s'     	$$V||V^\.C 	
r   c                 b    [         R                  " [         R                  < SU< SU< 35        g )Nr   z type veth peer name r   )r#   r>   	peer_names      r   link_add_vethIPRoute2.link_add_veth  r   r   c                    U R                   R                  SU-  5        SU-  /nU(       a  UR                  SU-  5        U(       a  UR                  SU-  5        U(       a  UR                  SU-  5        U(       a  UR                  SU-  5        U R                  [        R
                  SR                  U5      5        U R                  US5        g )	Nz creating single vxlan device: %sz#link add dev %s type vxlan externallocal %sdev %sgroup %sz
dstport %srK   vxlan)loggerinforD   rr   r   rs   r\   +_IPRoute2__update_cache_after_link_creation)r#   r>   ipgroupphysdevportrG   s          r   link_add_single_vxlanIPRoute2.link_add_single_vxlan   s    ;fDE4v=>JJzB'JJx')*JJzE)*JJ|d*+chhsm<//@r   Nc
                    U(       a  U(       a  [        S5      eU R                  R                  U5      (       a  SXR                  4-  /n
OSXU R                  4-  /n
U(       aD  UR                  R
                  (       a  U
R                  SU-  5        OU
R                  SU-  5        U(       a  U
R                  SU-  5        US:X  a  U
R                  S5        Ub  U
R                  S	U-  5        U	(       a  U
R                  S
U	-  5        U(       a  U
R                  SU-  5        U R                  [        R                  SR                  U
5      5        g )Nz-svcnodeip and remoteip are mutually exclusivez%link set dev %s type vxlan dstport %dz+link add dev %s type vxlan id %s dstport %dr   z	remote %sz	ageing %soff
nolearningzttl %sr   r   rK   )r;   r<   link_existsVXLAN_UDP_PORTr   is_multicastrD   rr   r   rs   r\   )r#   namevxlanidlocaltunnelip	svcnodeip	remoteipslearningageingttlr   rG   s              r   link_create_vxlanIPRoute2.link_create_vxlan4  s   KLL::!!$''7,,-.C >$"5"567C
 ||((

:	12

;23JJ{V+,uJJ|$?JJx#~&JJx')*JJzM12chhsm<r   c                 8   [         R                  < SU< 3n/ n [        R                  " [        R
                  " U5      [        R                  SS9n[         R                  " U[        R                  5        [        R                  " SUR                  S9R                  5       nUR                  5         [         R                  " [        R                  5         UR                  S5       H^  nU R                  R!                  U5      nU(       d  M'  UR#                  S5      U:w  d  M>  UR%                  UR#                  S5      5        M`     [         R                  " [        R                  5        U$ ! [&         a    U R(                  R+                  S5         NMf = f! [        R,                   a>  n	U	R.                  S:w  a$  U R(                  R1                  [3        U	5      5         S n	A	NS n	A	ff = f! [         R                  " [        R                  5        f = f)	Nz fdb show brport F)stdout	close_fds)grepz00:00:00:00:00:00rY   rX      zerror parsing ip link output)r   
bridge_cmd
subprocessPopenshlexsplitPIPE#enable_subprocess_signal_forwardingsignalSIGINTcheck_outputr   decodewait$disable_subprocess_signal_forwardingVXLAN_PEER_REGEX_PATTERNsearchr   rD   r;   r   warningCalledProcessError
returncodeerrorstr)
r#   devr   rG   	cur_peerspsoutputlmes
             r   get_vxlan_peersIPRoute2.get_vxlan_peers[  sw   ).)9)93?		F!!%++c"2:??V[\B55b&--H,,-JRTR[R[\cceFGGI66v}}EDd+A55<<Q?AqQWWQZ94!((4 , 66v}}E  D##$BCD,, 	*||q !!#a&)	* 66v}}EsZ   B>F 4E3 E3 )$E3 3%FF G3 FF G024G+&G3 +G00G3 3&Hc                 h    [         R                  " SSSUSSSUSU/
5        U R                  US5        g )Nr   linkaddtypexfrmr   if_id)r   exec_commandlr   )r#   r>   	xfrm_namexfrm_ids       r   link_add_xfrmIPRoute2.link_add_xfrmt  s8    T65)VVUTZ\celmn//	6Br   c                 &    U R                  X5        g r   )r   )r#   r>   r?   s      r   link_add_openvswitchIPRoute2.link_add_openvswitchx  s    //=r   c                    U R                   R                  U5      (       a  g / nSU;   a  UR                  S5        US;   a  UR                  SU< SU< 35        OUR                  SU< SU< 35        U(       aD  UR                  5        H0  u  pVUR                  U5        U(       d  M  UR                  U5        M2     [        R
                  " [        R                  < SSR                  U5      < 35        U R                  X5        g )	N6z-6)gretapz	link add r   ztunnel add z mode rK   )	r<   r   rD   r[   r   rM   rs   r\   r   )r#   
tunnelnamemodeattrsrG   kvs          r   tunnel_createIPRoute2.tunnel_create  s    ::!!*--$;JJt:JJ
DABJJ*dCD

11JJqM &
 	ellCHHSMBC//
Ar   c                 F   U R                   R                  U5      (       d  gSU-  /nU(       aD  UR                  5        H0  u  pEUR                  U5        U(       d  M  UR                  U5        M2     U R	                  [
        R                  SR                  U5      5        g)ztunnel change function Nztunnel change %srK   )r<   r   r[   rD   rr   r   rs   r\   )r#   r  r  rG   r  r  s         r   tunnel_changeIPRoute2.tunnel_change  su    zz%%j11!J./

11JJqM & 	chhsm<r   c                     U R                   R                  U5      (       a$  U R                  [        R                  SU-  5        g g )Nzaddr flush dev %s)r<   link_has_iprr   r   rs   rc   s     r   
addr_flushIPRoute2.addr_flush  s6    ::!!&))##ELL2E2NO *r   c                     U(       a  SOSnU R                  U5        U R                  [        R                  SU< SU< 35        U R	                  U5        g )Nnoneeui64ry    addrgenmode r   )r#   r>   addrgenlink_createdaddrgen_strs        r   link_set_ipv6_addrgen_dry_run&IPRoute2.link_set_ipv6_addrgen_dry_run  s>     'fWvRXZe.fgVr   c           	         U R                   R                  U5      nXB:X  a  gU R                  R                  U5      nU(       a  U R                  R                  SU-  5        gU(       a  U R                  R                  U5      nOU R                   R                  U5      nUS:  a0  U R                  R                  U< SU< SU(       a  SOS< 35        gU(       d  U R                   R                  U5        U R                   R                  U5      nU(       a  U R                  U5        U R                  [        R                  S	U< S
[        R                  R!                  U5      < 35        U(       a  U R#                  U5        g)zs
IFLA_INET6_ADDR_GEN_MODE values:
0 = eui64
1 = none

:param ifname:
:param addrgen:
:param link_created:
:return:
Tz7%s: cannot set addrgen: ipv6 is disabled on this deviceFi   zK: ipv6 addrgen is disabled on device with MTU lower than 1280 (current mtu z): cannot set addrgen r   onry   r  )r<   get_link_ipv6_addrgen_moder   get_ipv6_conf_disable_ipv6r   r   link_get_mtuget_link_mtuaddress_flush_linkra   rg   rr   r   rs   r   ifla_inet6_addr_gen_mode_dictgetrb   )r#   r>   r  r  cached_ipv6_addr_gen_modedisabled_ipv6link_mtu
is_link_ups           r   link_set_ipv6_addrgenIPRoute2.link_set_ipv6_addrgen  s4    %)JJ$I$I&$Q!$/

==fEKKVY__`zz..v6Hzz..v6Hd?KK &7%2LN O 
 JJ))&1ZZ**62
  (LL068Z8Z8^8^_f8gh	

 v&r   c                     / n/ nU=(       d    /  H7  nUR                   S:X  a  UR                  U5        M&  UR                  U5        M9     / nU =(       d    /  H  nUR                  U5        M     XRU-   :H  $ )N   )versionrD   )running_addrs
user_addrsip4ip6r   running_ipobjs         r   &__compare_user_config_vs_running_state/IPRoute2.__compare_user_config_vs_running_state  su    ""BzzQ

2

2	 # %2%B  $ & s++r   c           
         U(       a  U R                   R                  UU/US9nU R                  Xs5      (       a  g U(       a  U(       a  US   US   :w  a  / nOUnU=(       d    /  H3  n	 X;   a  M  U R                  [        R
                  SU	< SU< 35        M5     U Ha  n	 U(       a.  U R                  [        R
                  SU	< SU< SU< 35        M9  U R                  [        R
                  SU	< SU< 35        Mc     g ! [         a6  n
U R                  R                  U< S[        U
5      < 35         S n
A
M  S n
A
ff = f! [         a6  n
U R                  R                  U< S[        U
5      < 35         S n
A
M  S n
A
ff = f)	N)with_address_virtualr   z	addr del  dev z: removing ip address failed: z	addr add z metric z: add_address: )r<   get_managed_ip_addresses/_IPRoute2__compare_user_config_vs_running_staterr   r   rs   r;   r   r   r   r   )r#   ifacobjr>   address_listpurge_existingmetricr2  running_address_listskipaddrr   s              r   add_addressesIPRoute2.add_addresses  sU   #'::#F#F	%9 $G $  ::;O^^ $aL`abLc9c#,22a| ++ELLRVX^:_`	 3 !DL++ELL\`bhjp:qr++ELLRVX^:_` ! ! aKK''PVX[\]X^(_``a  L!!63q6"JKKLs<   )D0(D"3E(E
E+D??E
F+FFc                 b    [         R                  " [         R                  < SU < SU< 35        g )Nz stp rK   )r   rM   	brctl_cmd)bridge	stp_states     r   r   IPRoute2.bridge_set_stp  s    U__fiPQr   c                 P    0 n[         R                  " [         R                  < SU < 35      nU(       aO  UR                  5        H;  n UR	                  5       nUR                  US   / 5      R                  US   5        M=     U$ ! [         a     MN  f = f! [         a     g f = f)Nz fdb show dev    r   )r   rM   r   
splitlinesr   
setdefaultrD   r;   )r   fdbsr   	fdb_entryentriess        r   bridge_fdb_show_devIPRoute2.bridge_fdb_show_dev   s    	D''@P@PRU(VWF!'!2!2!4I"+//"3
B7>>wqzJ "5 K %   		s6   AB 
7BB 
BB BB 
B%$B%c                     U(       a  SOSnU(       a  SU-  OSnU(       a  SU-  OSn[         R                  " [         R                  < SU< SU < SU< SU< SU< 35        g )Nr#    vlan %s dst %s z fdb replace r3  rK   r   rM   r   r   r   vlanrA  remotetargetvlan_strdst_strs           r   bridge_fdb_addIPRoute2.bridge_fdb_add0  T    !r(,:$"(.)f$B   
	
r   c           	      j    [         R                  " [         R                  < SU < SU< SU< 35        g)zH
bridge fdb add dev $dev 00:00:00:00:00:00 src_vni $src_vni dst $dst_ip
z fdb add dev z 00:00:00:00:00:00 src_vni z dst NrQ  )r   src_vnidst_ips      r   bridge_fdb_add_src_vniIPRoute2.bridge_fdb_add_src_vniB  s+    
 	   	
r   c                     U(       a  SOSnU(       a  SU-  OSnU(       a  SU-  OSn[         R                  " [         R                  < SU< SU < SU< SU< SU< 35        g )Nr#   rN  rO  rP  z fdb append r3  rK   rQ  rR  s           r   bridge_fdb_appendIPRoute2.bridge_fdb_appendQ  rZ  r   c           	      j    [         R                  " [         R                  < SU< SU < SU< 35        g )N	 fdb del r3  z	 src_vni rQ  )r   macr\  s      r   bridge_fdb_del_src_vniIPRoute2.bridge_fdb_del_src_vnic  s)       	
r   c                     U(       a  SOSnU(       a  SU-  OSnU(       a  SU-  OSn[         R                  " [         R                  < SU< SU < SU< SU< SU< 35        g )Nr#   rN  rO  rP  rd  r3  rK   rQ  rR  s           r   bridge_fdb_delIPRoute2.bridge_fdb_delo  rZ  r   c                     U(       d  g U H2  n[         R                  " [         R                  < SU< SU < 35        M4     g )Nz vlan del vid r3  rQ  r>   vidsr  s      r   bridge_vlan_del_vid_list!IPRoute2.bridge_vlan_del_vid_list  s0    A/4/?/?FK r   c           
          U(       a  SOSnU H/  nU R                  [        R                  SU< SU< SU< 35        M1     g )Nr#   rN  vlan del vid r3  rK   rr   r   r   r#   r>   rm  	is_bridgerU  r  s         r   bridge_vlan_del_vid_list_self&IPRoute2.bridge_vlan_del_vid_list_self  6    $"A##  /0&&A r   c                 J   [        S[        U5      5       H4  n U R                  [        R                  SU< SX$   < SX4   < 35        M6     g ! [
         aI  nS[        U5      R                  5       ;  a!  U R                  R                  U5         S nAM   S nAM  S nAff = f)Nr   zvlan add dev z vid z tunnel_info id exists)
rangelenrr   r   r   r;   r   lowerr   r   )r#   r>   rm  vnisir   s         r    bridge_vlan_add_vlan_tunnel_info)IPRoute2.bridge_vlan_add_vlan_tunnel_info  s    q#d)$A	)''$$ %  )3q6<<>1KK%%a(( 2)s   0A
B"8BB"c                 t    U H2  n[         R                  " [         R                  < SU< SU < 35        M4     g )Nz vlan add vid r3  rQ  rl  s      r   bridge_vlan_add_vid_list!IPRoute2.bridge_vlan_add_vid_list  s*    A/4/?/?FK r   c           
          U(       a  SOSnU H/  nU R                  [        R                  SU< SU< SU< 35        M1     g )Nr#   rN  vlan add vid r3  rK   rr  rs  s         r   bridge_vlan_add_vid_list_self&IPRoute2.bridge_vlan_add_vid_list_self  rw  r   c                 T    U R                  [        R                  SU< SU< 35        g )Nrq   untagged pvid dev rr  r#   r>   pvids      r   bridge_vlan_del_pvidIPRoute2.bridge_vlan_del_pvid  !    6:FC	
r   c                 T    U R                  [        R                  SU< SU< 35        g )Nr  r  rr  r  s      r   bridge_vlan_add_pvidIPRoute2.bridge_vlan_add_pvid  r  r   c           
           [        U5      n[
        R                  " S[
        R                  X4-  5        g ! [         a9  nU R                  R                  U< SU< S[	        U5      < 35         S nAg S nAff = f)Nz': del mcqv4src vlan: invalid parameter : z%s delmcqv4src %s %d)intr;   r   r   r   r   rM   r@  )r#   rA  rS  r   s       r   r    IPRoute2.bridge_del_mcqv4src  sf    	t9D
 	1U__f4SST	  	KK &c!f6 7	s   7 
A:/A55A:c           
          [        U5      nUS:X  d  US:  a  U R                  R                  SU-  5        g UR                  S5      n[        U5      S:w  a  U R                  R                  SU-  5        g U HX  nUR                  5       (       a"  [        US	5      S:  d  [        US	5      S
:  d  M:  U R                  R                  SU-  5          g    [        R                  " S[        R                  XU4-  5        g ! [         a9  nU R                  R                  U< SU< S[	        U5      < 35         S nAg S nAff = f)Nz': set mcqv4src vlan: invalid parameter r  r   i  z mcqv4src vlan '%d' invalid range.   z"mcqv4src '%s' invalid IPv4 address
      z%s setmcqv4src %s %d %s)r  r;   r   r   r   r   r   r{  isdigitr   rM   r@  )r#   rA  rS  	mcquerierr   r   r  s          r   r!   IPRoute2.bridge_set_mcqv4src  s   	t9D 19tKK BT IJ__S!r7a<KK Dy PQA99;;#a*q.C2J4D##$H9$TU 
 	4W`7aab!  	KKRXZ^`cde`fgh	s   D   
E
/D>>Ec                     U(       d  g U(       d  [         R                  < SU< S3nO[         R                  < SU< SU< S3nU(       a  USU-  -  nUSU -  -  nU(       a  US-  n[         R                  " U5        g )Nz route add default via  proto kernelz route add table  default via 
 metric %s dev %sz onlinkr   rs   rM   )r>   gatewayvrfr9  onlinkrG   s         r   route_add_gatewayIPRoute2.route_add_gateway  sg    @EgVCINWZ\cdC<&((Cy6!!9C3r   c                     U(       d  gU(       d  [         R                  < SU< S3nO[         R                  < SU< SU< S3nU(       a  USU-  -  nUSU -  -  n[         R                  " U5        g)z]
delete default gw
we don't need a DRYRUN handler here as utils.exec_command should have one
Nz route del default via r  z route del table r  r  r  r  )r>   r  r  r9  rG   s        r   route_del_gatewayIPRoute2.route_del_gateway  s\     @EgVCINWZ\cdC<&((Cy6!!3r   c                 ,   S nUR                   [        R                  -  (       a9   UR                   H'  nU R                  R                  U5      nU(       d  M'    O    / nU H  n[        R                  " U5      nUR                  S:X  d  M+  SUR                  UR                  4-  n	U(       a-  U R                  [        R                  SU	< SU< SU< 35        O(U R                  [        R                  SU	< SU< 35        UR                  X45        M     U Hd  u  ptU(       a/  U R                  [        R                  SU< SU< SU< S35        M;  U R                  [        R                  SU< SU< S35        Mf     g ! [         a     GN4f = f)Nr(  z%s/%dz
route del z table r3  z
route add z proto kernel metric 9999)link_privflagsr   	VRF_SLAVEupperifacesr<   get_vrf_tabler;   	ipaddress
ip_networkr)  network	prefixlenrr   r   rs   rD   )
r#   ifaceobjmacvlan_ifacenameips	vrf_tableupper_ifaceip_route_delr   ip_network_objroute_prefixs
             r   fix_ipv6_route_metricIPRoute2.fix_ipv6_route_metric  sS   	""%7%A%AA#+#7#7K $

 8 8 EI y $8 B&11"5N%%*&.*@*@.BZBZ)[[++:F	Sde
 ++1=?PQ
 ##\$=># & *MB''LLOQS\^op
 ''LLFHJ[\ */  s   /F F F 
FFc                     U(       a  [         R                  < SU< SU< 3nO[         R                  < SU< 3n[         R                  " U5      nU(       a@  UR                  5       S   nU(       a&  UR	                  5       nXfR                  S5      S-      $ g ! [         a1  nU R                  R                  S[        U5      -  5         S nAg S nAff = f)Nz route get z vrf r   r   r   zip_route_get_dev: failed .. %s)
r   rs   rM   rF  r   indexr;   r   debugr   )r#   rF   
vrf_masterrG   r   rlinerattrsr   s           r   ip_route_get_devIPRoute2.ip_route_get_dev0  s    	I27,,
S+0<<@'',F))+A."[[]F!,,u"5"9::   	IKK>QGHH	Is   BB 
C$'CC)__batch__batch_moder    r!   r   r   )F)NNNr  NNNr   )FNF)NTN)T)NNT)NN)A__name__
__module____qualname____firstlineno__r   recompiler   r   r   rL   rr   #_IPRoute2__execute_or_batch_dry_runrU   r^   rd   rh   rk   rn   rb   rg   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r%  staticmethodr5  r=  r   rK  rX  r^  ra  rf  ri  rn  ru  r  r  r  r  r  r    r!   r  r  r  r  __static_attributes__r   r   r   r
   r
   >   s   N!zz*IJ?()$^)8	F
 (')#%MO

!%!



A( NRX\%=N2C>B,
= P5n , , LJ R R   
 
" 
 
 
 
" 	
 	
 
 
"  )  

Uc2    &    &*Xr   r
   ) r  r   r   r  r   ifupdown2.lib.sysfsr   ifupdown2.lib.base_objectsr   r   ifupdown2.nlmanager.ipnetwork	nlmanager	ipnetworkifupdown2.ifupdown.utilsr   ifupdown2.ifupdown.ifacer   ifupdown2.nlmanager.nlpacketr   ImportErrorModuleNotFoundError	lib.sysfslib.base_objectsnlmanager.ipnetworkifupdown.utilsifupdown.ifacenlmanager.nlpacketr.   r0   r(   r;   r
   r   r   r   <module>r     s   2 
    ()>55.;1  *33Aul A+ 	() (4+$1'(   *)*s#   )A 	B .BBB! B!