
    /I_`                     j   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s  J	r	  S SK
Js  Jr  S SKJr  S SK7  S SKJr  S SKJr  S SKJr  S SK7  S SKJr   " S	 S
5      r% " S S\\5      r&g! \\4 a=    S SKJr  S SKJ	r	  S SKJr  S SKJr  S SK7  S SK Jr  S SK!Jr  S SK"Jr  S SK#7  S SK$Jr   N[f = f)    N)Addon)statemanager_api)*)utils)Link)dhclient)
moduleBasec                       \ rS rSrSrSrg)vrfPrivFlags-       N)__name__
__module____qualname____firstlineno__	PROCESSED__static_attributes__r       "/usr/share/ifupdown2/addons/vrf.pyr   r   -   s    Ir   r   c                      \ rS rSrSrSSSS/SS/S	.S
S/S/S	.S.S.rSrSrSrSr	SSSSS.r
S rS rS rS rSMS jrS rS rSNS jrS  rSOS" jrS# rS$ rS% rS& rS' rS( rS) rS* rSOS+ jrS, rS- rS. r   SPS/ jr!S0 r"S1 r#S2 r$S3 r%S4 r&S5 r'SOS6 jr(S7 r)S8 r*S9 r+S: r,  SQS; jr-S< r.SOS= jr/S> r0S? r1SOS@ jr2SRSA jr3SOSB jr4SC r5SD r6SE r7SOSF jr8SG r9\/\4\8\7\9SH.r:SI r;SJ r<  SRSK jr=SLr>g!)Svrf1   z)ifupdown2 addon module to configure vrfs zvrf configuration modulezpvrf device routing table id. key to creating a vrf device. Table id is either 'auto' or 'valid routing table id'autoz<number>zvrf-table autozvrf-table 1001)help	validvalsexamplezvrf the interface is part ofz<text>zvrf blue)	vrf-tabler   )mhelpattrsz0/etc/iproute2/rt_tables.d/ifupdown2_vrf_map.confzu# This file is autogenerated by ifupdown2.
# It contains the vrf name to table mapping.
# Reserved table range %s %s
i  i  localmaindefaultunspec)2552542530c                 
   [         R                  " U 5        [        R                  " U /UQ70 UD6  S U l        U R                  R
                  U l        [        R                  R                  U R                  R
                  SS9U l
        SU l        / U l        [        R                  R                  (       a  U R                  (       a1  [         R"                  R%                  SU R                  -  5      (       dw  [         R"                  R%                  U R&                  5      (       aI   U R(                  R+                  SU R&                  -  5        [         R,                  " U R&                  5         [4        R6                  " S[4        R8                  -  5      R;                  5       nU Vs/ s H"  nSR=                  UR?                  5       5      PM$     snU l          [4        R6                  " S
[4        R8                  -  5      R;                  5       nU Vs/ s H"  nSR=                  UR?                  5       5      PM$     snU l"        SU l#        SU l$        U RK                  U R@                  5      (       a  SU l$        SU l#        SU l&        U RK                  U RD                  5      (       a  SU l&        SU l#        SU l'        0 U l(        SU l)        [        R                  R                  U R                  R
                  SS9U l*        U RT                  (       d  U RV                  U l*        [        R                  R                  U R                  R
                  SS9U l,        U RX                  (       d  U RZ                  U l,        [3        U RT                  5      [3        U RX                  5      /U R\                  S   S   S'   [        R                  R                  U R                  R
                  SS9U l/        SU l0        SU l1        [        R                  R                  U R                  R
                  SS9U l2        [        R                  R                  U R                  R
                  SS9U l3        SU l4        g ! [.         a2  nU R(                  R1                  S[3        U5      -  5         S nAGN=S nAff = fs  snf ! [.         a9  n/ U l         U R(                  RC                  S	[3        U5      -  5         S nAGNS nAff = fs  snf ! [.         a9  n/ U l"        U R(                  RC                  S[3        U5      -  5         S nAGNS nAff = f)Nzvrf-mgmt-devname)module_nameattrF/sys/class/net/%szvrf: removing file %szvrf: removing file failed (%s)%s rule show zvrf: cache v4: %s%s -6 rule showzvrf: cache v6: %sTzvrf-table-id-startzvrf-table-id-endr    r   
validrangezvrf-max-countr   
vrf-helperzvrf-close-socks-on-down)5r   __init__r	   dhclientcmd	__class__r   namepolicymanagerpolicymanager_apiget_module_globalsvrf_mgmt_devnameat_exituser_reserved_vrf_tableifupdownflagsflagsPERFMODEospathexistsiproute2_vrf_filenameloggerinforemove	Exceptiondebugstrr   exec_commandip_cmd
splitlinesjoinsplitip_rule_cachewarningip6_rule_cachel3mdev_checkedl3mdev4_rule_l3mdev_rulel3mdev6_rule_iproute2_vrf_map_initializediproute2_vrf_mapiproute2_vrf_map_sync_to_diskvrf_table_id_startVRF_TABLE_STARTvrf_table_id_endVRF_TABLE_END_modinfovrf_max_countvrf_fix_local_table	vrf_count
vrf_helpervrf_close_socks_on_downwarn_on_vrf_map_write_err)selfargskargseip_rulesrs         r   r2   vrf.__init__S   sh   tD14151NN++	 - ? ? R R//# !S !

 ')$((&&277>>:M"";# ,$ ,$ ww~~d8899/KK$$%<&*&@&@&A BIId889	>)).+0<<+8 99C ?G!Hx!#((1779"5x!HD
	>))*;+0<<+8 99C @H"I1388AGGI#6"ID $!T//00 $D"&D!T0011 $D"&D-2* "-2*"/"A"A"T"Taeaoaoaxax  @T"T  #U&&&*&:&:D# - ? ? R R_c_m_m_v_v  ~P R  !Q$$$($6$6D! ''(%%&=
g{+L9
 +<<OO\`\j\j\s\s  {JO  K#' '99LLY]YgYgYpYp  xDL  E'4'F'F'Y'Yfjftftf}f}  E^'Y  (_$)-&q ! /KK%%&F'*1v'. / // "I 	>!#DKK 3c!f <==	> #J 	>"$DKK 3c!f <==	>sm   (AQ6 19R: *)R5R: 9T )T >T 6
R2 'R--R25R: :
S=.S88S= T 
U.UUc                 (   UR                  S5      nU(       d  gUS:w  as  [        U5      U R                  :  d  [        U5      U R                  :  aA  U R                  R                  SUR                  UU R                  U R                  4-  5        gg)Nr   Fr   z1%s: vrf table id %s out of reserved range [%d,%d]T)get_attr_value_firstintrX   rZ   rC   errorr5   )rc   ifaceobj	vrf_tables      r   _check_vrf_table_idvrf._check_vrf_table_id   s    11+>	^d555^d333KKQ'}}(#66#4466 7
 r   c                 <   UR                   [        R                  -  (       a.   U R                  U5      nU R	                  U5      nU=(       a    U$ g! [
         a?  nU R                  R                  UR                  < S[        U5      < 35         S nAgS nAff = f)N: FT)
	link_kindifaceLinkKindVRFrp    _check_vrf_system_reserved_namesrF   rC   rm   r5   rH   )rc   rn   ifaceobj_getfunccheck_vrf_table_idcheck_vrf_sys_namesrf   s         r   syntax_checkvrf.syntax_check   s     1 11&*&>&>x&H"&*&K&KH&U#)A.AA   !!hmmSV"DEs   ,A 
B5BBc                     [        U R                  R                  5       5      nUR                  U;   a  U R	                  S[        U5      -  U5        gg)Nz'cannot use system reserved %s vrf namesFT)listsystem_reserved_rt_tablesvaluesr5   	log_errorrH   )rc   rn   system_reserved_namess      r   rw   $vrf._check_vrf_system_reserved_names   sP     $T%C%C%J%J%L M==11NND!"78:;CEr   c                 "   U R                   (       a  g 0 U l        Sn[        R                  R	                  U R
                  5      (       a  [        U R
                  U(       a  SOS5       nUR                  5       nU H  nUR                  5       nUS   S:X  a  M   UR                  5       R                  5       u  pgU R                  R                  [        U5      5      (       a  SnMl  XpR                  [        U5      '   M     S S S 5        U R                   R#                  5       n	U	(       a  XR                  :w  a  Xl        SnU(       a,  U(       a  U R%                  SS5        OU R%                  SS5        SU l        SU l        U R                  R                  S
5        U R                  R                  U R                  5        S n
[+        U R,                  U R.                  5       H'  nU R                  R                  U5      (       d    OUn
M)     Xl        SU l         [3        U R                  5      U l        g ! [         a9  nU R                  R                  SU< S[        U5      < S	35         S nAGM  S nAff = f! , (       d  f       GN= f)NFzr+rh   r   #Tz'vrf: iproute2_vrf_map: unable to parse  ()zvrf: dumping iproute2_vrf_map)rU   rV   r?   r@   rA   rB   open	readlinesstriprM   getrl   rF   rC   rD   rH   cacheget_vrf_table_map_iproute2_vrf_map_openrW   r:   rangerX   rZ   last_used_vrf_tablelenr_   )rc   writetodiskiproute2_vrf_map_force_rewrite
vrf_map_fdlinesltablevrf_namerf   running_vrf_mapr   ts               r   _iproute2_vrf_map_initialize vrf._iproute2_vrf_map_initialize   s   -- !#).&77>>$4455d00+$3OS]",,.A	Ats{ ,-GGIOO,=)0044SZ@@ >B:$<D--c%j9  P& **668O7L7L$L$3!-1*-++D%8++E48-2* 	89../"t..,,.A((,,Q//"#	.
 $7 -1*T223A % ((\]_bcd_e)fg POsC   )1I?AH9&I?(H9?I?9
I<-I70I?7I<<I??
Jc                 :   U R                   (       a  [        R                  R                  S5      (       d=  U R                  R                  SSU-  -   5        U R                  R                  S5        O!U R                  R                  SSU-  -   5        SU l         g g )Nz/etc/iproute2/rt_tables.d/z%unable to save iproute2 vrf to table z	map (%s)
z^cannot find /etc/iproute2/rt_tables.d. pls check if your iproute2 version supports rt_tables.dz%unable to open iproute2 vrf to table F)rb   r?   r@   rA   rC   rD   rO   )rc   errstrs     r   _iproute2_map_warnvrf._iproute2_map_warn  s    ))77>>">??  !H!-v!5"6 7   "9 : ##$K!-v!5%6 7-2D* *r   c                 z   [         R                  R                  (       d  U R                  (       d  g U R                  R                  SU R                  -  5         [        U R                  S5       nUR                  U R                  U R                  U R                  4-  5        U R                  R                  5        H  u  p#UR                  U< SU< S35        M      UR                  5         S S S 5        g ! , (       d  f       g = f! [         a$  nU R!                  [#        U5      5         S nAg S nAff = f)Nvrf: syncing table map to %swr.   
)r<   r=   DRYRUNrW   rC   rD   rB   r   writeiproute2_vrf_filehdrrX   rZ   rV   itemsflushrF   r   rH   )rc   fr   vrf   s        r   _iproute2_vrf_map_sync_to_disk"vrf._iproute2_vrf_map_sync_to_disk  s    &&227445 	6		d00#6!11D4K4K--4/ / 0 11779DAGG1-. :	 766  	##CF+	s7   D 1BC;2D ;
D	D 	D 
D:D55D:c                    U R                   R                  SU R                  -  5        [        R                  R
                  (       a  g U(       a  SOSnU(       d  [        U R                  U5       nUR                  U R                  U R                  U R                  4-  5        U R                  R                  5        H  u  pVUR                  U< SU< S35        M      UR                  5         S S S 5        g g ! , (       d  f       g = f)Nr   a+r   r.   r   )rC   rD   rB   r<   r=   r   r   r   r   rX   rZ   rV   r   r   )rc   	sync_vrfsappendfmoder   r   r   s          r   r   vrf._iproute2_vrf_map_open$  s    7445 	6%%Cd00%8J  !:!:151H1H151F1F1H"H I !11779DA$$A%67 :  " 98 88s   1BC<<
D
c                 2    UR                  S5      (       a  gg)Nr   TF)rk   rc   rn   s     r   _is_vrfvrf._is_vrf4  s    ((55r   Nc                    UR                  S5      nU(       a  [        R                  Ul        U=R                  [
        R                  -  sl        U=R                  [        R                  -  sl        US:w  a$  U R                  R                  [        U5      5        UR                  S5      nU(       d  g[        R                  Ul        U=R                  [        R                   -  sl        U/$ )z1Returns list of interfaces dependent on ifaceobj r   r   r   N)rk   ifaceLinkTypeLINK_MASTER	link_typert   ru   rv   role	ifaceRoleMASTERr;   r   rl   
LINK_SLAVElink_privflagsifaceLinkPrivFlags	VRF_SLAVE)rc   rn   ifacenames_allro   vrf_iface_names        r   get_upper_ifacenamesvrf.get_upper_ifacenames9  s     11+>	!.!:!:H-"3"33MMY---MF"
 ,,33C	NC!66u=*55#5#?#??r   c                     g Nr   r   s     r   get_upper_ifacenames_running vrf.get_upper_ifacenames_runningQ  s    r   c                 n    U R                   R                  5        H  u  p#X1:X  d  M  [        U5      s  $    g r   )rV   r   rH   )rc   vrf_dev_namer   r   s       r   _get_iproute2_vrf_tablevrf._get_iproute2_vrf_tableT  s1    ))//1DA 1v 2 r   c                    U R                   S :X  a  U R                  nOU R                   S-   n[        XR                  5       HG  nU R                  R                  U5      (       a  M%  X R                  ;  d  M6  X l         [        U5      s  $    g )Nr   )r   rX   r   rZ   rV   r   r;   rH   )rc   table_id_startr   s      r   _get_avail_vrf_table_idvrf._get_avail_vrf_table_idZ  sw    ##t+!44N!559N~'<'<=A))--a00!=!==+,(1v	 >
 r   c                     U R                   R                  [        U5      5      nU(       a+  X1R                  :w  a  U R	                  SU< SU< 3U5        g g g )Nz	table id z already assigned to vrf dev )rV   r   rl   r5   r   )rc   vrfifaceobjtable_idold_vrf_names       r   _iproute2_is_vrf_tableid_inuse"vrf._iproute2_is_vrf_tableid_inusef  sK    ,,00X?L,<,<<NN%|56AC =<r   c                    U R                   R                  [        U5      5      nU(       d  UR                  U R                   [        U5      '   [	        U R
                  S5       nUR                  U< SUR                  < S35        UR                  5         U =R                  S-  sl        S S S 5        g X1R                  :w  a  U R                  SX#4-  5        g g ! , (       d  f       g = f)Nr   r.   r   r   z*table id %d already assigned to vrf dev %s)
rV   r   rl   r5   r   rB   r   r   r_   r   )rc   r   r   r   r   s        r   _iproute2_vrf_table_entry_add!vrf._iproute2_vrf_table_entry_addl  s    ,,00X?3>3C3CD!!#h-0d00$7:  $,k.>.>"@ A  "!#	 8
 +++NNG%45 6 , 87
 s   $A	C
C*c           	           SU l         U R                  [        U5      	 g ! [         a7  nU R                  R                  SU< S[        U5      < S35         S nAg S nAff = f)NTz%vrf: iproute2 vrf map del failed for r   r   )rW   rV   rl   rF   rC   rD   rH   )rc   r   rf   s      r   _iproute2_vrf_table_entry_del!vrf._iproute2_vrf_table_entry_delz  sT    	15D.%%c(m4 	KK'Q1 2	s     
A!-AA!c                 T    U[        U R                  R                  5       5      ;   a  gg)NTF)r~   rV   r   )rc   	ifacenames     r   _is_vrf_devvrf._is_vrf_dev  s&     T2299;<<r   c                 h    UR                   (       a   UR                   S:w  a  UR                   S:w  a  gg)Ndhcpdhcp6FT)addr_methodr   s     r   _is_dhcp_slavevrf._is_dhcp_slave  s-    $$!!V+!!W,r   c                 B   Sn[        UR                  5      S:  af  U(       a_  UR                   HN  nU" U5      nU(       d  M  U H4  n	U	R                  [        R                  -  (       d  M'  U	R
                  n  ML     MP     O UR                  (       a  UR                  S   nU(       d  U R                  R                  SU-  5        g[        R                  R                  SU-  5      (       a$  U R                  R                  U< SU< S35        gU R                  R                  U< SU< 35        U H  n
U
R                  S	5      nU(       d  M  US
:X  ac  U R                  5       nU(       d  U R                  SU
R
                  -  U5        U R                  R                  U
R
                  < SU< S35         U R                  XS5          O   U R#                  X25        U R%                  U5        U R&                  R)                  X5        g! [          a    e f = f)zIf we have a vrf slave that has dhcp configured, bring up the
vrf master now. This is needed because vrf has special handling
in dhclient hook which requires the vrf master to be present Nr   r   z%s: vrf master not foundr,   z: vrf master z exists returningz: bringing up vrf master r   r   z"%s: unable to get an auto table id#: table id auto: selected table id r   F)r   upperifacesrt   ru   rv   r5   rC   rO   r?   r@   rA   rD   rk   r   r   _up_vrf_devrF   _handle_existing_connectionsenable_ipv6_if_prev_brportnetlinklink_set_master)rc   r   vrfnamern   vrf_master_objsrx   
vrf_masterupper_ifaceupper_ifaceobjs	upper_objmobjro   s               r   _up_vrf_slave_without_master vrf._up_vrf_slave_without_master  s    
x##$q(-='33"2;"?"?%4	$..1B1BBB)2J! &5	  4 !!!--a0JKK :I EF77>>-z9::KK(*6 7$j2 	3#D11+>Iy& $ < < >I$'K(,		(23;=KK$$'+yy)&= >$$Te<  $ 	))(<''	2$$Y8 ! s   >HHc                 :    [         R                  " U5      =(       d    /  H<  nUR                  [        R                  -  (       d  M'  U R                  SU-  S5          g   g! [         a.  nU R                  R                  [        U5      5         SnAgSnAff = f)zX
If the intf was previously enslaved to a bridge it is possible ipv6 is still disabled.
z'/proc/sys/net/ipv6/conf/%s/disable_ipv6r(   N)
statemanagerget_ifaceobjsr   r   BRIDGE_PORT
write_filerF   rC   rD   rH   )rc   ifnamern   rf   s       r   r   vrf.enable_ipv6_if_prev_brport  s    	%(66v>D"D**-?-K-KKKOO$MPV$VX[\ E  	%KKSV$$	%s$   AA" A" A" "
B,$BBc                     S nU(       aD  U R                   (       a3  U R                  R                  U5      (       a  U R                   < SU< 3nU R                  R	                  UR
                  U5        g ! [         a     g f = f)Nr.   )vrf_exec_cmd_prefixr   link_existsr3   releaser5   rF   )rc   rn   r   dhclient_cmd_prefixs       r   _down_dhcp_slavevrf._down_dhcp_slave  sn    		"&D44

&&w//040H0H07'9#$$X]]4GH 		s   A3A6 6
BBc                 R   U(       a  [         R                  R                  (       a  g U R                  (       a,  U R                  U:X  a  U R	                  UR
                  U5        U R                  UR
                  5        U R                  U5      (       a  U R                  X5        g g r   )	r<   r=   r>   r9   _kill_ssh_connectionsr5   _close_socketsr   r  )rc   rn   r   s      r   r    vrf._handle_existing_connections  sv    =..77!!d&;&;w&F&&x}}h?HMM*x((!!(4 )r   c                     SnU(       d   U R                   R                  U5      (       af  U R                  R                  U5      nU(       a  X';  a=  U R	                  X25        U R                  U5        U R                  R                  X5        GOU(       Ga  U" U5      nU(       d0  U R                  R                  U5        U R                  SU-  5        g [        R                  R                  (       d  [        R                  R                  (       dz  [        R                  R                  (       ap  UR                  (       a_  US   R                  (       aK  [!        UR                  5      R#                  US   R                  5      (       a  U R%                  XUUU5        OSnOSnU(       aV  UR&                  [(        R*                  -  (       d3  U R-                  X45      (       d  U R                  R                  U5        g g g U R                  SU-  U5        g ! [.         a,  n	U R                  U< S[1        U	5      < 3U5         S n	A	g S n	A	ff = f)NTz vrf master ifaceobj %s not foundr   Fz&vrf %s not around, skipping vrf configrs   )r   r  sysfslink_get_uppersr   r   r   r   link_upr   r<   r=   ALLWITH_DEPENDSCLASSclassessetintersectionr   r   r   KEEP_LINK_DOWN!check_link_down_on_vlan_lower_devrF   rH   )
rc   r   r   rn   rx   
vrf_existsmaster_existsuppersr   rf   s
             r   _up_vrf_slavevrf._up_vrf_slave  s   )	D MTZZ33G<<33I>!655hH33I>LL00D"27";&
 LL((3NN#E$+$, -!''++!''44"((..%%/!*<*D*D))*778J8R8RSS55i6>6E6FH
 %*M %..1C1R1RR[_  \B  \B\ \ LL((3\R
 G!( *+35 	DNNiQ8(CC	Ds%   CH D,H H 
I'"IIc                 6   UR                   [        R                  -  (       aw  U" UR                  S   5       H^  nUR                  [
        R                  -  (       d  M'  U R                  R                  UR                  < SUR                  < S35          g   g)Nr   z": keeping vlan down (lower device z has link-down flag set)TF)
rt   ru   VLANlowerifacesr   r   r  rC   rD   r5   )rc   rn   rx   objs       r   r  %vrf.check_link_down_on_vlan_lower_dev  s     2 22'(<(<Q(?@%%(:(I(IIIKK$$iqivivx{  yA  yA  &B  C A r   c                 :   SnSnSnXCSX4-  nX`R                   ;   a/  U[        R                  SUSUU4-  n[        R                  " U5        XCSX4-  nX`R                   ;   a/  U[        R                  SUSUU4-  n[        R                  " U5        XCSX4-  nX`R                  ;   a/  U[        R                  SUSUU4-  n[        R                  " U5        XCSX4-  nX`R                  ;   a0  U[        R                  SUSUU4-  n[        R                  " U5        g g )N   %s: from all %s %s lookup %sz%%s %s rule del pref %s %s %s table %soif iif-6)rN   r   rJ   rI   rP   )rc   r   ro   prefip_rule_out_formatip_rule_cmdrulerule_cmds           r   _del_vrf_rulesvrf._del_vrf_rules  sG   ;=!%#LL%%%"U\\%'ul%1%3 3H x(!%#LL%%%"U\\%'ul%1%3 3H x(!%#LL&&&"U\\%)4%1%3 3H x(!%#LL&&&"U\\%)4%1%3 3H x(	 'r   c                 R    U H!  n[         R                  " SU5      (       d  M!    g   g)Nz,\d.*from\s+all\s+lookup\s+\W?l3mdev-table\W?TF)research)rc   rg   r,  s      r   rS   vrf._l3mdev_rule8  s.    D99L!# #	 
 r   c                 @   [         R                  " S[         R                  -  5      R                  5       nU Vs/ s H"  nSR	                  UR                  5       5      PM$     snU l        U R                  U R                  5      U l        [         R                  " S[         R                  -  5      R                  5       nU Vs/ s H"  nSR	                  UR                  5       5      PM$     snU l	        U R                  U R                  5      U l
        g s  snf s  snf )Nr-   r.   r/   )r   rI   rJ   rK   rL   rM   rN   rS   rR   rP   rT   )rc   rg   rh   s      r   _rule_cache_fillvrf._rule_cache_fill@  s    %%n',||'4 55?Z\ 	;CD8achhqwwy18D --d.@.@A%%&7',||'4 55?Z\ 	<DEHqsxx	2HE --d.A.AB E Fs   )D)Dc                    SnSnSnU R                   (       a  SU l         SnX`R                  ;   aO   [        R                  " S[        R                  -  5        [        R                  " S[        R                  -  5        X`R                  ;   aO   [        R                  " S	[        R                  -  5        [        R                  " S
[        R                  -  5        U R                  (       d  U R                  5         SU l
        XCSX4-  nU R                  (       d>  X`R                  ;  a/  U[        R                  SUSUU4-  n[        R                  " U5        XCSX4-  nU R                  (       d>  X`R                  ;  a/  U[        R                  SUSUU4-  n[        R                  " U5        XCSX4-  nU R                  (       d>  X`R                  ;  a/  U[        R                  SUSUU4-  n[        R                  " U5        XCSX4-  nU R                  (       d@  X`R                  ;  a0  U[        R                  SUSUU4-  n[        R                  " U5        g g g ! [
         a6  nU R                  R                  U< S[        U5      < 35         S nAGNS nAff = f! [
         a6  nU R                  R                  U< S[        U5      < 35         S nAGNS nAff = f)Nr#  r$  z%%s %s rule add pref %s %s %s table %sFz0: from all lookup localz%s rule del pref 0z"%s rule add pref 32765 table localrs   z%s -6 rule del pref 0z%%s -6 rule add pref 32765 table localTr%  r&  r'  r(  )r^   rN   r   rI   rJ   rF   rC   rD   rH   rP   rQ   r5  rR   rT   )	rc   r   ro   r)  r*  r+  r,  rf   r-  s	            r   _add_vrf_rulesvrf._add_vrf_rulesJ  s   ;=##',D$-D)))&&';(-(5 6&&'K(-(5 6
 ***&&'>(-(5 6&&'N(-(5 6 ""!!#"&D
 "%#LL  T1C1C%C"U\\%'ul%1%3 3H x(!%#LL  T1C1C%C"U\\%'ul%1%3 3H x(!%#LL  T1D1D%D"U\\%)4%1%3 3H x(!%#LL  T1D1D%D"U\\%)4%1%3 3H x(	 &E U ! KK$$s1v%FG ! KK$$s1v%FGs1   AI  AJ#  
J *+JJ #
K#-+KK#c                 \    U R                   R                  U5      nU(       a
  US   U;   a  ggNr   TF)r  link_get_lowers)rc   vrfobjconfig_vrfslavesvrfslavevrfslave_lowerss        r   _is_address_virtual_slavesvrf._is_address_virtual_slaves  s/     **44X>q!%55r   c           	         U R                   R                  UR                  5      nUR                  nU(       d  U(       d  g U(       d  / nU(       d  / n[	        U5      R                  [	        U5      5      n[	        U5      R                  [	        U5      5      nU(       ag  U Ha  n U R                  R                  U5      (       d  M&  S nU(       a  U" U5      nU R                  XqR                  U(       a  US   OS US5        Mc     U(       a\  U HV  n U R                  UXG5      (       a  M  S nU(       a  U" U5      nU R                  Xx(       a  US   OS UR                  5        MX     UR                  [         R"                  :X  a  U Hz  n U" U5      =(       d    /  HF  n
U
R$                  [&        R(                  -  (       d  U R+                  X5      (       d  M=  [        S5      e   U R,                  R/                  U5        M|     g g ! [         aA  n	U R                  R                  UR                  < S[        U	5      < 35         S n	A	GM  S n	A	ff = f! [         aA  n	U R                  R                  UR                  < S[        U	5      < 35         S n	A	GM  S n	A	ff = f! [         a7  n	U R                  R1                  U< S[        U	5      < 35         S n	A	GMX  S n	A	ff = f)Nr   Trs   z%link-down yes: keeping VRF slave down)r  r<  r5   r  r  
differencer   r  r  rF   rC   rD   rH   rA  _down_vrf_slaver   r   r   r   r   r  r  r   r  rG   )rc   rn   rx   running_slavesconfig_slaves
add_slaves
del_slavesssobjrf   slave_ifaceobjs              r   _add_vrf_slavesvrf._add_vrf_slaves  sh   33HMMB ,,^bm~'223~3FG
(33C4FG

H::11!44 D'/2&&q--26tAwD'7?   
H66x7DI I D'/2((tDG)18   !:!::"	*:1*=*C*C)88;M;\;\\`d  aG  aG*a a #,,S"TT	 +D
 LL((+ # ;# ! HKK$$s1v%FGGH ! HKK$$s1v%FGGH ! KK%%!SV&<=s[   & H
;H
I-9IA
J&(J&

I5II
J#"5JJ#&
K'0+K""K'c                     UR                   R                  U R                  S5      [        R                  -  UR                   U R                  '   g )Nr   )module_flags
setdefaultr5   r   r   r   s     r   _set_vrf_dev_processed_flagvrf._set_vrf_dev_processed_flag  s>    %22==diiK(4(>(>? 	dii(r   c                 ~    UR                   R                  U R                  S5      [        R                  -  (       a  ggr;  )rP  r   r5   r   r   r   s     r   _check_vrf_dev_processed_flag!vrf._check_vrf_dev_processed_flag  s-    !!%%dii3l6L6LLr   c           	         U R                   R                  UR                  5      (       Gd  U R                  U5        U R                  U R
                  :X  a  U R                  SU R                  -  U5        US:X  aW  U R                  5       nU(       d  U R                  SU5        U R                  R                  UR                  < SU< S35        OU R                  X5        UR                  [        U R                  R                  5       5      ;   a?  U R                  S[        [        U R                  R                  5       5      5      -  U5        UR                  5       (       d  U R                  SU5        O^[!        U5      U R"                  :  d  [!        U5      U R$                  :  a,  U R                  SUU R"                  U R$                  4-  U5         U R&                  R)                  UR                  U5        US:w  a  U R-                  X5        U$ US:X  aS  U R/                  UR                  5      nU(       d1  [0        R2                  R4                  (       d  U R                  S
U5        U R                   R7                  UR                  [8        R:                  5      nUb)  U[        U5      :w  a  U R                  SU< SU< 3U5        U$ ! [*         a)  nU R                  S	[        U5      -  U5         S nAGNS nAff = f)Nz'max vrf count %d hit...not creating vrfr   zunable to get an auto table idr   r   z'cannot use system reserved %s table idsz&vrf-table must be an integer or 'auto'z-vrf table id %s out of reserved range [%d,%d]zcreate failed (%s)
zunable to get vrf table idz,cannot change vrf table id,running table id z is different from config id )r   r  r5   rw   r_   r]   r   r   rC   rD   r   r~   r   keysrH   isdigitrl   rX   rZ   r   link_add_vrfrF   r   r   r<   r=   r   get_link_info_data_attributer   IFLA_VRF_TABLE)rc   rn   ro   rf   running_tables        r   _create_vrf_devvrf._create_vrf_dev  s   zz%%hmm4411(;~~!3!33  .04 ?@HJF" 88:	 NN#CXN  #+==)"= > 33HH==D)G)G)L)L)N$OONN#L$'T-K-K-P-P-R(S$T$V"*, $$&&I8T
 	NT%<%<<	NT%:%::NN#R%.%)%<%<%)%:%:%<$< >FGJ))(--C F"228G  F" 88G	 )<)<)C)CNN#?J !JJCCHMMSWSfSfgM(Y#m:L-L"/ <=EG #  J5A>IIJs   &K 
LLLc           	          Sn[         R                  R                  (       a  SnU R                  (       a:  [        R
                  " U R                  < SUR                  < SU< SU< 35        g g )Nr&  boot create r.   r<   r=   r>   r`   r   rI   r5   rc   rn   ro   modes       r   _up_vrf_helpervrf._up_vrf_helper
  N    ''D?? $ ( ) $	 & ' r   c                    U R                  U5      (       a  g U R                  X5      n U R                  UR                  U5        U R                  X5        U(       a  U R                  X5        U R                  U5        UR                  [        R                  -  (       d&  U R                  R                  UR                  5        g g ! [         a6  nU R                  UR                  < S[        U5      < 3U5         S nANS nAff = f! [         a6  nU R                  UR                  < S[        U5      < 3U5         S nAg S nAff = f)NTrs   )rU  r^  rF   r   r5   rH   r8  rf  rM  rR  r   r   r  r   r  )rc   rn   ro   rH  rx   rf   s         r   r   vrf._up_vrf_dev  s	    --h77	H,,XAI
	Hy94$$X@,,X6**-?-N-NN$$X]]3 O  	HNNhmmSV<hGG	H  	HNNhmmSV<hGG	Hs/   C
 BD 

D
,DD

E,EEc           
      	    U R                   R                  UU/S9 Vs/ s H  n[        UR                  5      PM     nnU(       d  g / n[        R
                  SS/n[        R                  " U5      R                  5        H  nUR                  5       nS n	SUS   ;   a  US   R                  S5      S   n	O SUS   ;   a  US   R                  S5      S   n	U	(       d  M_  X;   d  Mf  [        U5      S	:X  d  Mw  UR                  US
   R                  S5      S   R                  S5      S   5        M     U(       d  g S n
[        [        [        R                  " [        R                  < S[        R                   " 5       < 35      R#                  5       R                  S5      5      5      n[%        U5       HB  u  pSU;   d  M  SXS-      ;   d  M  U Vs/ s H  oR'                  5       (       d  M  UPM     n
n  O   U R(                  R+                  U< S[        U5      < 35        [,        R.                  R0                  (       a  g U H9  nX:w  d  M
   [        R2                  " [5        U5      [6        R8                  5        M;     X;   a   [        R<                  " 5       nWS:X  a4   [        RB                  " 5         U R(                  R+                  SU-  5         U R(                  R+                  U< S[        U5      < 35        [        R2                  " [5        U
5      [6        R8                  5        g g s  snf s  snf ! [:         a  n S nAGM	  S nAff = f! [:         a>  nU R(                  R+                  SUR>                  UR@                  4-  5         S nANS nAff = f! [:         a  nURD                  u  nnU R(                  R+                  SUU4-  5        U R(                  R+                  S[        R                   " 5       [        RF                  " S5      4-  5         S nAGNPS nAff = f! [:         a
  n S nAg S nAff = f! [H         a5  nU R(                  R+                  U< S[        U5      < 35         S nAg S nAff = f)N)r   ifaceobj_listz-tz-p%   r   z:ssh:      ,r   =z -Aps z---sshdz: killing active ssh sessions: zfork error : %s [%d]z)%s: ifreload continuing in the backgroundzos.setsid failed: errno=%d: %szpid=%d  pgid=%dz: killing our session: rs   )%r   get_managed_ip_addressesrH   ipr   ss_cmdexec_commandlrK   rM   r   r   r~   reversedrI   
pstree_cmdr?   getpidr   	enumeraterY  rC   rD   r<   r=   r   killrl   signalSIGINTOSErrorforkstrerrorerrnosetsidrd   getpgidrF   )rc   r   rn   rv  iplistproccmdllinecitemsaddrpidpstreeindexprocessxidrf   forkretxxx_todo_changemeerr_noerr_messages                        r   r	  vrf._kill_ssh_connections/  s   K	<+/::+N+N 'j ,O ,  ,Rc"%%j ,F 
 D LL$-D++D1<<>&)#!!9??3/2Dvay(!!9??3/2D>6{a'F1IOOC$8$;$A$A#$Fq$IJ ? C
 (5#5#58=8H8H"))+7W $XX]X]X_`e`efk`ln oF"+F"3 W$6!)3D)D&-=g1gC= #4 KK(#d)5 6 ""))9!B7  {U ggiG qL[		(()TV_)_`
KK$$'0#d)&= >GGCHfmm4# kL > # ! !  UKK$$%;qzz177>S%STTU # [0A0F0F-(()IVU`La)ab(():biik2::VW==Y)YZZ[   	<KK	3q6:;;	<s   Q
 L7	Q
 BQ
 'Q
 8AQ
 <BQ
 	Q
 Q
 L<0L<6AQ
 Q
 .M	Q
 M !Q
 (3N% AP3 7
Q
 
MQ
 MQ
 
N"$4NQ
 N""Q
 %
P0/A6P+%Q
 +P00Q
 3
Q=Q
 QQ
 

R	+RR	c                 6    UR                  S5      nU(       a$  U R                  5         U R                  XSU5        g UR                  S5      nU(       a  U R                  R	                  UR
                  5      (       d)  U R                  R                  SUR
                  -  5        g U R                  5         U R                  UR
                  XAU5        g [        R                  R                  (       dr  U R                  R                  UR
                  5      nU(       aE  U R                  5         U R                  U5      (       a  U R                  UR
                  UU5        g g g g ! [         a%  nU R!                  [#        U5      U5         S nAg S nAff = f)Nr   Tr   z6%s: device not found - please check your configuration)rk   r   r   r   r  r5   rC   rO   r  r<   r=   r>   
get_masterr   rE  rF   r   rH   )rc   rn   rx   ro   r   masterrf   s          r   _upvrf._up}  sB   	- 55kBI113  d<LM33E:::11(--@@++,dgogtgt,tu557&&x}}c'79&,,55!ZZ228==AF99;++F33 00179 4  6  	-NN3q68,,	-s*   ;E) A*E) )-E) BE) )
F3FFc           	          Sn[         R                  R                  (       a  SnU R                  (       a:  [        R
                  " U R                  < SUR                  < SU< SU< 35        g g )Nr&  ra  z delete r.   rc  rd  s       r   _down_vrf_helpervrf._down_vrf_helper  rh  r   c                    U R                   (       d  g  U R                  R                  U5      nU(       d  g  [        R                  " [        R                  < SU< S35        g ! [         a3  nU R                  R                  S[        U5      -  5        Sn S nANnS nAff = f! [         a6  nU R                  R                  U< S[        U5      < S35         S nAg S nAff = f)Nz %s: vrf: close sockets error: %sr   z -aK "dev == "z!: closing socks using ss failed (z)
)ra   r   get_ifindexrF   rC   rG   rH   r   rI   rw  rD   )rc   r   ifindexrf   s       r   r
  vrf._close_sockets  s    ++	jj,,Y7G
 	!&w 8 9  	KK@3q6IJG	  	KK093q6C D	s.   A% ,B% %
B"/)BB"%
C%/,C  C%c           	      p   U R                   R                  UR                  5      (       d  g US:X  a  U R                  UR                  5      nU R                  R                  UR                  5      nU(       ax  U Hr  nU(       a1  U" U5      n U R                  U(       a  US   OS UR                  5         U R                  R                  U5        U R                  R                  U5        Mt      U R                  X5         U R!                  UR                  U5        U R#                  UR                  5         U R                  R%                  UR                  5         U R'                  U5        g ! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAGNS nAff = f! [         a7  nU R                  R                  U< S[        U5      < 35         S nAGM  S nAff = f! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAGNGS nAff = f! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAGNwS nAff = f! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAGNS nAff = f! [         a?  nU R                  R                  UR                  < S[        U5      < 35         S nAg S nAff = f)Nr   r   rs   )r   r  r5   r   r  r<  r   rF   rC   rD   rH   r   
addr_flush	link_downr  rO   r.  r
  link_delr   )rc   rn   ro   rx   rF  rJ  rK  rf   s           r   _down_vrf_devvrf._down_vrf_dev  s\   zz%%hmm4444X]]CI33HMMB##+A.D99=A ;?q'GK:B--ILL++A.LL**1- $"	!!(6
	y9
 	HMM*	LL!!(--0
	..y9? % ((HMM3q6)JK ! KK$$3q6%:;  	KK8==#a& AB	  	KKs1v>?	  	KKs1v>?	  	KKs1v>?	s   (E476G2H I <%J "K, 4
F>>5F99F>
H+G==H
I5I

I
J5JJ
K))5K$$K),
L565L00L5c                      U R                  X#5        U R                  R                  U5        g ! [         a5  nU R                  R                  U< S[        U5      < 35         S nAg S nAff = f)Nrs   )r   r   link_set_nomasterrF   rC   rO   rH   )rc   r   rn   r   rf   s        r   rE  vrf._down_vrf_slave  sU    	?--h@LL**95 	?KK9c!f =>>	?s   ,/ 
A.+A))A.c                 j    UR                  S5      nU(       a#  U R                  5         U R                  XU5        g UR                  S5      nU(       a.  U R                  5         U R                  UR                  US 5        g g ! [
         a$  nU R                  [        U5      5         S nAg S nAff = f)Nr   r   )rk   r   r  rE  r5   rF   log_warnrH   )rc   rn   rx   ro   r   rf   s         r   _down	vrf._down  s    	" 55kBI113""88HI33E:557(($G   	"MM#a&!!	"s   :B AB 
B2B--B2c                 ,    U R                   R                  UR                  5      nU(       a  XC:w  a  UR                  S[	        U5      S5        g UR                  SUS5        g ! [
         a%  nU R                  [	        U5      U5         S nAg S nAff = f)Nr   r   r   )r   r  r5   update_config_with_statusrH   rF   r   )rc   rn   ifaceobjcurrr   r  rf   s         r   _query_check_vrf_slavevrf._query_check_vrf_slave  ss    	1ZZ**8==9FV]66uc&k1M66ufaH 	1NN3q6<00	1s   AA$ A$ $
B.BBc           	          U R                   R                  UR                  5      (       d)  U R                  R	                  SUR                  -  5        g US:X  a.  [        U R                  UR                  5      =(       d    S5      nOUn[        U R                   R                  UR                  [        R                  5      5      nUR                  SXTU:g  5        [        R                  R                  (       d  g U R                  (       ai   [        R                   " U R                  < SUR                  < SU< 35        UR                  SU R                  < SUR                  < SU< 3S5        g g ! ["         a<  nUR                  SU R                  < SUR                  < SU< 3S	5         S nAg S nAff = f! ["         a$  nU R%                  [        U5      5         S nAg S nAff = f)
Nz%s: vrf: does not existr   r   r   z verify r.   r1   rb  r   )r   r  r5   rC   rD   rH   r   r[  r   r\  r  r<   r=   WITHDEFAULTSr`   r   rI   rF   r  )rc   rn   r  ro   config_tablerunning_vrf_tablerf   s          r   _query_check_vrf_devvrf._query_check_vrf_dev  s   !	"::))(--88  !:X]]!KLF""4#?#?#N#SRST( #DJJ$K$KHMM[_[n[n$o p22;@QctStu &&33&&(,&.mm\(C D !::<=A__;C==;G<I KL	M  !  ::<=A__;C==;G<I KL	M
   	"MM#a&!!	"sJ   AG B'G =G A'E8 8
F>2F94G 9F>>G 
G/G**G/c                 P    UR                  S5      nU(       a"  U R                  SS9  U R                  XU5        g UR                  S5      nU(       a"  U R                  SS9  U R                  XU5        g g ! [         a$  nU R                  [        U5      5         S nAg S nAff = f)Nr   F)r   r   )rk   r   r  r  rF   r  rH   )rc   rn   r  ro   r   rf   s         r   _query_checkvrf._query_check3  s    	" 55kBI11e1D))()L33E:55%5H//L   	"MM#a&!!	"s   9A7 9A7 7
B%B  B%c                 :    U R                   R                  UR                  5      nUS:X  aS  U R                   R                  UR                  [        R
                  5      nUb  UR                  S[        U5      5        g U R                   R                  UR                  5      nUS:X  a@  U R                   R                  UR                  5      nU(       a  UR                  SU5        g g g ! [         a$  nU R                  [        U5      5         S nAg S nAff = f)Nr   r   	vrf_slave)r   get_link_kindr5   r[  r   r\  update_configrH   get_link_slave_kindr  rF   r  )rc   ifaceobjrunningrx   kindr]  
slave_kindr   rf   s           r   _query_runningvrf._query_runningA  s    	"::++O,@,@ADu} $

 G GH\H\^b^q^q r ,#11+s=?QR778L8LMJ[(jj++O,@,@A#11%=  )  	"MM#a&!!	"s   A=C,  A)C, ,
D6DDc                     U R                   (       d  g UR                  [        R                  -  (       a.  UR	                  SU R                   < SUR
                  < 35        g g )Nr1   r.   )r`   rt   ru   rv   r  r5   )rc   rn   kwargss      r   _query
vrf._queryS  sG    !2!22""<4??#+==22 3 3r   )zpre-upz	post-downzquery-runningquery-checkcurrqueryc                 H    [        U R                  R                  5       5      $ )z-returns list of ops supported by this module )r~   _run_opsrX  rc   s    r   get_opsvrf.get_opsb  s    DMM&&())r   c                 F    U R                   (       d  [        5       U l         g g r   )r3   r   r  s    r   _init_command_handlersvrf._init_command_handlersf  s    'zD  r   c                     U R                   R                  U5      nU(       d  gU R                  5         US:X  a
  U" XU5        OU" XUS9  U R                  (       a  U R	                  5         SU l        gg)ay  run bond configuration on the interface object passed as argument

Args:
    **ifaceobj** (object): iface object

    **operation** (str): any of 'pre-up', 'post-down', 'query-checkcurr',
        'query-running'

Kwargs:
    **query_ifaceobj** (object): query check ifaceobject. This is only
        valid when op is 'query-checkcurr'. It is an object same as
        ifaceobj, but contains running attribute values and its config
        status. The modules can use it to return queried running state
        of interfaces. status is success if the running state is same
        as user required state in ifaceobj. error otherwise.
Nr  )rx   F)r  r   r  r:   r   )rc   rn   	operationquery_ifaceobjrx   
extra_args
op_handlers          r   runvrf.runj  sg    $ ]]&&y1
##%))t~6t8HI<<//1 DL r   )rU   r:   r3   rP   rN   rV   rW   rR   rT   rQ   r   r5   r;   ra   r_   r^   r`   r]   r9   rZ   rX   rb   )T)FFr   )NNF)TN)NN)?r   r   r   r   __doc__r\   rB   r   rY   r[   r   r2   rp   r{   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r.  rS   r5  r8  rA  rM  rR  rU  r^  rf  r   r	  r  r  r
  r  rE  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   r   1   s   5 ,P$j1,.>?	 7&Z&<
H" O< OM 	!U.n	84t3"# 
 0
C6+Z
%
5 :>8=+DZ)BC;)z"1f?

3j	' ;?%)H4L<\-:	'*3l?"1""H""$3 ''H** 7;!!r   r   )'r1  r?   fcntlatexitr~  ifupdown2.lib.addonr    ifupdown2.ifupdown.policymanagerifupdownr6    ifupdown2.ifupdown.ifupdownflagsr<   ifupdown2.ifupdown.statemanagerr   r   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.nlmanager.nlmanagerr   !ifupdown2.ifupdownaddons.dhclientr   "ifupdown2.ifupdownaddons.utilsbase#ifupdown2.ifupdownaddons.modulebaser	   ImportErrorModuleNotFoundError	lib.addonifupdown.policymanagerifupdown.ifupdownflagsifupdown.statemanagerifupdown.ifaceifupdown.utilsnlmanager.nlmanagerifupdownaddons.dhclientifupdownaddons.utilsbaseifupdownaddons.modulebaser   r   r   r   r   <module>r     s    
 	   5)<<<<P*.2:4>$ U!% U!+ 	() 522F $(0*45s   A A- -AB21B2