
    /I_;                     d   S SK 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Js  Jr  S SKJs  Jr  S SKJs  Jr  S SKJs  Jr  S SKJs  Jr   " S S	\\5      r%g! \\4 aD    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 Jr  S SK!Jr  S SK"Jr  S SK#Jr  S SK$Jr   NXf = f)
    N)Addon)Link)*)utils)dhclient)
moduleBasec                      \ rS rSrSrS0 S SSS/SSS	/S
._SSS/SS._SSS/S/S._SS/ SQS/S._SSSS/SS/S._SS SS/S!/S._S"S#SS$/SS%/S
._S&S'S(S)/S*/S+S,._S-S.S//S0/S._S1S2S3/S4._S5S6S7S8/S7S9/S:._S;S<S/S=/S._S>S?/ S@QSASB/S:._SCSD/ S@QSASE/S:._SFSGS7S8/S8SH/S:._SISJSKSA/SKSLSM/S:._SNSO/ S@QSASP/S:._SQ.rS+rSR rSS rST r	SU r
SSW jrSSX jrSY rSZ rSS[ jrS\ rS] rS^ rS_ rS` rSa rSb r\Sc 5       rSSd jrSe r\Sf 5       rSg r/ / 4Sh jrSi rSSj jrSk r Sl r!Sm r"Sn r#So r$Sp r%Sq r&Sr r'SSs jr(SSt jr)Su r*SSv jr+Sw r,Sx r-Sy r.Sz r/SS{ jr0S| r1S} r2SS~ jr3\(\)\+\0\3S.r4S r5SS jr6Sr7gV)address+   zaifupdown2 addon module to configure address, mtu, hwaddress, alias
(description) on an interface z+address configuration module for interfacesa  The address of the interface. The format of the address depends on the protocol. It is a dotted quad for IP and a sequence of hexadecimal halfwords separated by colons for IPv6. The ADDRESS may be followed by a slash and a decimal number which encodes the network prefix length.z<ipv4/prefixlen>z<ipv6/prefixlen>Tzaddress 10.0.12.3/24z$address 2000:1000:1000:1000:3::5/128)help	validvals	multilineexamplenetmaskzAddress netmaskznetmask 255.255.255.0)r   r   compat	broadcastz'The broadcast address on the interface.z<ipv4>zbroadcast 10.0.1.255)r   r   r   scopea  The scope of the area where this address is valid. The available scopes are listed in file /etc/iproute2/rt_scopes. Predefined scope values are: global - the address is globally valid. site - (IPv6 only, deprecated) the address is site local, i.e. it is valid inside this site. link - the address is link local, i.e. it is valid only on this device. host - the address is valid only inside this host.)universesitelinkhostnowherez
scope hostpreferred-lifetimezThe preferred lifetime of this address; see section 5.5.4 of RFC 4862. When it expires, the address is no longer used for new outgoing connections. Defaults to forever.065535zpreferred-lifetime foreverzpreferred-lifetime 10)r   
validranger   pointopointz3Set the remote IP address for a point-to-point linkzpointopoint 10.10.10.42/32gatewayzDefault gatewayz<ipv6>zgateway 255.255.255.0mtuz)Interface MTU (maximum transmission unit)5529216zmtu 16001500)r   r   r   default	hwaddresszHardware address (mac)z<mac>zhwaddress 44:38:39:00:27:b8aliaszFdescription/alias: give the device a symbolic name for easy reference.zalias testnetwork)r   r   address-purgezPurge existing addresses. By default any existing ip addresses on an interface are purged to match persistant addresses in the interfaces file. Set this attribute to 'no' if you want to preserve existing addressesyesnozaddress-purge yes/no)r   r   r#   r   clagd-vxlan-anycast-ipz2Anycast local IP address for dual connected VxLANsz clagd-vxlan-anycast-ip 36.0.0.11
ip-forwardzip forwarding flag)onoffr'   r(   r   1r,   zip-forward offip6-forwardzipv6 forwarding flagzip6-forward offmpls-enablezmpls enable flagzmpls-enable yesipv6-addrgenz$enable disable ipv6 link addrgenmoder+   zipv6-addrgen onzipv6-addrgen off
arp-acceptz(Allow gratuitous arp to update arp tablezarp-accept on)mhelpattrsc                    [         R                  " U 5        [        R                  " U /UQ70 UD6  0 U l        [        R
                  R                  U R                  R                  SS9U l	        [        R
                  R                  U R                  R                  SS9U l
        [        R
                  R                  U R                  R                  S9U l        [        R                  " [        R
                  R                  U R                  R                  S5      5      U l        U R#                  5       U l        U R'                  5       U l        U R(                  (       d"  U R$                  U l        U R*                  U l        U R/                  5       U l        [2        R4                  " S5      [2        R4                  " S5      4U l        [        R                  " [        R
                  R                  U R                  R                  SS9S	S
9U l        [        R                  " [        R
                  R                  U R                  R                  SS9SS
9U l        g )Nr*   module_nameattrr.   )r6   !enable_l3_iface_forwarding_checksz127.0.0.1/8z::1/128l3_intf_arp_acceptFr#   "l3_intf_default_gateway_set_onlinkT)r   __init__r   _bridge_fdb_query_cachepolicymanagerpolicymanager_apiget_attr_default	__class____name__	ipforward
ip6forwardget_iface_defaultsifaces_defaultsr   get_boolean_from_stringget_module_globalsr8    _address__policy_get_default_mtudefault_mtu"_address__policy_get_mgmt_intf_mtudefault_mgmt_intf_mtudefault_mtu_intdefault_mgmt_intf_mtu_int_address__policy_get_max_mtumax_mtu	ipnetwork	IPNetworkdefault_loopback_addressesr9   r;   )selfargskargss      &/usr/share/ifupdown2/addons/address.pyr<   address.__init__   s   tD14151')$&88IIVZVdVdVmVm  uAI  B'99JJW[WeWeWnWn  vCJ  D,>>QQ^b^l^l^u^uQv161N1N++>>''32
.  88:%)%D%D%F")))-)9)9D&-1-A-AD*335+4+>+>}+MyObObclOm*n'"'"?"?++>> NN33) ?  #
 382O2O++>> NN339 ?  3
/    c           	         [         R                  R                  U R                  R                  SS9nU(       d  U R
                  n [        U5      U l        U R                  R                  SU-  5        U$ ! [         a\  nU R                  R                  SU< S[        U5      < 35        U R
                  n[        U R
                  5      U l         S nANS nAff = f)Nr   r5   zaddress: invalid default mtu "" set via policy: zaddress: using default mtu %s)r>   r?   r@   rA   rB   DEFAULT_MTU_STRINGintrM   
ValueErrorloggererrorstrinfo)rT   rJ   es      rW   __policy_get_default_mtu address.__policy_get_default_mtu   s    #55FF// G 

 11K	@#&{#3D  	8;FG  	@KKZegjklgmno11K#&t'>'>#?D  	@s   A7 7
CACCc                    [         R                  R                  U R                  R                  SS9nU(       a6   [        U5      nU R                  R                  SU R                  -  5        U$ U R                  R                  S5        g! [         a1  nU R                  R                  S[        U5      -  5         S nAgS nAff = f)NrP   r5   zaddress: using max mtu %szaddress: policy max_mtu: %szaddress: max_mtu undefinedr   )r>   r?   rH   rA   rB   r]   r_   rb   rP   r^   warningra   )rT   rP   max_mtu_intrc   s       rW   __policy_get_max_mtuaddress.__policy_get_max_mtu   s    11DDQUQ_Q_QhQhoxDyL!'l  !<t||!KL"" KK9:	  L##$ACF$JKK 	Ls   4B 
C'CCc           	         [         R                  R                  U R                  R                  SS9nS U l        U(       d  g  [        U5      U l        U R                  R                  SU-  5        U$ ! [         a\  nU R                  R                  SU< S[        U5      < 35        U R                  n[        U R                  5      U l         S nANS nAff = f)Nmgmt_intf_mtur5   z#address: invalid default mgmt mtu "r[   z,address: using default mgmt interface mtu %s)r>   r?   rH   rA   rB   default_mgmt_mtu_intr]   r^   r_   r`   ra   r\   rb   )rT   default_mgmt_mturc   s      rW   __policy_get_mgmt_intf_mtu"address.__policy_get_mgmt_intf_mtu   s    (::MM,0NN,C,C%4 N 6 %)!	E(+,<(=D% 	GJZZ[  	EKK_oqtuvqwxy#66(+D,C,C(DD%%	Es   A3 3
C=ACCNc                     U R                  U5      =(       aY    U R                  US5      =(       a@    U R                  X5      =(       a(    U R                  U5      =(       a    U R	                  XSS9$ )NTsyntax_check)syntax_check_multiple_gatewaysyntax_check_addr_allowed_onsyntax_check_mtusyntax_check_sysctls(syntax_check_enable_l3_iface_forwardings)rT   ifaceobjifaceobj_getfuncs      rW   rs   address.syntax_check  sr    228< q55hEq))(Eq --h7q AA(koAp		rrY   c                    U R                   (       Ga9  UR                  [        R                  -  (       d"  UR                  [        R                  -  (       a  UR
                  [        R                  -  (       d  UR                  nS nS nU" U5      =(       d    U/ H  nU(       d  UR                  S5      nU(       d5  UR                  S5      nU(       a  [        R                  " U5      (       d  SnU(       d  M`  U(       d  Mi  U(       a  [        SSR                  U5      -  5      e[        U< SSR                  U5      < S35      e   g)Nr
   r*   TzDconfiguring ip-forward off and ip address(es) (%s) is not compatiblez, z1: configuring ip-forward off and ip address(es) (z) is not compatible)r8   	link_kindifaceLinkKindVLANBRIDGElink_privflagsifaceLinkPrivFlagsBRIDGE_PORTnameget_attr_valueget_attr_value_firstr   rG   	Exceptionjoin)	rT   ry   rz   rs   ifname	vlan_addrvlan_ipforward_offobjip_forward_values	            rW   rx   0address.syntax_check_enable_l3_iface_forwardings  s   222''-*<*<< **]-A-AA //2D2P2PP]]FI!%'/=H:=  # 2 29 =I)'*'?'?'M$'0M0MN^0_0_-1*9!3!3#'b#yy35 
 (%tyy';= # >, rY   c                 @   SnUR                   [        R                  -  nUR                  S5      nU(       a'  U(       a   SnU R	                  SUR
                  -  5        UR                  S5      nU(       a'  U(       a   SnU R	                  SUR
                  -  5        U$ )NTr*   F1%s: 'ip-forward' is not supported for bridge portr.   2%s: 'ip6-forward' is not supported for bridge port)r   r   r   r   	log_errorr   )rT   ry   resultbridge_portrC   rD   s         rW   rw   address.syntax_check_sysctls6  s    ..1C1O1OO11,?	9FNN )*2--8 922=A
:FNN )*2--8 9rY   c           
         UR                  S5      nU(       a   [        U5      nU R                  XXBSS9$ g! [         aC  nU R                  R	                  UR
                  < SU< S[        U5      < 35         S nAgS nAff = f)Nr   z: invalid mtu : FT)syntaxcheck)r   r]   r^   r_   rg   r   ra   _check_mtu_config)rT   ry   rz   mtu_strmtu_intrc   s         rW   rv   address.syntax_check_mtuE  sz    //6g, ))(Wdh)ii	  ##wX[\]X^$_`s   7 
B9A??Bc                 X    UR                  S5      (       a  [        R                  " XS9$ g)Nr
   rr   T)r   r   is_addr_ip_allowed_on)rT   ry   rs   s      rW   ru   $address.syntax_check_addr_allowed_onP  s'    ""9--..xSSrY   c                     [         R                  " U5      R                  U:X  a  U(       a  [        U< SU< S35      egg)Nz: multiple gateways for z familyTF)rQ   rR   versionr   )rT   familyfoundaddrr   s        rW   _syntax_check_multiple_gateway&address._syntax_check_multiple_gatewayU  s;    t$,,7#'!1 2 2rY   c           	      d   SnSnSnUR                  S5      nU(       a  UO/  H:  n U R                  SX6S5      (       a  SnU R                  SXFS5      (       a  SnM:  M<     U$ ! [         aB  nU R                  R	                  UR
                  < S[        U5      < 35        Sn S nAM  S nAff = f)	NTFr   inet   inet6   z: address: )r   r   r   r_   rg   r   ra   )rT   ry   r   r   r   gatewaysr   rc   s           rW   rt   %address.syntax_check_multiple_gateway]  s    **95 (Hb0D66vt1MMD66wQOO E P	 1   ##A$OPs   4A##
B/-7B**B/c                 x    U(       d  g[        U Vs/ s H  nUS S S:w  a  SOSPM     sn5      (       a  ggs  snf )NF   z0.0.0.0T)any)rT   addrsas      rW   _address_validaddress._address_validm  sP    $)+$)q "1*$)+ , ,+s   7c                 L    [         R                  " UR                  S5      5      $ )Nr$   )r   strip_hwaddressr   )rT   ry   s     rW   _get_hwaddressaddress._get_hwaddressu  s    $$X%B%B;%OPPrY   c                 P   U R                  U5      nUR                  S5      nUR                  S5      n[        R                  " U5      nSnU R                  R                  UR                  5      S:H  nU(       d]  UR                  [        R                  -  (       a;  UR                  S   nU R                  U5      n	U R                  R                  U5      nU(       a*  U R                  R                  UR                  5      (       a  U(       a  U R                  U5      (       a}  U R                  (       aM  U(       a#  U R                  SUR                  -  S-   S5        OBU R                  SUR                  -  S-   S	5        OU R                  S
UR                  -  U5        U(       a  U(       a  U(       a   [         R"                  R%                  UR                  5      =(       d    /  Hj  n
U
R                  S5      nU(       d  M  [        R&                  " U5      [        R&                  " U5      :w  d  MM  U R(                  R+                  WUW	5          O    U R(                  R/                  WUW	5        g U R(                  R+                  WUW	5        g g g ! [,         a     NJf = f)Nr
   r1   Fbridger   z/proc/sys/net/ipv4/conf/%sz/arp_acceptr-   r   z%/proc/sys/net/ipv4/conf/%s/arp_acceptr$   )r   r   r   boolean_support_binarycacheget_link_kindr   r}   r~   r   lowerifaces_get_vlan_idbridge_is_vlan_awarer   r9   
write_filestatemanagerstatemanager_apiget_ifaceobjsmac_str_to_intiproute2bridge_fdb_delr   bridge_fdb_add)rT   ry   upr$   r   
arp_accept is_vlan_dev_on_vlan_aware_bridge	is_bridge
bridgenamevlanold_objold_hwaddresss               rW   _process_bridgeaddress._process_bridgex  s   ''1	--i822<@
11*=
+0(JJ,,X]];xG	!!M$6$66%11!4
((237::3R3RS]3^0tzz>>x}}MM;""5))**(Dx}}(T(5)67:< (Dx}}(T(5)67:< OO$Khmm$[]gh9#/#@#@#N#Nx}}#]#cac#c(/(D(D[(Q(=U-A-A--PTYThThirTs-s MM88]TXY!	 $d ,,ZDI,,ZDI :9 ! s%   9AJ ,J 8J J 
J%$J%c                 z   / n U GH  nUR                  S5      nU(       d  M  U R                  USS9(       d    g[        U5       H  u  pg0 nS n	SU;   a  [        R                  " U5      n	OFUR                  SU5      n
U
(       a  [        R                  " Xz5      n	O[        R                  " U5      n	S H!  nUR                  X5      nU(       d  M  XU'   M#     UR                  SU5      n U(       a  [        R                  " U5      US'   UR                  X45        M     GM     SU4$ ! [         aC  nU R                  R                  UR                  < S	U< S
[        U5      < 35         S nANgS nAff = f! [         a5  nU R                  R                  U< S[        U5      < 35         S nAgS nAff = f)Nr
   Frr   )FN/r   )r   r   r   r   z: pointopoint r   z3: convert string ip address into IPNetwork object: T)r   ru   	enumeraterQ   rR   get_attr_value_nr   r_   rg   r   ra   append)rT   ifaceobj_listr   user_config_ip_addrs_listry   
user_addrsindexr   addr_attributesaddr_objr   	attr_name
attr_valuer   rc   s                  rW   __get_ip_addr_with_attributes%address.__get_ip_addr_with_attributes  s   $&!)	)%44Y?
!88PU8V&#,Z#8KE&(O#H d{#,#6#6t#<"*";";Iu"M"'0':':4'IH'0':':4'@H%Q	%-%>%>y%P
%:9CI6 &R
 #+";";M5"QKm&=F=P=PQ\=]OM: .44h5PQ7 $9 *T ... % m++Wbdghidj,kllm  	KK]cehijek lm	sM   6E; BE; E; , D+E; +
E859E3.E; 3E88E; ;
F:+F55F:c                 z    U H  u  pEU(       a[  U R                   R                  X$UR                  S5      UR                  S5      UR                  S5      UR                  S5      S9  Mg  U R                   R                  X$5        M     g ! [         a%  nU R	                  [        U5      U5         S nAg S nAff = f)Nr   r   r   r   )r   peerr   preferred_lifetime)netlinkaddr_addgetr   r   ra   )rT   ry   r   user_config_ip_addrsip
attributesrc   s          rW   "__add_ip_addresses_with_attributes*address.__add_ip_addresses_with_attributes  s    	-"6LL))(nnW5'^^M:",.."=+5>>:N+O *  LL))&5 #7  	-NN3q68,,	-s   BB 
B:B55B:c                 |    SnU  H3  nUR                  S5      nU(       d  M  [        R                  " U5      nM5     U$ )z
if anycast address is configured on 'lo' and is in running
config add it to newaddrs so that ifreload doesn't wipe it out
:param ifaceobjlist:
:param running_ip_addrs:
Nr)   )r   rQ   rR   )ifaceobjlistanycast_ip_addrry   anycast_addrs       rW   1__add_loopback_anycast_ip_to_running_ip_addr_list9address.__add_loopback_anycast_ip_to_running_ip_addr_list  sA     $H#889QRL|"+"5"5l"C %
 rY   c                    [         R                  R                  SS5      S:H  nU(       a  UR                  UR                  -  (       d  g UR
                  n[        R                  " UR                  S5      SS9nU(       dd  UR                  [        R                  -  (       aB  UR                  [        R                  -  (       a  U R                  R                  SU-  5        SnU(       a+  UR                  [        R                  -  (       a	  U" U5      nOU/nU R                  Xu5      u  pU(       d  g [        R                  R                  (       Gd4  U(       Ga,  S n
U R                   R#                  XW5      nUR$                  [&        R(                  -  (       a  U R+                  U5      n
U R-                  U	5      u  pnX:X  d  U R/                  XU5      (       a  U(       a  U R1                  XU	5        g  U(       aC  U(       a<  US	   US	   :w  a0  U R                  R3                  U< S
US	   < SUS	   < S35        / nOUnU
(       a  UR5                  U
5        U H'  nUU;   a  M  U R6                  R9                  UU5        M)     U	(       d  g U R1                  XU	5        g ! [:         a$  nU R=                  [?        U5      5         S nANDS nAff = f)Naddr_config_squashr   r-   r&   Tr:   zI%s: interface has multiple iface stanzas, skip purging existing addressesFr   z: primary ip changed (from z to z3) we need to purge all ip addresses and re-add them) ifupdownconfigconfigr   flagsYOUNGEST_SIBLINGr   r   rG   r   ifaceHAS_SIBLINGSr_   rg   %_address__get_ip_addr_with_attributesifupdownflagsPERFMODEr   get_managed_ip_addressesr   r   LOOPBACK9_address__add_loopback_anycast_ip_to_running_ip_addr_listorder_user_configured_addrs#compare_running_ips_and_user_config*_address__add_ip_addresses_with_attributesrb   r   r   addr_delr   log_warnra   )rT   ry   rz   force_reapplysquash_addr_configr   purge_addressesr   addr_supportedr   
anycast_iprunning_ip_addrsuser_ip4user_ip6ordered_user_configured_ips
skip_addrsr   rc   s                     rW   process_addressesaddress.process_addresses  s_   +22667KSQUXXhnnx7P7P&P778U8UVe8fptu!hnnu7I7I&I ~~ 6 66##$orx$xy#O(..53E3E"E,V4M%JM484V4VWd4m1""+++ J#zzBB6Y&&);)D)DD!SSTab
>B>^>^_x>y;H ;*>$BjBjks  @P  CQ  CQ ;;HNgh&.3CHcdeHfjz{|j}H}KK$$(.0KA0NP`abPc&e f!#J!<J%%j1,Dz) LL))&$7 - )//B[\	  &c!f%%&s   8BJ$ $
K.KKc                 `   U(       d  U(       a  U(       d  gU(       a  U(       d  U(       d  gU(       d  U(       d  U(       d  g[        U5      n[        U5      nXE:  a  gSnXd:  a  X   X6   :w  a  gUS-  nXd:  a  M  US:  a  X4S nOUnSn[        U5      nU H  n	X;  a    gUS-  nM     Xh:H  $ )aa  
We need to compare the user config ips and the running ips.
ip4 ordering matters (primary etc) but ip6 order doesn't matter

this function replaces the strict comparison previously in place
    if newaddrs == running_addrs ?

We will compare if the ip4 ordering is correct, then check if all
ip6 are present in the list (without checking the ordering)
FTr      N)len)
rT   r  r  running_addrslen_ip4len_running_addrsirunning_ip6len_ip6ip6s
             rW   r  +address.compare_running_ips_and_user_config0  s     -8Hxh-.&k{m..FA k
 Q;'1K'Kh-C"FA 
 |rY   c                     / n/ nU  H9  u  p4UR                   S:X  a  UR                  U5        M(  UR                  U5        M;     XX-   4$ )Nr   )r   r   )user_config_addrsip4r  r   _s        rW   r  #address.order_user_configured_addrs]  sH    %DAyyA~

1

1	 & ""rY   c           	          U H+  n U R                   R                  UR                  XSU5        M-     g ! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAMu  S nAff = f)Nr   )r   route_del_gatewayr   r   r_   debugra   )rT   ry   r   vrfmetricdel_gwrc   s          rW   _delete_gatewayaddress._delete_gatewayj  sb    FF//vFS   F!!hmmSV"DEEFs   '3
A=5A88A=c           	         UR                  S5      nUR                  S5      nU R                  U[        [        U5      [        U5      -
  5      XE5        U H3  n U R                  R                  UR                  XdXPR                  S9  M5     g ! [         a6  nU R                  UR                  < S[        U5      < 35         S nAMs  S nAff = f)Nr%  r&  )onlinkr   )r   r(  listsetr   route_add_gatewayr   r;   r   r   ra   )rT   ry   r   prev_gwr%  r&  add_gwrc   s           rW   _add_delete_gatewayaddress._add_delete_gatewayq  s    ++E2..x8XtCL3x=,H'I 	*FC//vF  \C  \C/  D   C8==#a&ABBCs   /B
C+C		Cc                     / n[         R                  R                  UR                  5      nU(       d  U$ US   R	                  S5      nU(       d  U$ U$ )Nr   r   )r   r   r   r   r   )rT   ry   r   ipvsaved_ifaceobjsprev_gatewayss         rW   _get_prev_gatewayaddress._get_prev_gateway|  sL    &77EEhmmTJ'*99)DJrY   c           	         SnUR                   [        R                  -  (       a^  U(       a,  U R                  R	                  SUR
                  -  5        SnU$ U R                  R                  SUR
                  -  5         U$ U(       Ga  UR                  [        R                  -  (       a  UR                  (       a  U" UR                  S   5      nU(       a  US   R                  S5      nU(       ao  X:w  aj  UR
                  < SU< SUS   R
                  < SU< S	3n	U(       a  U R                  R	                  U	5        SnGOU R                  R                  U	5        GOUR                   [        R                  -  (       Ga  UR                  (       Gap  U" UR                  S   5      n
U
(       GaS  U(       a'  [        U
S   R                  S5      =(       d    S5      nO(U R                  R!                  U
S   R
                  5      nU(       aI  X;:  aD  U R                  R	                  UR
                  < S
U< SU
S   R
                  < SU< 35        SnOU
S   R                   (       d  U
S   R                  [        R"                  -  (       dt  U(       dm  U R$                  (       a\  X0R&                  :  aM  U R                  R	                  UR
                  < S
U< SU
S   R
                  < SU R$                  < 35        SnU R(                  (       aK  X0R(                  :  a<  U R                  R	                  UR
                  < SU< SU R(                  < 35        SnU$ )NTzR%s: bridge inherits mtu from its ports. There is no need to assign mtu on a bridgeFr   r   z: bond slave mtu z is different from bond master z mtu z4. There is no need to configure mtu on a bond slave.z: vlan dev mtu z is greater than lower realdev z: specified mtu z is greater than max mtu )r}   r~   r   r_   rg   r   rb   r   r   
BOND_SLAVEupperifacesr   r   r   r]   r   get_link_mtur   rJ   rM   rP   )rT   ry   r   r   rz   r   retval	masterobj
master_mtulog_msglowerobjlowerdev_mtus               rW   r   address._check_mtu_config  s   !5!55##$x  {C  {H  {H  %H  IR O   !uw  xE  xE  "E  FN M ((+=+H+HH$$,X-A-A!-DE	!*1!B!B5!IJ!j&; %-MM7IaL<M<Mz$[ ' KK//8%*F KK,,W5%%(:(:::&&&+H,@,@,CD"'*8A;+K+KE+R+WVW'X'+zz'>'>x{?O?O'P#(>+++3=='8A;CSCSUa-c d!&&qk33'{99<N<W<WW*t/?/?WOcOcEc+++3=='8A;CSCSUYUeUe-g h!&||,, 6###+=='4<<%I JrY   c                 `   UR                   (       af  UR                  [        R                  -  (       dD  UR                  [        R                  -  (       d"  UR                  [        R
                  -  (       a  g UR                    H  nU" U5      nU(       a%  US   R                  [        R                  -  (       d  M9  US   R                  S5      nU(       a  MV  U R                  R                  US   R                  5      nU(       a  X:w  d  M  U R                  R                  XRUS9  M     g )Nr   r   r   r   )r;  r   r   r:  	VRF_SLAVEr   r}   r~   r   r   r   r<  r   sysfslink_set_mtu)	rT   ry   r   r   rz   u	upperobjsumturunning_mtus	            rW   _propagate_mtu_to_upper_devs$address._propagate_mtu_to_upper_devs  s    $$$$'9'D'DD$$'9'C'CC$$'9'E'EE%%A(+Iq\++m.@.@@Q<44U;D4"jj55il6G6GH"k&<JJ++A+P &rY   c                    U R                  XXB5      (       d  g X@R                  R                  UR                  5      :w  a  U R                  R                  UR                  X4S9  [        R                  R                  (       dG  UR                  (       d6  [        R                  R                  SS5      S:w  a  U R                  XXB5        g )NrE  adjust_logical_dev_mtur-   r   )r   r   r<  r   rG  rH  r   r   ALLr}   r   r   r   rM  )rT   ry   rz   r   r   s        rW   _process_mtu_config_mtu_valid%address._process_mtu_config_mtu_valid  s    %%hSSjj--hmm<<JJ##HMM7#T!''++ **"))--.FLPSS 11(W_rY   c                    UR                   [        R                  -  (       a  g U R                  R	                  UR
                  5      nUR                  (       Ga  UR                  [        R                  -  (       df  UR                  [        R                  -  (       dD  UR                  [        R                  -  (       d"  UR                  [        R                  -  (       aI  X R                  :w  a9  U R                  R                  UR
                  U R                  U R                  S9  g [         R"                  R%                  SS5      S:w  a  UR&                  (       a  UR                  [        R(                  -  (       a_  UR&                  S   nU R                  R	                  U5      nXB:w  a/  U R                  R                  UR
                  [+        U5      US9  g g g g g UR
                  S:X  d  UR                  (       d  UR                   [        R,                  -  (       d\  U R                  (       aJ  X R                  :w  a:  U R                  R                  UR
                  U R                  U R                  S9  g g g g g g )NrE  rP  r-   r   r   lo)r   r   	MGMT_INTFr   r<  r   r}   r~   BONDVXLANr   OTHERrM   rG  rH  rJ   r   r   r   r   r   ra   r:  )rT   ry   cached_link_mtulower_ifacelower_iface_mtu_ints        rW   _process_mtu_config_mtu_none$address._process_mtu_config_mtu_none  s   ##&8&B&BB**11(--@ !!M$6$66))M,?,??))M,@,@@))M,?,??"&:&::JJ++HMM4CSCS]a]q]q+r%%))*BCHCO((&&););;"*"6"6q"9K*.***A*A+*N'*=

//sK^G_i|/} >	 < ) P ==D((2D2D**-?-J-JJ "6"66

''t?O?OY]YmYm'n 7  K 3E(rY   c                    UR                   nU R                  R                  [        R                  U5      nU R                  R                  [        R
                  U5      nUR                  (       dL  UR                  S5      (       d6  U(       a  U R                  USS5        U(       a  U R                  USS5        ggU(       d  U R                  USS5        U(       d  U R                  USS5        gg)zFset ip forwarding to 0 if bridge interface does not have a
ip nor svi r
   ipv4r   ipv6r  N)	r   r   get_netconf_forwardingsocketAF_INETAF_INET6r;  r   %sysctl_write_forwarding_value_to_proc)rT   ry   r   netconf_ipv4_forwardingnetconf_ipv6_forwardings        rW   _set_bridge_forwardingaddress._set_bridge_forwarding  s     "&**"C"CFNNTZ"["&**"C"CFOOU["\##H,C,CI,N,N&::661M&::661M ' +::661M*::661M +rY   c                 @    U R                  SU< SU< S3SU-  5        g )Nz/proc/sys/net/z/conf/z/forwardingz%s
)r   )rT   r   r   values       rW   rf  -address.sysctl_write_forwarding_value_to_proc  s    PRX[`R`arY   c                 \
   SnUR                  S5      nU(       d  SnU R                  SS5      n[        R                  " U5      n[        R
                  R                  (       a  SnO.[        U R                  R                  UR                  5      5      nX4:w  a>   U R                  SSR                  UR                  R                  S5      5      -  U5        UR(                  [*        R,                  -  (       a  U R/                  U5        g U R1                  U5      (       d  g UR                  S
5      nUR                  S5      n[        R
                  R                  (       a  U(       aQ  U R                  SSR                  UR                  R                  S5      5      -  [        R                  " U5      5        U(       aQ  U R                  SSR                  UR                  R                  S5      5      -  [        R                  " U5      5        g UR2                  [4        R6                  -  nU(       aK  U(       a  U R9                  SUR                  -  5        U(       a  U R9                  SUR                  -  5        g SnU(       d  SnU R:                  nU(       a  [=        [        R>                  " U5      5      nU R                  RA                  [B        RD                  UR                  5      n	Xi:w  a>   U R                  SSR                  UR                  R                  S5      5      -  U5        SnU(       d  SnU RF                  nU(       a  [=        [        R>                  " U5      5      nU R                  RA                  [B        RH                  UR                  5      n
Xz:w  a?   U R                  SSR                  UR                  R                  S5      5      -  U5        g g g ! [         a\  nU(       dJ  [        R                   Ul        U R$                  R'                  UR                  < S	[        U5      < 35         S nAGNxS nAff = f! [         a\  nU(       dJ  [        R                   Ul        U R$                  R'                  UR                  < S	[        U5      < 35         S nAGNS nAff = f! [         a`  nU(       dO  [        R                   Ul        U R$                  R'                  UR                  < S	[        U5      < 35         S nAg  S nAg S nAff = f)NFr/   Tr#   r   znet.mpls.conf.%s.inputr   .r   r*   r.   znet.ipv4.conf.%s.forwardingznet.ipv6.conf.%s.forwardingr   r   )%r   get_mod_subattrr   r   r   r   r   ra   r   get_netconf_mpls_inputr   
sysctl_setr   splitr   ifaceStatusERRORstatusr_   r`   r}   r~   r   ri  rw   r   r   r   r   rC   r]   rG   rb  rc  rd  rD   re  )rT   ry   setting_default_valuempls_enablerunning_mpls_enablerc   rC   rD   r   running_ipforwardrunning_ip6forwards              rW   _sysctl_configaddress._sysctl_config  s    %33MB$(!..}iHK22;? ''"%"%djj&G&G&V"W-I 8"%((8==+>+>s+C"D!F +- !5!55''1((2211,?	22=A
'' =#&88HMM,?,?,D#E!G % < <Y GI  ="%((8==+>+>s+C"D!F % < <Z HJ --0B0N0NN  -.6mm < =  -.6mm < = %$(!IE99)DEI $

 A A&..RZR_R_ `-MOO$A&)hhx}}/B/B3/G&H%J$-/ !&$(!JU:::FGJ!%!B!B6??T\TaTa!b/LOO$A&)hhx}}/B/B3/G&H%J$.0 0 m  I,&1&7&7HOKK%%A&GHIV ! M0*5*;*;))X]]CF*KLM& ! L
 1)4):):x{{((HMM3q6)JKK 1LsK   =O/ ;=Q /=S /
Q9AQQ
R>"AR99R>
T+AT&&T+c                    UR                   [        R                  -  (       a  g UR                  S5      nSnU(       dl  UR                   [        R                  -  (       a  U R
                  nU(       d5  U R                  R                  UR                  0 5      R                  S5      nSnU(       a   [        U5      nU R                  XX55        g U R                  U5        g ! [         a|  nU(       a6  U R                  R                  UR                  < S[        U5      < 35        O5U R                  R                  UR                  < S[        U5      < 35         S nAg S nAff = f)Nr   FTz7: invalid MTU value from policy file (iface_defaults): z: invalid MTU value: )r   r   OPENVSWITCHr   rV  rL   rF   r   r   r]   r   r_   rg   ra   rR  r]  )rT   ry   rz   r   mtu_from_policyr   rc   s          rW   process_mtuaddress.process_mtur  s   ""%7%C%CC//6''*<*F*FF44..228=="EII%P"Og, ..x7\--h7  "KK''iqivivx{|}x~(  AKK''x}}VYZ[V\(]^s   2C" "
E(,A2E##E(c                 6   UR                  S5      nU(       d   [        R                  R                  (       a  g U(       d  UR                  S;   a  g U(       d  U R                  S5      nSSSSSSS.R                  UR                  5       S 5      nUbZ  U R                  R                  5         U R                  R                  UR                  USS9  U R                  R                  5         g U R                  R                  UR                  < SU< S	35        g )
Nr0   dhcppppr   r  )r+   r'   r   r,   r(   r-   T)link_createdz: invalid value "z" for attribute ipv6-addrgen)r   r   r   r   addr_methodget_attr_default_valuer   lowerr   batch_startlink_set_ipv6_addrgenr   batch_commitr_   rg   )rT   ry   user_configured_ipv6_addrgenipv6_addrgen_nls       rW   up_ipv6_addrgenaddress.up_ipv6_addrgen  s    '/'D'D^'T$+0C0C0L0L+0D0D0W++/+F+F~+V( 
 #*002D
9 	 &MM%%'MM//]a/bMM&&( KKW_WdWd  gC  !D  ErY   c                 ,   U R                   R                  UR                  5      (       d  g U R                  X5      (       d  g U R                  R                  UR                  UR                  S5      5        U R                  U5        UR                  nSn US;  Ga/  [        R                  R                  (       Gd  UR                  [        R                  -  (       d  [        5       nUR                  UR                  5      (       aR  UR!                  UR                  5        U R                   R#                  UR                  [$        R&                  5        SnOqUR)                  UR                  5      (       aQ  UR+                  UR                  5        U R                   R#                  UR                  [$        R,                  5        SnU R1                  X5        U R3                  U5        US;  a  U R5                  XU5        O[6        R8                  R;                  UR                  5      =(       d    /  H^  nUR=                  S5      =(       d    /  H=  nU R>                  RA                  UR                  [B        RD                  " U5      5        M?     M`      U RG                  U5        U RI                  US5        g ! [.         a     GNf = f! [.         a6  nU RK                  UR                  < S[M        U5      < 3U5         S nAg S nAff = f)Nr%   Fr  Tr
   r   )'r   link_existsr   rx   rG  link_set_aliasr   r|  r  r   r   r   r   r   r   
is_runningreleaseforce_address_flush_familyrc  rd  is_running6release6re  r   r  r  r  r   r   r   r   r   r  rQ   rR   process_hwaddressr   r   ra   )	rT   ry   rz   r  r  dhclientcmdold_ifaceobjr   rc   s	            rW   _pre_upaddress._pre_up  sK   zz%%hmm44<<XXX
 	

!!(--1N1Nw1WXH%**	?2M<O<O<X<X<X!%*<*<< 'j))(--88''6JJ99(--X$(M ,,X]];;((7JJ99(--Y$(M 	4X&o-""8}M !- = = K KHMM Z `^` `(77	BHbHDLL))(--9L9LT9RS I !a
	I""8,   40)  		*  	INNx}}c!f=xHH	Is2   CK A1K #K 
KK
L,LLc                 ~    UR                  S5      nU(       d  / nU R                  X5      nU R                  XU5        g )Nr   )r   r7  r1  )rT   ry   rz   r   r/  s        rW   _upaddress._up  s:    **95H((<  W=rY   c                    U R                  U5      nU(       d{  UR                  [        R                  -  (       aX  UR                   H?  nU R
                  R                  U5      S:X  d  M$  U R
                  R                  U5      n  O   U(       d  g Og [        R                  R                  (       d&  U R
                  R                  UR                  5      nOS n[        R                  " U5      [        R                  " U5      :w  a  SnUR                  [        R                  -  (       aA  UR                  (       a0  UR                   H  nU R                  R!                  U5        M      Sn U R                  R#                  UR                  U5        U(       a/  UR                   H  nU R                  R%                  U5        M      g g g ! U(       a/  UR                   H  nU R                  R%                  U5        M      f f = f)Nr   FT)r   r}   r~   r   r   r   r   get_link_addressr   r   r   r   r   r   rW  r   	link_downlink_set_addresslink_up)rT   ry   r$   r  running_hwaddress
slave_downls          rW   r  address.process_hwaddress  s   ''1	!!M$6$66 &11Ezz//6(B$(JJ$?$?$F	 2 ! ! ""++ $

 ; ;HMM J $	*e.B.BCT.UUJ!!M$6$66''%11..q1 2!%J0--hmmYG%11,,Q/ 2  V %11,,Q/ 2 s   /&G 8Hc                     U R                   R                  UR                  5      (       d  g UR                  nUS;  a  UR	                  S5      S:X  aJ  UR                  S5      nU=(       d    /  H)  nU R                  R                  UR                  U5        M+     OUR                  (       dz  U(       a  U" UR                  5      =(       d    U/nOU/nU R                   R                  UR                  U5       H)  nU R                  R                  UR                  U5        M+     UR                  S5      nU(       a1  U R                  XUR	                  S5      UR	                  S5      5        UR                  (       d  U R                  (       a  UR	                  S5      (       al  U R                   R                  UR                  5      U R                  :w  a9  U R                  R                  UR                  U R                  U R                  S	9  UR                  (       d>  UR	                  S
5      nU(       a&  U R                  R!                  UR                  S 5        U R#                  US5        g ! [$         a?  n	U R&                  R)                  UR                  < S[+        U	5      < 35         S n	A	g S n	A	ff = f)Nr  r&   r(   r
   r   r%  r&  r   rE  r%   Fz : )r   r  r   r  r   r   r   r  r}   r   r(  rJ   r<  rM   rG  rH  r  r   r   r_   r$  ra   )
rT   ry   rz   r  addrlistr   r   r   r%   rc   s
             rW   _downaddress._down  s5   1	::))(--88"..K/100A4G'66yAH (B--hmmTB !/!++ ((8(G(UH:)1
 $

 C CHMMS` a--hmmTB !b  ..y9H$$X%-%B%B5%I%-%B%B8%LN %%$*:*:x?\?\]b?c?chlhrhrhh  AI  AN  AN  iO  SW  Sg  Sg  ig

''t?O?OY]YmYm'n
 %% 55g>JJ--hmmTB   51 	KK(--Q@A	s   *I8 I
I8 8
K5J<<Kc                     U R                   R                  U5      nU(       d1  U R                  R                  U5      nU(       d  g X0R                   U'   UR                  U5      $ N)r=   r   r   bridge_fdb_show_dev)rT   r   r   fdbss       rW   _get_bridge_fdbsaddress._get_bridge_fdbsG  sQ    ++//
;--33J?46:''
3xx~rY   c                    UR                   [        R                  -  (       a  UR                  S   nU R	                  U5      nU R
                  R                  U5      (       ac  U R                  U[        U5      5       Vs/ s H  n[        R                  " U5      PM     nnU(       d  g[        R                  " U5      nXv;  a  ggs  snf )zEIf the device is a bridge, make sure the addresses
are in the bridge r   FT)r}   r~   r   r   r   r   r   r  ra   r   r   )rT   ry   r$   r   r   fdb_addr	fdb_addrshwaddress_ints           rW   _check_addresses_in_bridge"address._check_addresses_in_bridgeP  s      2 22!--a0J$$X.Dzz..z::LPLaLablnqrvnwLxyLxU11(;Lx	y  % 4 4Y ? 1  zs     Cc                    UR                   [        R                  -  nUR                  S5      nU(       a  U(       a0  [        R
                  Ul        SUl        UR                  SSS 5        OhU R                  R                  [        R                  UR                  5      n[        R                  " U5      nUR                  SU(       a  SOSXV:g  5        UR                  S5      nU(       a  U(       a0  [        R
                  Ul        SUl        UR                  SSS 5        OhU R                  R                  [        R                   UR                  5      n[        R                  " U5      n	UR                  SU(       a  SOSX:g  5        UR                  S5      n
U
(       aW  [        R"                  " [%        U R                  R'                  UR                  5      5      5      nUR                  SUX:g  5        g )	Nr*   z*'ip-forward' not supported for bridge portr  r+   r,   r.   z+'ip6-forward' not supported for bridge portr/   )r   r   r   r   rt  ru  rv  
status_strupdate_config_with_statusr   rb  rc  rd  r   r   rG   re  get_yesno_from_onezerora   rq  )rT   ry   ifaceobjcurrr   rC   rz  config_ipforwardrD   r{  config_ip6forwardrx  ry  s               rW   _query_sysctladdress._query_sysctl_  s   --0B0N0NN11,?	&1&7&7#,='66|QM$(JJ$E$EfnnV^VcVc$d!#(#@#@#K 66 -D5%9 22=A
&1&7&7#,='66}aN%)ZZ%F%FvX`XeXe%f"$)$A$A*$M!66!.DE&;
 33MB"'">">s4::CdCdemererCs?t"u22=3F,7,NP 	rY   c                     UR                  S5      nU(       d  g U[        R                  ;   aN  UR                  SU[        R                  " U5      U R
                  R                  UR                  5      :H  5        g UR                  SUS5        g )Nr0   r  )r   r   _string_valuesr  rG   r   get_link_ipv6_addrgen_moder   )rT   ry   r  ipv6_addrgens       rW   query_check_ipv6_addrgen address.query_check_ipv6_addrgen  sx    44^D5///22--l;tzz?d?demerer?ss 22><QRSrY   c                 ^   SnU R                   R                  UR                  5      (       d)  U R                  R	                  SUR                  -  5        gU R                  X5        UR                  nU R                  XSU R                   R                  5        U R                  U5      nU(       a  U R                   R                  UR                  5      nU(       a.  [        R                  " U5      [        R                  " U5      :w  a  UR                  SUS5        ODU R                  X5      (       d  UR                  SUS5        SUl        OUR                  SUS5        U R                  XSU R                   R                   5        U R#                  X5        U R%                  XU5        g)	z+
TODO: Check broadcast address, scope, etc
Niface %s not foundr   r$   r  zbridge fdb errorr   r%   )r   r  r   r_   r$  r  r   query_n_update_ifaceobjcurr_attrget_link_mtu_strr   r  r   r   r  r  r  get_link_aliasr  _query_check_address)rT   ry   r  rz   runningaddrsdictr  r$   
rhwaddresss           rW   _query_checkaddress._query_check  s^     zz%%hmm44KK2HMMAB%%h=**--htzz22	4''1	44X]]CJ!5!5j!AUEYEYZcEd!d55k:44XII55k:);|&55k:--hTZZ66	8 	82!!(:JKrY   c                    UR                   S;   a  gU(       a  U" UR                  5      nOU/nU R                  R                  UR                  U5      nU R                  R	                  U/5      n [
        R                  " UR                  S5      5      nXu;   a  UR                  U5        UR                   Ul         UR                  Ul
        U(       d  U(       d  gU H3  nUR                  S[        U5      X;  5         UR                  U5        M5     UR                  [        R                   -  (       a#  UR                  [        R"                  -  (       d  gU R                  R	                  U5      n	U H&  nX;  d  M
  UR                  S[        U5      S5        M(     g! [         a     GNf = f! [         a     M  f = f)z$ifquery-check: attribute: "address" r  Nr)   r
   r  )r  r   r   r   get_user_configured_addressesrQ   rR   r   r   r   addr_familyr  ra   remover   r   r   r   )
rT   ry   r  rz   r   intf_running_addrsr  clagd_vxlan_anycast_ipr
   all_stanza_user_config_ips
             rW   r  address._query_check_address  s   ?2,X]];M%JM!ZZ@@P]^ JJDDhZP	%.%8%89V9VWo9p%q"%;!(()?@
 $,#7#7 #+#7#7 !*; (G229c'lGLmn"))'2 ) >>E...>>E$:$::$(JJ$L$L]$[!)G766y#g,PQR *=  		   s$   2;F$ F5$
F21F25
GGc                     U R                   R                  UR                  5      nU(       a  UR                  SS5        g g )Nr0   r,   )r   r  r   update_config)rT   ifaceobjrunningr  s      rW   query_running_ipv6_addrgen"address.query_running_ipv6_addrgen  s4    zz<<_=Q=QR)).%@ rY   c                 |   U R                   R                  UR                  5      (       d)  U R                  R	                  SUR                  -  5        g U R                  U5        [        5       nUR                  UR                  5      (       d   UR                  UR                  5      (       a  g U R                   R                  UR                  5      =(       d    / nU R                   R                  UR                  5      (       aG  U R                   H  n UR                  U5        M     UR                  R                  S5        SUl        U H  nUR#                  S[%        U5      5        M      U R                   R'                  UR                  5      nU(       a  UR                  S:X  a  US:w  d%  UR                  S:w  a'  XpR)                  SS5      :w  a  UR#                  SU5        U R                   R+                  UR                  5      nU(       a  UR#                  S	U5        g g ! [         a     GM&  f = f)
Nr  r   loopbackr
   rU  16436r   r#   r%   )r   r  r   r_   r$  r  r   r  r  get_ip_addresseslink_is_loopbackrS   r  r   r  r   r  r  ra   r  rp  r  )	rT   r  rz   r  r  default_addrr   r   r%   s	            rW   _query_runningaddress._query_running  s   zz%%o&:&:;;KK2O4H4HHI''8j""?#7#788''(<(<==!ZZ889M9MNTRT::&&';';<< $ ? ?&--l; !@
 ''..v6*4O'&D)))SY? ' jj))/*>*>? %%-#. %%-//yAA--eS9

))/*>*>?))'59 ! ! s   H,,
H;:H;)zpre-upr   downquery-checkcurrzquery-runningc                 H    [        U R                  R                  5       5      $ )z-returns list of ops supported by this module )r,  _run_opskeys)rT   s    rW   get_opsaddress.get_ops!  s    DMM&&())rY   c                     UR                   [        R                  :X  a  gU R                  R	                  U5      nU(       d  gUS:X  a	  U" XUUS9  gU" XUS9  g)a  run address configuration on the interface object passed as argument

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

    **operation** (str): any of 'up', '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  )rz   )type	ifaceTypeBRIDGE_VLANr  r   )rT   ry   	operationquery_ifaceobjrz   
op_handlers         rW   runaddress.run%  sZ      ==I111]]&&y1
))t~(8: t(8:rY   )r=   rS   rL   rN   rm   rJ   rM   r8   rF   rD   rC   r9   r;   rP   r  )F)NF)NN)8rB   
__module____qualname____firstlineno____doc___modinfor\   r<   rI   rO   rK   rs   rx   rw   rv   ru   r   rt   r   r   r   r   r  staticmethodr   r  r  r  r(  r1  r7  r   rM  rR  r]  ri  rf  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __static_attributes__ rY   rW   r
   r
   +   s   & ?{
= 12DE!*:{
 )34{
( A&Z23){
2 M M(>
3{
H !/  #Gn0+
#I{
^ M02DE0_{
l )&1!34	m{
x C$fo&<!	y{
D 0%Y9:E{
N `/0O{
V -
 $T] 23	W{
j %L&Z>?'k{
t ,A ,-	u{
@ .A -.	A{
L *#T]-.	M{
X >"E]%&	Y{
j BA +,	k{
~H@  %
N( (r D	
 Q%JN./`-    >]@+Z 
# 
#F 68 	C.`Q$ (oTN&bXLt8<E>7Ir>"0H2h'RT LD2ShA$:N ''H*:rY   r
   )&rc  ifupdown2.lib.addonr   ifupdown2.nlmanager.nlmanagerr   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   !ifupdown2.ifupdownaddons.dhclientr   #ifupdown2.ifupdownaddons.modulebaser   ifupdown2.nlmanager.ipnetwork	nlmanagerrQ   ifupdown2.ifupdown.statemanagerifupdownr    ifupdown2.ifupdown.policymanagerr>    ifupdown2.ifupdown.ifupdownflagsr   !ifupdown2.ifupdown.ifupdownconfigr   ImportErrorModuleNotFoundError	lib.addonnlmanager.nlmanagerifupdown.ifaceifupdown.utilsifupdownaddons.dhclientifupdownaddons.modulebasenlmanager.ipnetworkifupdown.statemanagerifupdown.policymanagerifupdown.ifupdownflagsifupdown.ifupdownconfigr
   r   rY   rW   <module>r     s    5)2*.:>55::<<<<>>&T:eZ T:% 	() 5( $04+02245s   AA# #A	B/.B/