
    /I_                     6   S SK r  S SKJr  S SK7  S SKJr  S SKJs  Jr  S SK	Js  J
r
  S SKJr  S SKJr  S SKJr  S SKJr   " S	 S
5      r " S S\\5      rg! \\4 a8    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   NVf = f)    N)Addon)*)utils)
moduleBase)mstpctlutil)systemUtils)moduleNotSupportedc                       \ rS rSrSrSrg)mstpctlFlags%       N)__name__
__module____qualname____firstlineno__PORT_PROCESSED__static_attributes__r       &/usr/share/ifupdown2/addons/mstpctl.pyr   r   %   s    Nr   r   c                   p   \ rS rSrSrS0 SSSSSS._S	S
/ SQ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+SS /S!S,SS-/S$._S.S/SS /S0S1SS2/S$._S3S4S5/S5SS6S7/S8._S9S:S;/SS</SS=SS>S?/S@._SASBSCSDSE/SSFSG/SH._SISJSSKSL/SSMSN/SH._SOSPSSQSL/SSRSS/SH._STSUSSVSL/SSWSX/SH._SYSZS[S\/SS]/S^SS_S`/Sa._SbScSS /SdSSeSf/S._SgShSL/SSiSSjSk/Sl._SmSL/SSnSSoSp/Sl.SqSL/SrSsSStSu/Sl.SvSSwSx.SySL/SzSSS{S|/S}.S~.ES.r\" / SQ5      rSSSSSSSS^SSSS.rS r	S r
S rSS jrS rS rS rSS jrS rS rS r    SS jrS r SS jrS rSS jrSS jrSS jrS r SS jr SS jrS rSS jrS r S r!S r"S r#SS jr$SS jr%\\\\#\%S.r&S r'S r(  SS jr)Sr*g)mstpctl(   z4ifupdown2 addon module to configure mstp attributes z%mstp configuration module for bridgesmstpctl-portsz
mstp portsTbridge-ports)helpcompat
deprecatednew-attributemstpctl-stpzbridge stp yes/no)yesnoonoffr"   
bridge-stp)r   	validvalsr   defaultr   r   mstpctl-treeprioztree priority32768)0409681921228816384204802457628672r)   36864409604505649152532485734461440Fzmstpctl-treeprio 32768)r   r'   r&   requiredexamplemstpctl-ageingzageing timer*   r+   300
ageingTimezmstpctl-ageing 300)r   
validranger'   r9   jsonAttrr:   mstpctl-maxagezmax message age25520bridgeMaxAgezmstpctl-maxage 20)r   r>   r'   r?   r9   r:   mstpctl-fdelayzset forwarding delay15bridgeFwdDelayzmstpctl-fdelay 15mstpctl-maxhopszbridge max hopsmaxHopszmstpctl-maxhops 15mstpctl-txholdcountzbridge transmit holdcount6txHoldCounterzmstpctl-txholdcount 6mstpctl-forceverszbridge force stp versionrstpforceProtocolVersionzmstpctl-forcevers rstp)r   r&   r'   r9   r?   r:   mstpctl-portpathcostzbridge port path costz<interface-range-list>65535adminExtPortCostz4under the bridge: mstpctl-portpathcost swp1=0 swp2=1z4under the port (recommended): mstpctl-portpathcost 0)r   r&   r>   r'   r?   r9   r:   mstpctl-portp2pzbridge port p2p detection modeautoadminPointToPointz<interface-yes-no-auto-list>z2under the bridge: mstpctl-portp2p swp1=yes swp2=noz1under the port (recommended): mstpctl-portp2p yes)r   r'   r?   r&   r9   r:   mstpctl-portrestrrolez9enable/disable port ability to take root role of the portrestrictedRolez<interface-yes-no-list>z8under the bridge: mstpctl-portrestrrole swp1=yes swp2=noz7under the port (recommended): mstpctl-portrestrrole yesmstpctl-portrestrtcnzZenable/disable port ability to propagate received topology change notification of the portrestrictedTcnz7under the bridge: mstpctl-portrestrtcn swp1=yes swp2=noz6under the port (recommended): mstpctl-portrestrtcn yesmstpctl-bpduguardzenable/disable bpduguardbpduGuardPortz4under the bridge: mstpctl-bpduguard swp1=yes swp2=noz3under the port (recommended): mstpctl-bpduguard yesmstpctl-treeportpriozuSets the <port>'s priority MSTI instance. The priority value must be a number between 0 and 240 and a multiple of 16.128z%<interface-range-list-multiple-of-16>240treeportprioz8under the bridge: mstpctl-treeportprio swp1=128 swp2=128z6under the port (recommended): mstpctl-treeportprio 128)r   r'   r&   r>   r?   r9   r:   mstpctl-hellozset hello time2	helloTimezmstpctl-hello 2mstpctl-portnetworkz5enable/disable bridge assurance capability for a portnetworkPortz6under the bridge: mstpctl-portnetwork swp1=yes swp2=noz5under the port (recommended): mstpctl-portnetwork yes)r   r&   r'   r?   r9   r:   z-enable/disable initial edge state of the portadminEdgePortz8under the bridge: mstpctl-portadminedge swp1=yes swp2=noz7under the port (recommended): mstpctl-portadminedge yesz=enable/disable auto transition to/from edge state of the portr!   autoEdgePortz7under the bridge: mstpctl-portautoedge swp1=yes swp2=noz6under the port (recommended): mstpctl-portautoedge yeszport tree costextPortCost)r   r9   r?   z_enable/disable bpdu filter on a port. syntax varies when defined under a bridge vs under a portbpduFilterPortz6under a bridge: mstpctl-portbpdufilter swp1=no swp2=noz(under a port: mstpctl-portbpdufilter yes)r   r&   r?   r'   r9   r:   )mstpctl-portadminedgemstpctl-portautoedgemstpctl-treeportcostmstpctl-portbpdufilter)mhelpattrs))r(   treeprio)r;   ageing)rD   fdelay)r@   maxage)rG   maxhops)rI   txholdcount)rL   	forcevers)r_   helloportpathcostportadminedgeportautoedgeportp2pportrestrroleportrestrtcn	bpduguardtreeportcostportnetworkportbpdufilter)rO   rh   ri   rR   rU   rW   rY   r[   rj   rb   rk   c                 ~   [         R                  " U 5        [        R                  " U /UQ70 UD6  [        R                  R                  S5      (       d  [        S5      eU R                  R                  U l	        S U l
        [        R                  " S5      (       a  SOSU l        [        R                  " [         R"                  R%                  U R                  R                  SS95      =(       dF    [        R                  " [         R"                  R%                  U R                  R                  SS95      U l        g )	Nz/sbin/mstpctlz*module init failed: no /sbin/mstpctl foundmstpdTFz$mstpctl-vxlan-always-set-bpdu-params)module_nameattrz&mstpctl-set-default-vxlan-bridge-attrs)r   __init__r   ospathexistsr	   	__class__r   name
mstpctlcmdr   is_process_runningmstpd_runningr   get_boolean_from_stringpolicymanagerpolicymanager_apiget_module_globals$set_default_mstp_vxlan_bridge_config)selfargskargss      r   r   mstpctl.__init__  s    tD14151ww~~o..$%QRRNN++	&1&D&DW&M&Md"' 	. 5:4Q4Q++>> NN33; ? 5
 
5

 **++>> NN33= ? 
 	1r   c                     U R                  U5      (       aa  UR                  [        R                  -  (       a?  UR	                  S5      (       a)  U R
                  R                  SUR                  -  5        gg)Nrh   zS%s: unsupported use of keyword 'mstpctl-portadminedge' when bridge-vlan-aware is onFT)
_is_bridgelink_privflagsifaceLinkPrivFlagsBRIDGE_VLAN_AWAREget_attr_value_firstloggererrorr   )r   ifaceobjifaceobj_getfuncs      r   syntax_checkmstpctl.syntax_checkC  se    ??8$$''*<*N*NN 556MNN!! #< %-MM#2 3 r   c                     UR                   [        R                  -  =(       d)    UR                  S5      =(       d    UR                  S5      $ )Nr   r   )	link_kindifaceLinkKindBRIDGEr   r   r   s     r   r   mstpctl._is_bridgeN  sD    !!M$8$88 @//@@//?	@r   Nc                     U R                  U5      (       d  g U R                  UR                  UR                  S5      U5      $ Nr   )r   parse_port_listr   r   )r   r   ifacenames_alls      r   get_dependent_ifacenames mstpctl.get_dependent_ifacenamesS  sC    x((##HMM$,$A$A$3%56DF 	Fr   c                    U R                  5         U R                  R                  UR                  5      (       a+  U R                  R                  UR                  5      (       d  g U R                  R                  UR                  5      $ N)_init_command_handlerscachebridge_existsr   r   mstpbridge_exists
get_slavesr   s     r    get_dependent_ifacenames_running(mstpctl.get_dependent_ifacenames_runningZ  s\    ##%JJ$$X]]33OO55hmmDDzz$$X]]33r   c                 `    U R                  US5      nU R                  R                  UUU5      $ )Nr?   )get_mod_subattrr   get_bridge_port_attr)r   
bridgenameportnamer   	json_attrs        r   _get_bridge_port_attr_value#mstpctl._get_bridge_port_attr_valuea  s3    ((z:	33J4<4=? 	?r   c                     UR                   nU(       a  U$ UR                  S5      nU(       a  U R                  UR                  U5      $ g r   )lowerifacesr   r   r   )r   r   	port_listportss       r   _get_bridge_port_listmstpctl._get_bridge_port_listg  sE    
 ((	--o>''u==r   c                     U H  n U R                  SU-  S-   U5        M     g ! [         a/  nU R                  R                  [	        U5      5         S nAMU  S nAff = f)Nz/proc/sys/net/ipv6/conf/%sz/disable_ipv6)
write_file	Exceptionr   infostr)r   r   enablepes        r   _ports_enable_disable_ipv6"mstpctl._ports_enable_disable_ipv6u  s[    A <a ? /!0179     Q(s   $
A$AAc                 ~   U R                  U5      n/ n[        R                  R                  (       da  U R                  R                  UR                  5      nU(       a3  U H,  nU(       a  XB;  d  M  U R                  R                  U5        M.     O/ nU(       d  g Sn[        U5      R                  [        U5      5       H  n [        R                  R                  (       dJ  U R                  R                  U5      (       d*  U R                  UR                  < SU< S35        US-  nMm  U R                  R                  XaR                  5        U R                  R                  U5        M     U(       a  U R#                  S5        g g ! [          a&  nU R#                  [%        U5      U5         S nAM  S nAff = f)Nr   z: bridge port z does not existr   z(error configuring bridge (missing ports))r   ifupdownflagsflagsPERFMODEr   r   r   netlinklink_set_nomasterset
differenceDRYRUNlink_existslog_warnlink_set_master
addr_flushr   	log_errorr   )r   r   bridgeportsrunningbridgeportsbporterr
bridgeportr   s           r   
_add_portsmstpctl._add_ports~  sP   00:""++!%!6!6x}}!E!/E&%*B66u= 0 &("k*55c:L6MNJ
1%++22

..z::MM&mmZ#9 :1HC,,ZG''
3 O NNEF   1s1vx001s    A'F.A F
F<F77F<c                  
   [         R                  R                  (       a  SOSn [        U R                  R                  5       5       GH  u  pEUR                  U5      n[        R                  R                  U R                  R                  UR                  US9nU(       d  U R                  US5      nU R                  US5      n U R                  R                  UR                  U5      n	U(       d  U(       a  X:w  a  UnO	U(       d  M   US:X  a(  U R                  R'                  UR                  Xc5        M  U R                  R)                  UR                  XVU5        GM     U R.                  R1                  UR                  5      (       a  g U R3                  U5      nU(       d  g [        U R4                  R                  5       5       GH  u  pEUR                  U5      nU R                  US5      nU(       d   U R                  US5      nU(       a  U(       a  U H  nU R.                  R7                  U5      (       d  M%  U" U5      nU(       aC  U R9                  XMS
   U5      nU=(       d    /  H  nUR                  U5      nU(       d  M  Un  O   U R                  R;                  UR                  UUUUS9  M     M  U R?                  UR                  U5      nU(       d+  U RA                  UR                  < SU< SU< S3U5        GME  U Hz  n URC                  S5      u  nn[D        RF                  RI                  SU-  5      (       d  MA  U R                  US5      nU R                  R;                  UR                  UUUUS9  M|     GM     g ! [          a3    U R"                  R%                  UR                  < SU< S35        S n	 GNf = f! [          a3  n
U R"                  R+                  S	[-        U
5      -  5         S n
A
GM  S n
A
ff = f! [          a_  n
U R"                  R=                  S	[-        U
5      -  5        U R"                  R%                  UR                  < SU< S35         S n
A
GNS n
A
ff = f! [          a<  n
U RA                  UR                  < SU< S[-        U
5      < S3USS9   S n
A
GM  S n
A
ff = f! [          a$  n
U RK                  [-        U
5      5         S n
A
g S n
A
ff = f)NFTr   ifnamer   r'   r?   : could not get running  valuer(   %sr   r   z: not resetting z configz: error parsing ' '=/sys/class/net/%s/brport: error setting  ()raise_error)&r   r   r   list
_attrs_mapitemsr   r   r   get_iface_defaultr   r   r   r   r   get_bridge_attrr   r   r   set_bridge_treeprioset_bridge_attrwarningr   r   bridge_is_vlan_awarer   _port_attrs_maplink_is_bridge_port_get_default_valset_bridge_port_attrdebugr   r   splitr   r   r   r   )r   r   r   checkattrnamedstattrname
config_valdefault_valr?   running_valr   r   portbport_ifaceobjsbrport_ifaceobj
attr_valueportlistr   valr   s                       r   _apply_bridge_settingsmstpctl._apply_bridge_settings  s^   &,,554b	)-doo.C.C.E)F%%::8D
+==OO\`\j\j\s\s  }E  }J  }J  QYO  Z""&"6"6x"KK//*E'"&//"A"A$,MM8#=K #{8R "-J#	#55::8== *3 66x}} +@3 *G> zz..x}}==44X>K)-d.B.B.H.H.J)K%%::8D
"228IF!E$($8$8:$N&8(3'+zz'E'Ed'K'K$,2B42H#2262G2GbcRdfn2oK;J;Pb;P5D5Y5YZb5c
+5::DK,1	 <Q !% D DX]]EIEPEPOW	 !E !Y )4. //zJNN#==(J$@AIK "AD&'ggcls!ww~~.H$.NOO$$($8$8:$N	<<X]]=A=H=@GP	 = R "S *L9 ! 'KK$$'/}}h&@ A"&K'$ ! KK''c!f5J % E))$Q-8((+3==(*D E EE4 % D)1#a&(J'/U ' D DD  	MM#a&!	s   B"S &N.S ,O:S <'O#/S S ,AS  BP1PAS ;RS 9R	S 9OS OS 
P$'PS PS 
R$AQ>8S >RS 
S0S S SS 
S=S88S=c                 .   U R                   (       Ga  UR                  [        R                  -  (       a  US;   a   UR	                  U5      nU(       a  UR                  UR                  5        Vs/ s H  ofR                  S5      S   PM     sn;  a  gUR                  5        Vs/ s H  ofR                  S5      S   PM     snR                  UR                  5      nUR                  5        Vs/ s H  ofR                  S5      S   PM     snU   $ g[        R                  R                  U R                  R                  UR                  US9nU(       d  U R                  US5      $ U$ ! [
         a  nS n S nAGN3S nAff = fs  snf s  snf s  snf )Nrk   rY   rh   r   r   r!   r   r   r'   )r   r   r   VXLANr   r   r   r  indexr   r   r   r   r   r   )	r   r   r   bridgeifaceobjr  r   vr  r  s	            r   r   mstpctl._get_default_val  so   555""]%8%88  "+@@F
 ==*BRBRBT(UBTQaBT(UU 6@6F6F6HI6HWWS\!_6HIOOPXP]P]^E5?5E5E5GH5GGGCLO5GHOO'99KKX\XfXfXoXo  yA  yF  yF  MQK  RK++D;;  "!
" )V JHs)   E. 1F'F2F.
F8F  Fc                    [         R                  R                  (       a  SOSnSnU(       d  U(       a  UR                  nU(       d0  U R                  R                  SUR                  -  SU-  -   5        U$ U(       a8  [        R                  R                  SUR                  -  5      (       a  U(       d  U(       d  U R                  (       a  UR                  [        R                  -  (       ab  S H\  n	U R                  U	S5      n
U R                  XU5      n U R                  R!                  UUR                  U R"                  U	   UU
S9  M^     U(       d  U R+                  SUUUU5      nU$ U R+                  [-        U R"                  R/                  5       5      UUUU5      $ ! [$         a;  nU R'                  UR                  < S	U	< S
[)        U5      < S35         S nAM  S nAff = f)NFTz%s: ignoring configz! (stp on bridge %s is not on yet)r   r  r?   r   r   r   r   ))rU   rz   )ri   rx   )r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   +_apply_bridge_port_settings_attributes_listr   r   )r   r   bvlan_awarer   r  stp_running_onr   r  appliedr   r   r  r   s                r   _apply_bridge_port_settings#mstpctl._apply_bridge_port_settings  s    ',,554n',,JKK2'}}.@*LM N N98==HII#==''-*=*==!
 %)$8$8z$J	%)%:%:4;I&K
K OO@@AIAEAUAUVZA[AKKT	 A V!$ # #NN !&"	G ??%%++-.
 	
'  ) K MM-5]]D#a&+J K KKs   4F&&
G+00G&&G+c                 ~   U H  u  pgUR                  U5      nU R                  XbU5      n	U R                  US5      n
 U R                  R	                  UUR
                  U
5      nU(       d  U	(       a  X:w  a  U	nO	U(       d  M   U R                  R                  UUR
                  XxU
S9  SnM     U$ ! [         a6    U R                  R                  U< SUR
                  < SU< S35        S n Nf = f! [         a<  nU R                  UR
                  < SU< S[        U5      < S	3US
S9   S nAGM4  S nAff = f)Nr?   r   r   r   r   Tr   r   r   Fr   )r   r   r   r   r   r   r   r   r   r   r   r   )r   attributes_listr   r  r   r  r  r  r  r  r?   r  r   s                r   r  3mstpctl._apply_bridge_port_settings_attributes_list]  s3   %4!H!66x@J//NSK,,XzBH#"ooBB:7?}}hP ;K4N )
233J#==+X 4 Ww1 &5: )  #  #-x}}h"H I"#   2~~ (xQABJ+0  2 22s)   'B3(C63=C32C36
D< 0D77D<c                    U R                   R                  SUR                  -  S-   5        U R                  R	                  UR                  5      nU(       d)  U R                   R                  SUR                  -  5        g U R                  R                  UR                  5      nU H  nU R                   R                  UR                  < SU< 35        U R                  R                  U5      (       d  MQ  [        R                  R                  SU-  5      (       d  Mz  U" U5      nU(       d  M  U H_  nUR                  R                  U R                  S5      [        R                  -  (       a  MA   U R                  XtUR                  U5        Ma     M     g ! [          a&  n U R#                  [%        U5      5         S nAM  S nAff = f)Nz %s: applying mstp configuration zspecific to portsz%s: cannot find bridgeportsz": processing mstp config for port r   r   )r   r   r   r   r   r  r   r   r   r   r   module_flagsgetr   r   r  r   r   r   )	r   r   r   r   r  r   bportifaceobjlistbportifaceobjr   s	            r   _apply_bridge_port_settings_all'mstpctl._apply_bridge_port_settings_all}  sk   ;#==)+>? 	@ jj++HMM:;;:HMMIJjj55hmmD EKK'}}e5 6::))%0077>>"<e"CDD 0 7$!2!..22499SA //0*44],4MM8E "3 !$ ! *MM#a&))*s   7F
G'GGc                 \    SU-  nU(       d  gU R                  U5      nU(       a  US:X  a  gg)Nz"/sys/class/net/%s/bridge/stp_stateFr`   T)read_file_oneline)r   r   stp_state_filerunning_stp_states       r   "_is_running_userspace_stp_state_on*mstpctl._is_running_userspace_stp_state_on  s4    =zI 22>B!2c!9r   c                    UR                   [        R                  -  (       a  U R                  R	                  UR
                  5      nU(       d  g U R                  R                  U5      nU R                  n[        U R                  R                  U5      5      nU R                  XUS UU5      nU(       aN  UR                  R                  U R
                  S5      [        R                  -  UR                  U R
                  '   g U R                  U5      (       d  g S n Sn	Sn
UR!                  S5      (       a  U R                  R#                  UR
                  5      (       d%  U R$                  R'                  UR
                  5         U R)                  U5        U R                  R/                  UR
                  5      nU(       a  U R1                  US5        UR!                  S5      nU(       a(  U R3                  USU R4                  R6                  5        OUR!                  S5      nU(       d&  U R                  R                  UR
                  5      nO[8        R:                  " U5      nU R                  (       a\  U(       aU  U R<                  R?                  5         U RA                  X5        U RC                  UUS	9  U R<                  RE                  5         W	(       a  [+        W
5      eg ! [*         a  nSn	[-        U5      n
 S nAGNoS nAff = f! [*         a%  nU RG                  [-        U5      U5         S nANbS nAff = f)
Nr   F r   T1r    r%   r   )$r   r   BRIDGE_PORTr   
get_masterr   r   r   boolget_bridge_stpr  r#  
setdefaultr   r   r   r   r   r   link_add_bridger   r   r   r   r   set_iface_attriproute2bridge_set_stpr   r   r   batch_startr  r'  batch_commitr   )r   r   r   r   r  r   r  r  stpporterr
porterrstrr   running_portss                r   _upmstpctl._up  s    ""%7%C%CC..x}}=J**99*EK ..M!$**";";J"GHN66xj7;^7DFG  --881E$334 %%dii0 **(	-GJ,,_== zz--hmm<<LL00?OOH- !%

 5 5hmm D 33M3G//>C""8]#'==#?#?A 33LAjj//>33C8!!c++-++HG44X-= 5 ?,,. J'' = ! "G!$QJ8  	-NN3q68,,	-sD    A)L 
K- D?L -
L7L
L 
LL 
ML<<Mc                    U R                  U5      (       d  g  UR                  S5      (       ad  U R                  R                  UR                  5      nU(       a  U R                  US5        U R                  R                  UR                  5        g g ! [         a%  nU R                  [        U5      U5         S nAg S nAff = f)Nr   r*   )r   r   r   r   r   r   r   link_delr   r   r   )r   r   r   r   r   s        r   _downmstpctl._down  s    x((		-,,_== 

--hmm<33E3?%%hmm4 >  	-NN3q68,,	-s   A9B 
CB>>Cc                    0 nU R                   R                  UR                  5      nU(       d  U$ [        UR	                  5       5       Hg  u  pVUS:X  d  U(       d  M  US:X  a  [        UR                  5       5      nM5  SU-   nU(       d  MC  X`R                  US5      :w  d  MZ  US:w  d  Mb  U/X8'   Mi     U R                  R                  UR                  5      nU(       Ga	  U(       Gd  SSSSSSSSSSSS.n	U H  n
S HD  nU R                  UR                  X5      nU(       d  M(  US	:w  d  M0  X==   S
U
< SU< 3-  ss'   MF     S HS  nU R                  UR                  X5      nU(       d  M(  X`R                  US5      :w  d  M?  X==   S
U
< SU< 3-  ss'   MU     M     UR                  [        U	R	                  5       5       VVs0 s H  u  pVU(       d  M  XV/_M     snn5        U$ s  snnf )Nr>  r   zmstpctl-r'   rG   r0  )ri   rk   rb   rO   rh   rR   rU   rW   rY   r[   rj   )	ri   rk   rb   rh   rR   rU   rW   rY   r0  r"   r   r   )rO   rj   )r   get_bridge_attrsr   r   r   keysr   r   r   r   update)r   ifaceobjrunningbridge_vlan_awarebridgeattrdicttmpbridgeattrdictkr  r   r  
portconfigr   r   s               r   _query_running_attrsmstpctl._query_running_attrs  s    OO<<_=Q=QR !!)//12CAEzG|QVVX!A~Ha//)DD 11,-3( 3 

%%o&:&:;*3557243546.04635023535
7J !D 889M9M9:BAqQ$Y"(1,==(! MD889M9M9:BAqQ"6"6tY"GG"(1,==(	 M! , !!tJ<L<L<N7O #*7Otq'( $+1s77O #* +#*s   G-
G-
c                 h   UR                  S5      =(       d    UR                  S5      =(       dm    [        R                  R                  U R                  R
                  UR                  SS9=(       d)    [        R                  R                  SUR                  SS9n[        R                  " U5      $ )Nr    r%   r   bridge)	r   r   r   r   r   r   r   r   r   )r   r   r>  s      r   _get_config_stpmstpctl._get_config_stp6  s    ,,]; @,,\:@..@@T^^MdMdmumzmz  BO@  P@ ..@@X^f^k^kr~@	 	
 ,,S11r   c                 $   / SQnU R                   R                  UR                  5      (       d)  U R                  R	                  SUR                  -  5        g U R                  UR                  U R                  5       5      nU R                  (       a!  S H  nXe;  d  M
  UR                  U5        M     U(       d  g U R                  R                  UR                  5      nU(       d  0 nU R                  U5      nU R                   R                  UR                  5      n	U R                   R                  UR                  5      n
U GHN  nX;   a  M  US;   Ga   U
(       d  M  U(       a  U	(       d  M+  UR                  U5      n0 n0 nSn0 nSnU(       a@  UR!                  5        H,  nUR!                  S5      S   UUR!                  S5      S   '   M.     U
 GH0  nU" U5      nU(       d  M  U GH  nUU;  aj  UR"                  [$        R&                  -  (       aF  [(        R*                  R,                  (       a"  UR.                  [0        R2                  -  (       a  Mo  SnOMMt  UR"                  [$        R&                  -  (       a$  UR.                  [0        R2                  -  (       a  M  UU   nU R5                  US	5      n U R                  R7                  UR                  UU5      nUU:w  a  SnUR=                  UU05        GM     GM3     [?        URA                  5       5       H  u  nnUUS-   U-   S
-   -  nM     U(       a  URC                  UUU5        GM  UR                  U5      nU(       d  GM-  URE                  USS  5      nUS:X  an  SS/nS/nU RF                  RI                  UR                  5      nUU;   a  UU;   d  UU;   a  UU;   a  URC                  SUS5        OURC                  SUS5        GM  US:X  a  U RK                  U5      nU
(       d
  U(       d  GM  SnU
(       a3  U(       a,  [M        U
5      RO                  [M        U5      5      nU(       d  SnURC                  SU
(       a  S
RQ                  U
5      OSU5        GMG  US S S:X  d  US:X  a  USS  n Sn!Sn"U RS                  UR                  U5      n#U#(       d  GM  U# Ha  n$ U$R!                  S5      u  n%nU RU                  UR                  U%U5      n&U&(       a  U"S
U%< SU&< 3-  n"OU"S
U%< SS< 3-  n"U&U:w  a  Sn!Ma  Mc     URC                  UU"U!5        GM  U(       d  URC                  USS5        GM  UU:w  a  URC                  UUS5        GM;  URC                  UUS5        GMQ     g ! [8         a7    U R                  R;                  UR                  < S
U< SW< S35        S n GNf = f! [8         a&  n'U RW                  [Y        U'5      5         S n'A'GM<  S n'A'ff = f)NrO   r[   rj   zbridge %s does not existr  r   r0  r   r   r!   r?   r   r   r      r    r#   r$   r      zmstpctl-portrY   None)-r   r   r   r   r  dict_key_subsetconfigget_mod_attrsr   appendr   rI  rV  r6  r   r   r  r   r   r  r   r   WITHDEFAULTSr   r   r   r   r   r   r   rK  r   r   update_config_with_statusr$  sysfsbridge_get_stpr   r   symmetric_differencejoinr   r   r   r   )(r   r   ifaceobjcurrr   blacklistedattrs
ifaceattrsr   runningattrs
config_stprunning_stprunning_port_listrP  r  r  r  resultbridge_portsstatebportvalr   r%  r&  confr?   r	  r  rvstp_on_valsstp_off_valsbridge_port_listportliststatusr   mstpctlcmdattrnamestatuscurrstrvlist	vlistitemr   currvr   s(                                           r   _query_check_bridgemstpctl._query_check_bridge>  sm   @zz''66KK8(--GH))(//*.*<*<*>@
44`)%%d+ a 77FL))(3
jj//> JJ11(--@A$\\ )"+11!4
 !$%GGI=E^^C=PQR=S
8>>##6q#9: %. /E(8(?%, ):!3 - 7 7-:M:M M(5(;(;(H(H%-%<%<?Q?c?c%c$,', (!.!8!8=;N;N!N"*"9"9<N<`<`"` (#-e#4D$($8$8J$G/*.//*N*Nx}}^cem*nK
  ;.%&F$++U[,AB/ *;	 /8 "&l&8&8&:!;ID# TCZ#-33E	 "<
  ::1eVL --a0A !!!AB%(BM!  $Um %wZZ..x}}=+%"*;,&2+= ::=!QO ::=!QOO# $(#=#=h#G (1A!"$)9!$%6!7!L!L8;<L8M"OJ%)*66( HH./.0.B 3B>)Q2E-E &'qrU" ,,X]]A>!&I!*!5A $ @ @PQST U #!U';;G#!V'<<G A:%&F & "' 66q'6J66q"a@b66q"a@66q"a@} T  ) / KK,,&.mmUD.B C*.K/V % c!f-s+   ?'VAW=W	W	
X)X

Xc                 ^   UR                   nU(       d  g U GH6  nU" U5      nU GH#  nU R                  U5      (       d  M  U R                  (       d  M/  UR                  [        R
                  -  (       d  MS  U R                  U5      nU R                  R                  UR                  5      n	U(       a  U	(       d  M  S GH  n
U R                  U
S5      nUR                  U
5      nU(       a  UR                  UR                  5        Vs/ s H  oR                  S5      S   PM     sn;  a$  [        R                  R                  (       d  M  SnOUR                  5        Vs/ s H  oR                  S5      S   PM     snR!                  UR                  5      nUR                  5        Vs/ s H  oR                  S5      S   PM     snU   nO$[        R                  R                  (       d  GM5  Sn U R"                  R%                  UR                  UR                  U5      nUR-                  U
UX:X  a  SOS5        GM         g    GM9     g s  snf s  snf s  snf ! [&         a@    U R(                  R+                  UR                  < SUR                  < SU
< S	35        S n Nf = f)
Nr  r?   r   r   r!   r   r   r   r   )upperifacesr   r   r   r   r   rV  r   r6  r   r   r   r  r   r   ra  r  r   r   r   r   r   rb  )r   r   rg  r   mastersrU  bifaceobjlist	bifaceobjrk  rl  r   r?   r  r  r  r  s                   r   _query_check_bridge_vxlan_port&mstpctl._query_check_bridge_vxlan_port  s/   &&F,V4M*	OOI..===--0B0T0TTT%)%9%9)%D
&*jj&?&?	&O *+$%D
 )-(<(<T:(NH)2)G)G)MJ)#+==R\RbRbRd8eRdQaRd8e#e+8+>+>+K+K(016JFPFVFVFX,YFXWWS\!_FX,Y,_,_`h`m`m,nEKUK[K[K]1^K]a''#,q/K]1^_d1eJ'4':':'G'G$,-2
3.2oo.R.RS\SaSa4<MM8/M )BB4(3-8-FAO5%: K + $ 9f
 -Z1^ $- 3 $ 0 0*3..(--2O !P.23s%   I$I
/I
81I""AJ,	+J,	c                    U R                   R                  UR                  5      (       d  [        R                  Ul        g U R                   R                  UR                  5      (       d5  UR                  U[        U R                  R                  5       5      S5        g U R                   R                  UR                  5      n/ SQnU R                  UR                  [        U R                  R                  5       5      5      nU(       d  g U R                  R                  UR                  5      nU(       d  0 nU H  nUR!                  U5      nU(       a  Xt;   a  UR#                  XxS5        M4  U R%                  X1R                  U5      n	U	(       a-  X:w  a  UR#                  XyS5        Mp  UR#                  XyS5        M  UR#                  US S5        M     g )Nr   rY  r   )r   r   r   ifaceStatusNOTFOUNDry  r   &check_n_update_config_with_status_manyr   r   rJ  r4  r]  r^  r   rI  r   rb  r   )
r   r   rg  r   rh  ri  rj  rP  r  r}  s
             r   _query_check_bridge_port mstpctl._query_check_bridge_port  so   zz%%hmm44"-"6"6Lzz--hmm<<?? !5!5!:!:!<=qBZZ**8==9
@))(//*.t/C/C/H/H/J*KM
77FLA --a0A-66qR@44ZPQRE: ::1QG ::1QG66q$B r   c                     U R                  U5      (       a  U R                  XU5        g UR                  [        R                  -  (       a  U R                  XU5        g U R                  X5        g r   )r   r~  r   r   r  r  r  )r   r   rg  r   s       r   _query_checkmstpctl._query_check+  sZ    ??8$$$$X=MN-"5"55//.>@ ))(Ar   c                     U R                  UUR                  U5      nU(       a  U(       a  XT:w  a  UR                  X55        g U(       a  U(       d  UR                  X55        g g g r   )r   r   update_config)r   rL  r   r   	value_cmpr  s         r   _query_bridge_port_attrmstpctl._query_bridge_port_attr4  sS    ,,Z-<-A-A-13 q~))$2y))$2 !Qr   c           	      h   U R                   R                  UR                  5      nU(       d)  U R                  R	                  SUR                  -  5        g U R
                  R                  U5      S:X  a  g U R                  5       S:w  a  g U R                  XSU R                  SS5      5        U R                  XSS5        U R                  XSS5        U R                  XSS5        U R                  XS	S
5        U R                  XSS5        U R                  XSS5        U R                  XSS5        g )Nz"%s: unable to determine bridgenamer"   r1  ri   r'   rk   rb   rh   rR   rS   rU   rW   rY   )
r   r4  r   r   r   rc  rd  $systcl_get_net_bridge_stp_user_spacer  r   )r   rL  r   s      r   _query_running_bridge_port"mstpctl._query_running_bridge_port=  sA   ZZ**?+?+?@
KK D-22!3 4::$$Z0D8446#=$$_%;%)%9%9:PR[%\	^ 	$$_%=%)	+ 	$$_%:%)	+ 	$$_%<%)	+ 	$$_%6%+	- 	$$_%<%)	+ 	$$_%;%)	+ 	$$_%8%)	+r   c                 L   U R                   R                  UR                  5      S:X  a  g U R                  5       S:w  a  g U R                  R                  UR                  5      (       d  g SnUR                  S5      S:X  a  SnUR                  U R                  UU5      5        g )Nr"   r1  Fbridge-vlan-awarer!   T)	rc  rd  r   r  r   r   r   update_config_dictrR  )r   rL  rM  s      r   _query_running_bridgemstpctl._query_running_bridge}  s    ::$$_%9%9:dB446#=001E1EFF!//0CDM $**4+D+D+:+<,> 	?r   c                     U R                   R                  UR                  5      (       a  U R                  U5        g U R                   R	                  UR                  5      (       a  U R                  U5        g g r   )r   r   r   r  r   r  )r   rL  
extra_argss      r   _query_runningmstpctl._query_running  sZ    ::##O$8$899&&7ZZ++O,@,@AA++O< Br   c                    UR                   nU(       d  g U H  nU" U5      S   nU R                  U5      (       d  M&  U R                  (       d  M9  UR                  [        R
                  -  (       d  M]  UR                  [        R                  -  (       d  M  S Ha  nU R                  US5      nUR                  U5      nU(       d  [        R                  R                  (       d  MN  SnUR                  Xh5        Mc       g   g! [         a?  n	U R                   R#                  UR$                  < S['        U	5      < 35         Sn	A	gSn	A	ff = f)a  
Example:
Configuration:
    auto vxlan1wd
    iface vxlan1wd
        vxlan-id 1001

    auto vxlan2wd
    iface vxlan2wd
        vxlan-id 1002

    auto brwithdef2
    iface brwithdef2
        bridge_ports vxlan1wd vxlan2wd
        bridge-vlan-aware yes

Output:
$ ifquery vxlan1wd
    auto vxlan1wd
    iface vxlan1wd
        vxlan-id 1001

$ ifquery --with-defaults vxlan1wd
    auto vxlan1wd
    iface vxlan1wd
        vxlan-id 1001
        mstpctl-portbpdufilter yes
        mstpctl-bpduguard yes
Nr   r  r?   r!   z: )r  r   r   r   r   r   r   r   r  r   r   r   r   ra  replace_configr   r   r   r   r   )
r   r   r   r  rU  r  r   r?   r  r   s
             r   _query_bridge_portmstpctl._query_bridge_port  s   < &&	!,V4Q7	OOI..===--0B0T0TTT **]-@-@@@%>D )-(<(<T:(NH)1)F)Ft)LJ)1D1D1Q1Q ().J$33DE%> ! ""  	KKs1v>?	s5   $D D  D 5 D A(D D 
E5E		Ec           
      l   U R                  U5      (       d  UR                  R                  U R                  S5      [        R
                  -  (       a  gU R                  X5        UR                  R                  U R                  S5      [        R
                  -  UR                  U R                  '   gUR                  nU(       d  gUR                  S5      S:w  a  S H  nSnUR                  U5      nU H|  nU" U5      n	U	 Hk  n
U
R                  S5      (       d  M  U(       aA  XR                  5        Vs/ s H  oR                  S5      S   PM     sn;  a
  US	U-  -  nMa  Mc  US
U-  -  nMm     M~     UR                  XW(       a  UOU5        M     gS GH  nSnUR                  U5      nU GH  nU" U5      n	U	 GH  n
U
R                  R                  U R                  S5      [        R
                  -  (       a  MB  U
R                  S5      (       d  MZ  U(       a  XR                  5        Vs/ s H  oR                  S5      S   PM     sn;  a  U
R                  US5        OUR                  5        Vs/ s H  oR                  S5      S   PM     snR                  U5      nUR                  5        Vs/ s H  oR                  S5      S   PM     snU   nU
R                  USU-  5        UR                  5       nX	 SR                  U5      nOU
R                  US5        U
R                  R                  U R                  S5      [        R
                  -  U
R                  U R                  '   GM     GM     U(       d  GM  UR                  XW5        GM     gs  snf s  snf s  snf s  snf )z6add default policy attributes supported by the module r   Nr  r!   r  r0  zvxlan-idr   z %s=yesz%s=yes r   r   r   )r   r#  r$  r   r   r   r  r7  r   r   r  r  r  r  rf  )r   r   r   kwargs	lowerinfsr   rp  r^  r	  bportobjlistbportobjr  r  s                r   _querymstpctl._query  s   x((%%))$))C8 //0##H? --881E$334 !!$)), ((	(()<=F`!66t<%D#3D#9L$0#88DD%#'/XAQ/X#X$*io$=F $Y !&D 8 %1 & ''fEJ a a!66t<%D#3D#9L$0$1155diiD(778$#88DD%#'/XAQ/X#X$,$:$:4$GFLlln,UnWWS\!_n,U,[,[\`,aEFLlln,UnWWS\!_n,UV[,\E$,$:$:4u$M(.A()-0XXa[F ( 7 7e D ( 5 5 @ @1 M , ; ;!< %11$))<# %1 &, 6++D95 a 0Y" 0Y -V,Us   8N"2N':N,
;N1
)zpre-upz	post-downquery-checkcurrzquery-runningqueryc                 H    [        U R                  R                  5       5      $ )z-returns list of ops supported by this module )r   _run_opsrJ  r   s    r   get_opsmstpctl.get_ops  s    DMM&&())r   c                 F    U R                   (       d  [        5       U l         g g r   )r   r   r  s    r   r   mstpctl._init_command_handlers  s    )mDO r   c                     UR                   [        R                  :X  a  gU R                  R	                  U5      nU(       d  gU R                  5         US:X  a	  U" XUUS9  gU" XUS9  g)a  run mstp 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  r2  )type	ifaceTypeBRIDGE_VLANr  r$  r   )r   r   	operationquery_ifaceobjr   r  
op_handlers          r   runmstpctl.run  sd    " ==I111]]&&y1
##%))t~(8: t8HIr   )r   r   r   r   r   )r1  )NNTT)F)NN)+r   r   r   r   __doc___modinfoOrderedDictr   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r'  r-  rB  rF  rR  rV  r~  r  r  r  r  r  r  r  r  r  r  r  r   r  r   r   r   r   r   r   (   s   @ 9P
$"!/	P
 +7"!-P
 '" "45!P
6 %"Fm !(017P
F )"El*!/0GP
V ."El,!/0WP
f )"El%!01 gP
v "3"El+!34$wP
F  2$Z!!245"GP
V #/67"Gn.!JJ%WP
n 8!/<=!HG
 oP
D $O,78!NM&EP
\ #?+78!ML%]P
v  .+78!JI"wP
N #0 !EF"El*!NL%OP
j ("El!'-.kP
z "O78)!LK
${P
R H78+!NM
& X78 *!ML
% )!)	%F78,!L>'IP
SHn  / 0J 1?+:*8%.+:*8'2*8*8)6,<
>O(
T	@
F4?G@dL6 MQ373726<
|B :> *DB(H-:x2 .2UAp .2,^%CNB31+@?"=5n7:t ''H*, 7;!Jr   r   ) r   ifupdown2.lib.addonr   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr    ifupdown2.ifupdown.ifupdownflagsifupdownr    ifupdown2.ifupdown.policymanagerr   #ifupdown2.ifupdownaddons.modulebaser   $ifupdown2.ifupdownaddons.mstpctlutilr   $ifupdown2.ifupdownaddons.systemutilsr   ifupdown2.ifupdown.exceptionsr	   ImportErrorModuleNotFoundError	lib.addonifupdown.ifaceifupdown.utilsifupdown.ifupdownflagsifupdown.policymanagerifupdownaddons.modulebaseifupdownaddons.mstpctlutilifupdownaddons.systemutilsifupdown.exceptionsr   r   r   r   r   <module>r     s~    
7)*.<<<<>@@@  GJeZ GJ% 	() 7 $2246667s   ;A =BB