
    /I_&                     p   S SK r S SKrS SKrS SKrS SKJr   S SKJr  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 a>    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   NRf = f)
    N)deque)Addon)*)utils)Link)
moduleBasec                   ^   \ rS rSrSrSSSS/S/S.S	S
S/S
SS/S.SSSS/S.S.S.rSrSrS r\	S 5       r
\	S 5       rS5S jrS rS rS rS rS rS  rS! rS5S" jrS# rS$ rS5S% jrS& rS5S' jrS6S( jrS5S) jrS6S* jrS+ rS5S, jrS- r\ S. 5       r!S/ r"S5S0 jr#\\\\#S1.r$S2 r%  S7S3 jr&S4r'g)8addressvirtual.   z6ifupdown2 addon module to configure virtual addresses zaddress module configures virtual addresses for interfaces. It creates a macvlan interface for every mac ip address-virtual linez!bridge router virtual mac and ipsTz<mac-ip/prefixlen-list>z9address-virtual 00:11:22:33:44:01 11.0.1.1/24 11.0.1.2/24)help
multivalue	validvalsexamplez$enable disable ipv6 link addrgenmodeonoffzaddress-virtual-ipv6-addrgen onz address-virtual-ipv6-addrgen off)r   r   defaultr   zVRRP supportz+vrrp 1 10.0.0.15/24 2001:0db8::0370:7334/64zvrrp 42 10.0.0.42/24)r   r   r   )address-virtualaddress-virtual-ipv6-addrgenvrrp)mhelpattrsi   Nc                 n   [         R                  " U 5        [        R                  " U /UQ70 UD6  0 U l        [        R
                  " [        R                  R                  U R                  R                  SS9SS9U l        SSSSSSS.U l        [        R                  c   [        R                  SS	/nU R                   R#                  S
[        R                  -  5        [$        R&                  " U[$        R(                  [$        R(                  S9nUR+                  5       u  pVSUR-                  5       ;   =(       d    S[        l        U R                   R#                  S[        R                  (       a  SOS-  5        g g ! [.         a)    S[        l        U R                   R#                  S5         g f = f)N addressvirtual_with_route_metric)module_nameattrT)r   r      )r   yes0r   no1addrr   zexecuting %s addr help)stdoutstderrz[ metric METRIC ] zaddress metric support: %sOKKOFzaddress metric support: KO)r   __init__r   _bridge_fdb_query_cacher   get_boolean_from_stringpolicymanagerpolicymanager_apiget_module_globals	__class____name__r   'address_virtual_ipv6_addrgen_value_dictr
   ADDR_METRIC_SUPPORTip_cmdloggerinfo
subprocessPopenPIPEcommunicatedecode	Exception)selfargskargscmdprocessr"   r#   s          -/usr/share/ifupdown2/addons/addressvirtual.pyr'   addressvirtual.__init__R   sa   tD14151')$050M0M++>> NN337 ?  1
- ?@PQZ[cdkl7m4--5
?||VV4  !9ELL!HI$**3zz_!(!4!4!65HFMMO5[5a_a2  !=IkIkqu!vw 6  ?5:2  !=>?s   "CF 0F43F4c                     U R                   $ N)r0   clss    r?   addr_metric_support"addressvirtual.addr_metric_supportm   s    &&&    c                     U R                   $ rB   )DEFAULT_IP_METRICrC   s    r?   get_default_ip_metric$addressvirtual.get_default_ip_metricq   s    $$$rG   c                     UR                  S5      (       d  UR                  S5      (       a$  U=R                  [        R                  -  sl        g g )Nr   r   )get_attr_valuelink_privflagsifaceLinkPrivFlagsADDRESS_VIRTUAL_SLAVE)r:   ifaceobjifacenames_alls      r?   get_dependent_ifacenames'addressvirtual.get_dependent_ifacenamesu   sC    ""#4559P9PQW9X9X##'9'O'OO# :YrG   c                 F    SUR                   SS R                  SS5      -  $ )Nz%s-vr      .-)namereplace)r:   rQ   s     r?   _get_macvlan_prefix"addressvirtual._get_macvlan_prefixy   s%    x}}Qr*223<<<rG   c                 J    SU< SU R                   R                  U5      < S3$ )Nr   rX   )cacheget_ifindex)r:   ifnamefamilys      r?   get_vrrp_prefixaddressvirtual.get_vrrp_prefix|   s    %tzz'='=f'EFFrG   c                    UR                   [        R                  -  (       an  UR                  S   nU R	                  U5      nU R
                  R                  U5      (       a-  U Vs/ s H  nU R                  R                  X5U5      PM!       ng g U R
                  R                  UR                  5      (       a7  U Vs/ s H)  nU R                  R                  UR                  U5      PM+       ng g s  snf s  snf )Nr   )	link_kindifaceLinkKindVLANlowerifaces_get_vlan_idr^   bridge_is_vlan_awareiproute2bridge_fdb_addlink_is_bridgerY   )r:   rQ   	hwaddress
bridgenamevlanr!   s         r?   _add_addresses_to_bridge'addressvirtual._add_addresses_to_bridge   s     2 22!--a0J$$X.Dzz..z::&/1&/d --j&/1 ; ZZ&&x}}55 )+ ) ]]))(--> )+ 61+s   '&C3?0C8c           	         UR                   [        R                  -  (       ah  UR                  S   nU R	                  U5      nU R
                  R                  U5      (       a'  U H   n U R                  R                  X5U5        M"     g g U R
                  R                  UR                  5      (       a1  U H*  n U R                  R                  UR                  U5        M,     g g ! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAM  S nAff = f! [         a@  nU R                  R                  UR                  < S[        U5      < 35         S nAM  S nAff = f)Nr   : )re   rf   rg   rh   ri   r^   rj   rk   bridge_fdb_delr9   r2   debugrY   strrm   )r:   rQ   rn   ro   rp   r!   es          r?   _remove_addresses_from_bridge,addressvirtual._remove_addresses_from_bridge   s!    2 22!--a0J$$X.Dzz..z::%D44ZtL & ; ZZ&&x}}55!MM00E " 6 % ))X]]CF*KL ! KK%%A&GHs0   )C';&D4'
D115D,,D14
E>>5E99E>c                     U R                   R                  U5      nU(       d1  U R                  R                  U5      nU(       d  g X0R                   U'   UR                  U5      $ rB   )r(   getrk   bridge_fdb_show_dev)r:   ro   rp   fdbss       r?   _get_bridge_fdbsaddressvirtual._get_bridge_fdbs   sQ    ++//
;--33J?46:''
3xx~rG   c                    UR                   [        R                  -  (       a  UR                  S   nU R	                  U5      nU R
                  R                  U5      (       a_  U R                  U[        U5      5      nU(       d  g[        R                  " U5      nU H  n[        R                  " U5      U:X  d  M    g   gg)zEIf the device is a bridge, make sure the addresses
are in the bridge r   FT)re   rf   rg   rh   ri   r^   rj   r   rw   r   mac_str_to_int)r:   rQ   rn   ro   rp   	fdb_addrshwaddress_intmacs           r?   _check_addresses_in_bridge)addressvirtual._check_addresses_in_bridge   s      2 22!--a0J$$X.Dzz..z:: 11*c$iH	  % 4 4Y ?$C++C0MA# % rG   c                     U R                   R                  SUR                  -  5        [        R                  " US5      nUR
                  S:X  a  g UR                  [        R                  -  (       a&  U R                  R                  UR                  5      nOS nU R                  R                  UR                  US9nU(       ax  XaR                  :w  ah  U R                   R                  SUR                  -  SU-  -   S-   5        U R                  R                  U5        U R                  R                  U5        g g g ! [          a@  nU R                   R#                  UR                  < S[%        U5      < S	35         S nAg S nAff = f)
Nz%s: checking route entry ...F   )
vrf_masterz%s: preferred routing entry z!seems to be of the macvlan dev %sz& .. flapping macvlan dev to fix entry.z: fixing route entry failed ())r2   r3   rY   	ipaddress
ip_networkversionrN   rO   	VRF_SLAVEr^   
get_masterrk   ip_route_get_devwith_prefixlen	link_downlink_upr9   rv   rw   )r:   rQ   
vifacenamer!   ipr   devrx   s           r?   _fix_connected_route#addressvirtual._fix_connected_route   sE    	KK;X]]JK %%dE2B zzQ&&);)E)EE!ZZ228==A
!
--001B1Bz0ZCsmm+  !?!N!D","-"- "J"J K ''
3%%j1 ,s  	KK!)A8 9	s   AE  C+E   
F

6FF
c                    / n[         R                  R                  UR                  5      nU(       d  U$ U H  nUR	                  S5      (       d  M  UR	                  S5       He  nUR                  5       n[        U5      S:  a/  U R                  R                  UR                  < SU< S35        MQ  UR                  US   5        Mg     M     U$ )zaThis method returns a list of the mac addresses
in the address-virtual attribute for the bridge. r      z': incorrect old address-virtual attrs ''r   )
statemanagerstatemanager_apiget_ifaceobjsrY   rM   splitlenr2   rv   append)r:   rQ   maclistsaved_ifaceobjsoldifaceobjavmacips          r?   _get_macs_from_old_config(addressvirtual._get_macs_from_old_config   s     &77EEhmmTN*K--.?@@!001BC
u:>KK%%(3(8(82'? @uQx( D + rG   c                 V   UR                  S5      nU(       a_  U R                  R                  UR                  5       S 5      nUc.  U R                  R                  UR                  < SU< S35        gSU4$ U R                  R                  U R                  S5      S 5      nUb  SU4$ g)Nr   z: invalid value "z," for attribute address-virtual-ipv6-addrgenT)FN)get_attr_value_firstr/   r|   lowerr2   warningrY   get_attr_default_value)r:   rQ   ipv6_addrgenipv6_addrgen_nls       r?   )get_addressvirtual_ipv6_addrgen_user_conf8addressvirtual.get_addressvirtual_ipv6_addrgen_user_conf   s    445ST #JJNN|OaOaOceijO&##kskxkx  {G  %H  I  _,, #JJNN++,JKO *_,,rG   c                    U R                   R                  UR                  5      (       d  g / nU R                  U5      U R	                  UR                  S5      U R	                  UR                  S5      4 H  n[
        R
                  " SU-  5       H  n[        R                  R                  U5      nU R                   R                  U5      (       a  U R                   R                  U5      S:X  d  Mc  UR                  U R                   R                  U5      5        U R                  R                  [        R                  R                  U5      5        M     M     [        U5      (       a  U R                  X5        g g )N46/sys/class/net/%s*macvlan)r^   link_existsrY   r[   rb   globospathbasenameget_link_kindr   get_link_addressnetlinklink_delanyry   )r:   rQ   rn   macvlan_prefixmacvlan_ifacenames        r?   _remove_running_address_config-addressvirtual._remove_running_address_config  s1   zz%%hmm44	 $$X.  4  4
N
 &*YY/Cn/T%U!$&GG$4$45F$G!zz--.?@@

H`H`arHs  xA  IA  !<!<=N!OP%%bgg&6&67H&IJ &V
 y>>..xC rG   c                    U(       d  U R                  U5        g U R                  R                  UR                  5      (       d  g / nSnU R	                  U5      nU Hs  nUR                  5       nSXT4-  nU R                  R                  [        R                  R                  U5      5        US   S:w  a  UR                  US   5        US-  nMu     U R                  X5        g )Nr   %s%dNoner   )r   r^   r   rY   r[   r   r   r   r   r   r   r   ry   )	r:   rQ   address_virtual_listrn   av_idxr   r   av_attrsr   s	            r?   _remove_address_config%addressvirtual._remove_address_config+  s    #//9zz%%hmm44	11(;&BxxzH !'(@ @LL!!"''"2"23D"EF{f$  !-aKF ' 	**8?rG   c                     US:X  a  g [        UR                  S5      S   S5      S-  (       a#  U R                  UR                  < SU< S3US	9  g
g! [         a     g
f = f)NnoneT:r      r   z3: Multicast bit is set in the virtual mac address 'r   )rQ   F)intr   	log_errorrY   
ValueError)r:   rQ   r   s      r?   check_mac_address addressvirtual.check_mac_address@  sh    &=	399S>!$b)A-"*-- 6@H  J 		s   AA 
A A c                 B   U(       d  gUR                   [        R                  -  (       Ga$  U R                  R	                  UR
                  5      (       a  U R                  R                  UR
                  5      nU(       a  U H  nU" U5      nU(       d  M  US   R                  [        R                  -  (       d  M;  U R                  R                  US   R
                  5      nU(       d  Ml  U HT  nXqR
                  :X  a  M  U R                  R                  XqR
                  5        U R                  R                  U5        MV     M     ggUR                  [        R                  -  (       Ga-  UR                  [        R                  -  (       Ga	  U R                  R	                  UR
                  5      (       a  UR!                  S5      nU(       a   U R                  R	                  U5      (       d  gU R                  R                  UR
                  5      n	U	(       d  gU R#                  U5      n
U
(       d  gU	 HX  nXx:X  a  M
  UR%                  U
5      (       d  M"  U R                  R                  Xx5        U R                  R                  U5        MZ     gggg)ak  This function fixes up address virtual interfaces
(macvlans) on vrf slaves. Since this fixup is an overhead,
this must be called only in cases when ifupdown2 is
called on the vrf device or its slave and not when
ifupdown2 is called for all devices. When all
interfaces are brought up, the expectation is that
the normal path will fix up a vrf device or its slavesNr   vrf)re   rf   VRFr^   r   rY   sysfslink_get_lowersrN   rO   rP   link_get_uppersr   link_set_masterr   r   r   r[   
startswith)r:   rQ   ifaceobj_getfuncrunning_slavesssobjs	upperdevsuvrfnamerunning_uppersr   s              r?   _fixup_vrf_enslavements&addressvirtual._fixup_vrf_enslavementsL  s     -"3"333JJ""8==11
 "ZZ77FN (A,Q/Eq003E3[3[[[ %)JJ$>$>uQx}}$M	($!*A  !MM1 ( LL88MMJ LL003 "+ (	 * &&);)Q)QQQ&&);)E)EEEjj$$X]]33 33E:G$**"8"8"A"A!ZZ77FN!!55h?N!#<<<//LL00<LL((+ $ 4 F RrG   c                 R   / nU(       d  U$ U R                  U5      u  pV[        R                  R                  (       a  SOSnUR                  nS=n	=p[
        R                  R                  SS5      S:w  a  UR                  (       a	  U(       a  Sn	U	(       a0  U R                  R                  UR                  5      n
[        U
5      nU R                  R                  5         U GH  nSnUR                  S5      nUR                  S5      nUR                  S	5      nUR                  S
5      nU R                  R                  U5      (       d  U R                  R                  XU5        SnUR                   ["        R$                  -  (       aH  U R                  R'                  UR                  5      nU(       a  U R                  R)                  UU5        U(       aP   U R                  R+                  U[,        R.                  U5         U(       a  U R6                  R9                  U5        O#U(       a  U R                  R+                  XU5        U(       aG  U R                  R;                  UUUR                   ["        R<                  -  S9  UR?                  U5        U R@                  (       a&  U RC                  5       (       a  U RE                  5       nOSnU R                  RG                  UUUUUS9  UR                   ["        R<                  -  (       a=  U R2                  RI                  U< SU< 35        U R6                  RK                  U5        U(       d  U R@                  (       a  U RC                  5       (       d  U RM                  XUS   5        U	(       a  Sn	 U RN                  RQ                  XU
S9  UR                   ["        R<                  -  (       d  U R6                  RS                  U5        OC U R@                  (       a  U RC                  5       (       d  U R                  RU                  XU5        SU-  n U< SS< 3nU RY                  U5      S:w  a  U R[                  US5        SSS.R]                  5        H8  u  nnU< SU< 3nU RY                  U5      U:w  d  M&  U R[                  UU5        M:     GM     U R                  R_                  5         U$ ! [0         a>  nU R2                  R5                  U< SU< SU< S[        U5      < 35         SnAGNSnAff = f! [0         a>  nU R2                  R5                  U< SU< SU< S[        U5      < 35         SnAGNSnAff = f! [0         a1  nU R2                  RI                  U< SU
< SU< 35         SnAGNSnAff = f! [0         a)  nU R2                  RW                  SU-  5         SnAGNSnAff = f! [0         a2  nU R2                  RI                  S[        U5      -  5         SnAGNSnAff = f)z
intf_config_list = [
    {
        "ifname": "macvlan_ifname",
        "hwaddress": "macvlan_hwaddress",
        "ips": [str(IPNetwork), ]
    },
]
FTNadjust_logical_dev_mtur    r   r`   rn   modeipsrt   z: ip link set dev z. addrgenmode random: operation not supported: z( protodown on: operation not supported: )	keep_down)metricz7: keeping macvlan down - link-down yes on lower device r   )mtu_strmtu_intz: failed to set mtu z+fix_vrf_slave_ipv6_route_metric: failed: %sznet.ipv6.conf.%srW   enhanced_dadz+sysctl failure: operation not supported: %s)
accept_daddad_transmits)0r   ifupdownflagsflagsPERFMODErY   ifupdownconfigconfigr|   rh   r^   get_link_mturw   rk   batch_startr   link_add_macvlanrN   rO   r   r   r   link_set_ipv6_addrgenr   IN6_ADDR_GEN_MODE_RANDOMr9   r2   r   r   link_set_protodown_onlink_set_address_and_keep_downKEEP_LINK_DOWNr   r   rE   rJ   add_addressesr3   r   r   r   link_set_mtur   fix_ipv6_route_metricrv   
sysctl_get
sysctl_setitemsbatch_commit)r:   rQ   intf_config_listr   hw_address_list user_configured_ipv6_addrgenmodeipv6_addrgen_user_valuepurge_existingr`   
update_mtulower_iface_mtulower_iface_mtu_strintf_config_dictlink_createdmacvlan_ifnamemacvlan_hwaddrmacvlan_moder   
vrf_ifnamerx   r   sysctl_prefixsyskeykeysysvals                            r?   create_macvlan_and_apply_config.addressvirtual.create_macvlan_and_apply_config  sC    ""DHDrDrs{D|A("/"5"5">">D=AA
A_  $$%=sCsJ##(8!
"jj55hmmDO"%o"6!!# 0 L-11(;N-11+>N+//7L"&&u-C::)).99 ..v|T# &&);)E)EE!ZZ228==A
MM11.*M wMM77&55$c#::>J 233N]ij<<""&558J8Y8YY = 
  &&~6449Q9Q9S9S335MM'' (  &&);)J)JJ  bprx!yz&&~6  <<DD\D\D^D^ --hAO!&Jp

//et/u  ..1C1R1RRLL((8Y@@H`H`HbHb ;;HVYZ
 /?MY$1>B??6*c1OOFC0
 "!$  eg V %237??6*f4OOFF3 [ !1j 	""$m ! wKK''FLn^lnqrsnt)v w ww ! cKK''rx  {I  KY  [^  _`  [a  )b  c  ccV % p((>[jlm)noop ! YKK%%&SVW&WXXY  Y  !NQTUVQW!WXXYsy   +S 
"T+U68AV4 0W* 
T(*3T##T(+
U353U..U36
V1 &V,,V14
W'>W""W'*
X&4'X!!X&c                 .   [         R                  R                  (       d  U R                  X5        UR	                  S5      nUR	                  S5      nU(       d  U(       d  U R                  U5        g UR                  (       aA  UR                  [        R                  -  (       d  U R                  SUR                  -  U5        U R                  R                  UR                  5      (       d  g U R                  UU R                  UU5      5      nU R                  UU R!                  UU5      SS9nXV-   nU R#                  U5      nU V	s/ s H  oR%                  5       U;  d  M  U	PM     n
n	U R'                  X5        U R)                  X5        g s  sn	f )Nr   r   z%s: invalid placement of address-virtual/vrrp lines (must be configured under an interface with no upper interfaces or parent interfaces)T)r   )r   r   ALLr   rM   r   upperifacesrN   rO   r   r   rY   r^   r   r  )translate_addrvirtual_user_config_to_list!translate_vrr_user_config_to_listr   r   ry   rq   )r:   rQ   r   r   vrr_config_listaddr_virtual_macsvrr_macsr	  oldmacsr   removed_macss              r?   _upaddressvirtual._up   su   ""&&((D'667HI"11&9#O //9(?(?BTB^B^(^NN L &]]+ -56
 zz%%hmm44 @@::$
 7722  8 
 ,6 00: (/Uw))+_2TwU**8B 	%%h@	 Vs   F'Fc           
      p   UR                   n/ n[        U=(       d    / 5       GHW  u  pgUR                  SS5      u  pS[        U5      -  n
/ n/ nU	R                  5        HS  n[        R
                  " U5      nUR                  S:H  nU(       a  UR                  U5        MB  UR                  U5        MU     U R                  US5      < U< 3nU R                  US5      < U< 3nU(       d  U(       al  SnSU
-  n[        R                  " U5      nU H)  nUR                  S	5      U:X  d  M  US
==   U-  ss'   SnM+     U(       d  UR                  UUUSUUS.5        OIU(       dB  U(       d;  U R                  R                  U5      (       a  U R                  R                  U5        U(       d  U(       aq  SnSU
-  n[        R                  " U5      nU H)  nUR                  S	5      U:X  d  M  US
==   U-  ss'   SnM+     U(       d  UR                  UUUSUUS.5        GM  GM  U(       a  GM  U(       a  GM  U R                  R                  U5      (       d  GM<  U R                  R                  U5        GMZ     U(       GdV  [!        5       n ["        R$                  R'                  U5      =(       d    /  HG  nUR)                  S5      =(       d    /  H&  n UR+                  UR                  5       S   5        M(     MI     U(       a  U H  n UR/                  US   5        M     U H  nU R                  US5      < U< 3nU R                  US5      < U< 3nU R                  R                  U5      (       a  U R                  R                  U5        U R                  R                  U5      (       d  M  U R                  R                  U5        M     U$ U$ ! [,         a     GM  f = f! [0         a     M  f = f! [,         a)  nU R2                  R5                  SU-  5         SnAU$ SnAff = f)a  
If (IPv4 addresses provided):
    00:00:5e:00:01:<V>
else if (IPv6 addresses provided):
    00:00:5e:00:02:<V>

vrrp 1 10.0.0.15/24
vrrp 1 2001:0db8::0370:7334/64

# Translate:
#       vrrp 255 10.0.0.15/24 10.0.0.2/1
# To:
# [
#   {
#        "ifname": "macvlan_ifname",
#        "hwaddress": "macvlan_hwaddress",
#        "mode": "macvlan_mode",
#        "ips": [str(IPNetwork), ]
#    },
# ]
 r   z%02xr   r   r   Fz00:00:5e:00:01:%sr   r   Tbridge)r`   rn   r   r   r   idz00:00:5e:00:02:%sr   r   r+  z2%s: vrrp: failure while removing unused macvlan(s)N)rY   	enumerater   r   	ipnetwork	IPNetworkr   r   rb   r   r   r|   r^   r   r   r   setr   r   r   rM   addr9   removeKeyErrorr2   rv   )r:   rQ   r!  ifqueryr`   user_config_listindexr   vrrp_idip_addrshex_idip4ip6ip_addrip_network_objis_ip6macvlan_ip4_ifnamemacvlan_ip6_ifnamemerged_with_existing_objmacvlan_ip4_macmacvlan_ip4_mac_intobjmacvlan_ip6_macmacvlan_ip6_mac_intold_vrr_idsold_ifaceobj
vrr_configid_to_removerx   s                                r?   r   0addressvirtual.translate_vrr_user_config_to_listT  s   , &'<"=ME &S! 4Gc'l*FCC#>>+!*!4!4W!='//14JJ~.JJ~. , ,0+?+?+Lg!V+/+?+?+Lg!Vg+0("5">&+&:&:?&K# ,Cww/3FFE
c)
370 ,
 0 %++"4%4)< ("%-   ::))*<==LL))*<=g+0("5">&+&:&:?&K# ,Cww/3FFE
c)
370 ,
 0 %++"4%4)< ("%-  0 S ::))*<==LL))*<=_ >b %Ka$0$A$A$O$OPV$W$][]$]L&2&A&A&&I&OR&O
%'OOJ,<,<,>q,AB 'P %^ "2!'..vd|< #3 )47;7K7KFTW7XZf-g*7;7K7KFTW7XZf-g*::112DEE LL112DE::112DEE LL112DE )4  1  ) %$%  ( ! !  a!!"VY_"_``ash   AP "O=P O1&BP <P 
O.)P -O..P 1
O?;P >O??P 
P5P00P5c                    / nU(       d  U$ U R                  U5      n[        U5       H  u  pVUR                  5       nUS   nU(       a  UR                  5       nU R	                  X5      (       d  MI  SXE4-  SS.n	US:w  a  XS'   [
        R                  " U5      U	S'   / n
USS	  H(  nU
R                  [        R                  " U5      5        M*     XS
'   UR                  U	5        M     U$ )z
# Translate:
#       address-virtual 00:11:22:33:44:01 2001:0db8::0370:7334/64 11.0.1.1/24 11.0.1.2/24
# To:
# [
#   {
#        "ifname": "macvlan_ifname",
#        "hwaddress": "macvlan_hwaddress",
#        "ips": [str(IPNetwork), ]
#    },
# ]
r   r   private)r`   r   r   rn   r   r   Nr   )
r[   r,  r   r   r   r   r   r   r-  r.  )r:   rQ   r   r4  r   r5  addr_virtualr   r   r   ip_network_obj_listr   s               r?   r  8addressvirtual.translate_addrvirtual_user_config_to_list  s     ###11(;#,-A#BE#))+H1+Ciik))(88 !N#::!F
 f}&){#*/*>*>s*C'"$qrl#**9+>+>r+BC # 05M##F+/ $C2  rG   c                     U R                  UUR                  S5      5        / nU R                  UR                  S5      U R                  UR                  S5      4 H  n[        R                  " SU-  5       H  n[
        R                  R                  U5      nU R                  R                  U5      (       d  MD  UR                  U R                  R                  U5      5        U R                  R                  U5        M     M     [        U5      (       a  U R                  X5        g g ! [          a8  nSS KnUR%                  5         U R'                  [)        U5      5         S nAg S nAff = f)Nr   r   r   r   r   )r   rM   rb   rY   r   r   r   r   r^   r   r   r   r   r   r   ry   r9   	traceback	print_exclog_warnrw   )r:   rQ   r   rn   
vrr_prefixr   rx   rQ  s           r?   _downaddressvirtual._down  s/   	"''!001BCE I#33HMM3GI]I]^f^k^kmpIqr
)-3G*3T)U%(*(8(89J(K%::112CDD $$TZZ%@%@AR%STLL))*;< *V s 9~~228G  	"!MM#a&!!	"s   D)D- -
E/7.E**E/c                 j   U R                   R                  UR                  5      (       d  g UR                  S5      nU(       a)  U[        R
                  ;  a  UR                  SUS5        S nUR                  S5      nU R                  UUSUUU R                  UU5      S9nUR                  S5      nU R                  UUSUUU R                  UUSS9S9nXW-   nU(       aS  [        R                  " U5      n	U H#  n
U	(       + U
:w  d  M  UR                  SUS5          g    UR                  SUS5        g g )	Nr   r   r   )virtual_addr_list_rawmacvlan_config_listr   T)r3  r   )r^   r   rY   r   r   _string_valuesupdate_config_with_statusrM   query_check_macvlan_configr  r   r)   )r:   rQ   ifaceobjcurr%user_config_address_virtual_ipv6_addrr   "macvlans_running_ipv6_addr_virtualr!  macvlans_running_ipv6_addr_vrrmacvlans_running_ipv6_addrbool_user_ipv6_addrgenrunning_ipv6_addrgens              r?   _query_checkaddressvirtual._query_check'  sv   zz%%hmm44080M0MNl0m-05Zbgbvbv5v223QSxz{|481'667HI-1-L-L1"6 $ N N$! .M 
.
* #11&9)-)H)H1"1 $ F F !G ! *I *
& &H%h"0%*%B%BCh%i"(B$..3GG ::;Y  \A  CD  E )C 223QSxz{| 1rG   c                     / n/ nU=(       d    /  H7  nUR                   S:X  a  UR                  U5        M&  UR                  U5        M9     / nU =(       d    /  H  nUR                  U5        M     XRU-   :H  $ )Nr   )r   r   )running_addrs
user_addrsr9  r:  r   running_ipobjs         r?   $compare_user_config_vs_running_state3addressvirtual.compare_user_config_vs_running_stateW  su    ""BzzQ

2

2	 # %2%B  $ & s++rG   c                    US:H  n/ nU(       d  U$ [        U5      n	U	(       Ga  Sn
SnU	R                  5       nU(       a  Un
U	R                  5       nUR                  S5      nU R                  R	                  U5      (       d  UR                  USS5        M{  UR                  S5      nUR                  S5      nU(       a*  UR                  U R                  R                  U5      5        U R                  R                  U5      =nnU R                  R                  UU/SS	9=nnU(       d  UR                  S
5      nU(       d  UR                  USS5        GM>   [        R                  " U5      U:X  aQ  U R                  UU5      (       a:  U R                  X5      (       a$  UR                  USR                  U5      S5        GOU(       a  U< SSR                  U5      < 3nOUnUR                  UUS5        GOSnU
R                  S
5      (       a  UU
R                  S5      :X  GaW  UR                  S5      nUR                  S5      nUR                  S
5      (       a.  U R                  R'                  U5      UR                  S5      :X  a  U R                  UU
R                  S
5      5      (       a  U R                  UU5      (       a  U R                  R                  UU/SS	9nU R                  UUR                  S
5      5      (       ar  U R                  UU5      (       a[  UR                  UU
R                  S5      < SSR                  U
R                  S
5      UR                  S
5      -   5      < 3S5        SnU(       dY  UR                  UU
R                  S5      < SSR                  U
R                  S
5      UR                  S
5      -   5      < 3S5        U	(       a  GM  U$ ! [         af  nU R                   R#                  S[%        U5      -  5        U(       a  U< SSR                  U5      < 3nOUnUR                  UUS5         SnANwSnAff = f)z
macvlan_config_list = [
    {
        "ifname": "macvlan_ifname",
        "hwaddress": "macvlan_hwaddress",
        "ips": [str(IPNetwork), ]
    },
]
r   Nr`   r$   r   rn   r   Tr`   ifaceobj_listwith_address_virtualr   r)  r   zaddressvirtual: %sFr+  )r   popleftr|   r^   r   r[  r   get_link_ipv6_addrgen_moder   get_managed_ip_addressesr   r   rj  r   joinr9   r2   rv   rw   get_link_address_raw)r:   rQ   r]  	attr_namer^  rX  rY  is_vrrra  macvlan_config_queue
ip4_config
ip6_configr   r   macvlan_hwaddressmacvlan_hwaddress_int
rhwaddressip4_macvlan_hwaddressraddrsip4_running_addrsr   address_virtual_valuerx   okip6_macvlan_ifnameip6_macvlan_hwaddressip6_running_addrss                              r?   r\  )addressvirtual.query_check_macvlan_configh  s    f$%'"$--$%89"JJ)113F#
199;
 &

8 4::))*;<<66y"aH &

; 7$*JJ$?!4*11$**2W2WXi2jk 261L1LM^1__J.)-)L)L('j%) *M * F& jj'! ::9b!L`++J7;PP $ I I&RU V V $ ? ? \ \$>>%HH%:; "?I388TZK[4\14>1$>>yJ_abc !~~e,,0EXcId0d)3)A&,6NN;,G) &>>%00DJJ4S4STf4gkukyky  {J  lK  5K  DD 1 *u 5  #==hH]^^04

0S0S'9/7j59 1T 1-  $HH$5$.NN5$9    #'"A"A(La"b"b , F F$-/9~~d/CSXXjnn]bNcfpftftuzf{N{E|$}$%!"
 &* ::!#->>$#7*..QVBWZdZhZhinZoBo9pqC #"N *)e ! `KK%%&:SV&CD;EsxxPVGW0X-0:- ::9F[]^__`s    A)O. 5O. .
Q8AQQc                 j   U R                  U5      n[        R                  " SU-  5      n/ nU GH.  n[        R                  R	                  U5      nU R
                  R                  U5      nU R
                  R                  UR                  U" UR                  5      =(       d    / SS9n	[        [        U	5      5      n	U	(       d*  U R                  R                  SUR                  -  5        / n	UR                  SU< SSR                  U	 V
s/ s H  n
[        U
5      PM     sn
5      < 35        UR!                  XpR
                  R#                  U5      45        GM1     [%        U5      nU(       d  g US   S   nU H  u  pX:w  d  M    g    UR                  S	U(       a  S
5        g S5        g s  sn
f )Nr   Trm  z%s: no running addressesr   r)  r   r   r   r   r   )r[   r   r   r   r   r^   r   rr  rY   listr/  r2   r   update_configrs  rw   r   rq  r   )r:   ifaceobjrunningr   r   address_virtualsmacvlans_ipv6_addrgen_listr   r   r|  raddressamacvlan_countr   r  macvlan_ipv6_addrgens                  r?   _query_runningaddressvirtual._query_running  s   11/B99%9>%IJ%'""B " 0 0 4445FGJzz::&++./C/CDJ%) ; H CM*H##$>"1"6"6%7 8))*;zSVS[S[mu\vmuhi]`ab]cmu\vSw=xy&--/@**BgBghyBz.{|% #( ,-1!4Q74N0N#3  5O 	%%&D|efaef ]ws   F0)updownquery-checkcurrzquery-runningc                 H    [        U R                  R                  5       5      $ )z-returns list of ops supported by this module )r  _run_opskeys)r:   s    r?   get_opsaddressvirtual.get_ops  s    DMM&&())rG   c                     UR                   [        R                  :X  a  gU R                  R	                  U5      nU(       d  gUS:X  a
  U" XU5        gU" XUS9  g)a  run vlan 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  )r   )type	ifaceTypeBRIDGE_VLANr  r|   )r:   rQ   	operationquery_ifaceobjr   
extra_args
op_handlers          r?   runaddressvirtual.run  sQ    " ==I111]]&&y1
))t~6t8HIrG   )r(   r/   r   rB   )F)NN)(r.   
__module____qualname____firstlineno____doc___modinforI   r0   r'   classmethodrE   rJ   rS   r[   rb   rq   ry   r   r   r   r   r   r   r   r   r   r  r&  r   r  rU  rd  staticmethodrj  r\  r  r  r  r  __static_attributes__ rG   r?   r
   r
   .   s_   BX <"7:WX	  ?"E]56	- '"A*!
H< ?6 ' ' % %P=G
+("-^(2D,@*
;,zUn2AhK Z- ^"..}` , , y*v#gL ''	H*
 7;!JrG   r
   )(r   r   r   r4   collectionsr   ifupdown2.lib.addonr   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.nlmanager.nlpacketr   #ifupdown2.ifupdownaddons.modulebaser   ifupdown2.nlmanager.ipnetwork	nlmanagerr-  ifupdown2.ifupdown.statemanagerifupdownr    ifupdown2.ifupdown.policymanagerr*    ifupdown2.ifupdown.ifupdownflagsr   !ifupdown2.ifupdown.ifupdownconfigr   ImportErrorModuleNotFoundError	lib.addonifupdown.ifaceifupdown.utilsnlmanager.nlpacketifupdownaddons.modulebasenlmanager.ipnetworkifupdown.statemanagerifupdown.policymanagerifupdown.ifupdownflagsifupdown.ifupdownconfigr
   r  rG   r?   <module>r     s    
    5)*.1>55::<<<<>>$@JUJ @J# 	() 5 $'4+02245s   A
A/ /AB54B5