
    /I_.                          S SK 7  S SKJr  S SK7  S SK7   " S S\5      rg! \\4 a    S SK7  S SKJr  S SK	7  S SK
7   N+f = f)    )*)utilsc                      \ rS rSrSrSrSrSSSSS	S
SSS.rSSSSSSSSS.rSSSSSSSSSS S!.
r	S" r
S# rS$ rS% rS& rS' r\S( 5       rS) rS* rS+ rS, rS- rS. rS/ rS<S1 jrS2 rS3 rS=S4 jrS=S5 jrS6 rS=S7 jrS<S8 jr S9 r!S: r"S;r#g0)>mstpctlutil   zSThis class contains helper methods to interact with mstpd using
mstputils commands 128Fz	bridge-idzmax-agezforward-delayztx-hold-countzmax-hopszageing-timez
hello-timezforce-protocol-version)bridgeidmaxagefdelaytxholdcountmaxhopsageinghello	forceversbridgeIdmaxAgefwdDelaytxHoldCountermaxHops
ageingTime	helloTimeforceProtocolVersion)treeprior
   r   r   r   r   r   r   zadmin-edge-portzadmin-point-to-pointzrestricted-rolezrestricted-TCNzbpdu-guard-portzauto-edge-portznetwork-portzbpdufilter-portzexternal-port-costzinternal-port-cost)
portadminedgeportp2pportrestrroleportrestrtcn	bpduguardportautoedgeportnetworkportbpdufilterportpathcosttreeportcostc                 T    [         R                  " U /UQ70 UD6  / U l        SU l        g NF)	utilsBase__init___mstpctlutil__batch_mstpctlutil__batch_mode)selfargskargss      2/usr/share/ifupdown2/ifupdownaddons/mstpctlutil.pyr'   mstpctlutil.__init__<   s)    40$0%0!    c                 :    U R                   R                  U5        g N)r(   appendr*   cmds     r-   __add_to_batchmstpctlutil.__add_to_batchB   s    C r/   c                     U R                   (       a  U R                  U5        g [        R                  " [        R                  < SU< 35        g )N )r)   _mstpctlutil__add_to_batchr   exec_commandmstpctl_cmdr3   s     r-   __execute_or_batchmstpctlutil.__execute_or_batchE   s2    $%*;*;SABr/   c                     U R                   (       a  U R                  U5        gU R                  R                  S[        R
                  < SU< 35        g)z
The batch function has it's own dryrun handler so we only handle
dryrun for non-batch mode. Which will be removed once the "utils"
module has it's own dryrun handlers
zDRY-RUN: executing: r8   N)r)   r9   loggerinfor   r;   r3   s     r-   __execute_or_batch_dry_run&mstpctlutil.__execute_or_batch_dry_runK   s8     $KKE<M<MsSTr/   c                 D    U R                   (       d  SU l         / U l        g g )NT)r)   r(   r*   s    r-   batch_startmstpctlutil.batch_startV   s       $DDL !r/   c                 4   U R                   (       a  U R                  (       d  g  [        R                  " S[        R                  -  SR                  U R                  5      S9   SU l         U ?S U l        g ! [         a    e f = f! SU l         U ?S U l        f = f)Nz
%s batch -
)stdinF)r)   r(   r   r:   r;   join	ExceptionrD   s    r-   batch_commitmstpctlutil.batch_commit[   s      
	 u000ii- !&DDL  		 !&DDLs   ?A6 6BB Bc                     SU l         g r%   )_cache_fill_done)clss    r-   resetmstpctlutil.resetn   s
    $r/   c                 t     [         R                  " S[         R                  -  5        g! [         a     gf = f)Nz%s mstpdTF)r   r:   	pidof_cmdrK   rD   s    r-   is_mstpd_runningmstpctlutil.is_mstpd_runningr   s7    	z%//9:   		s   '* 
77c                 z     [        [        US   S5      S-  5      $ ! [         a    [        R                  s $ f = f)Nr      )strintrK   r   _DEFAULT_PORT_PRIO)r*   portids     r-   _extract_bridge_port_prio%mstpctlutil._extract_bridge_port_prioz   s=    	2s6!9b)B.// 	2111	2s    ::c                 |   [         R                  US 5      nUb  U$ 0 n [        R                  SUS/n[        R                  " U5      nU(       d  [         R                  X5        U$  Un [        R                  UR                  S5      5      n[        UR                  5       5       H~  n[        X   R                  5       5       H\  n	0 X7'   U R                  U	5      X7   S'   [        X   U	   R                  5       5       H  n
X   U	   U
   n[        U5      X7   U
'   M     M^     M     [         R                  X5        0 n [        R                  SSU/n[        R                  " U5      nU(       d  U$   [        R                  UR                  S5      5      n[        X   R                  5       5       H  n
[        X   U
   5      X'   M     S[!        UR                  SS	5      R#                  S
5      S   SS9S-  -  US'   US	 [         R$                  U   R'                  U5        [         R                  U5      $ ! [         a0  nU R                  R                  [        U5      5        Us S nA$ S nAff = f! [         a6  nU R                  R                  U< S[        U5      < 35         S nAGNwS nAff = f! [         a0  nU R                  R                  [        U5      5        Us S nA$ S nAff = f! [         a6  nU R                  R                  U< S[        U5      < 35         S nAGNS nAff = f)NshowportdetailjsonrH   treeportprioz/: cannot fetch mstpctl bridge port attributes: 
showbridgez%dr    .r   rX   )basei   r   z*: cannot fetch mstpctl bridge attributes: )MSTPAttrsCachegetr   r;   exec_commandlsetrK   r?   r@   rY   ra   loadsstriplistkeysr]   rZ   splitbridgesupdate)r*   
bridgenameattrsmstpctl_bridgeport_attrs_dictr4   outputeportnamemstpctl_bridge_cacher\   jsonAttrjsonValmstpctl_bridge_attrs_dicts                r-   %_get_bridge_and_port_attrs_from_cache1mstpctlutil._get_bridge_and_port_attrs_from_cache   s   "":t4L(*%		1$$#Z9C((-F"":M44  	i#'::fll4.@#A  !5!:!:!<="#7#A#F#F#HIF>@1;NRNlNlmsNt1;NK$()=)G)O)T)T)V$W"6"@"H"RLOPWL5?I %X J > zI %'!	-$$5C((-F00 
	f#'::fll4.@#A  !5!A!F!F!HI,8BC *3 J 59#&'@'D'DZ#%('',uSz!(5;=$?AE$F5G%j1 **5"":.556OP !!*--O  	1KKSV$00	1  	iKKV^`cde`fghh	i  	-KKSV$,,	-  	fKKQ[]`ab]cdee	fsn   AH> +CI; 2J> 7B2K; >
I8%I3-I83I8;
J;+J66J;>
K8%K3-K83K8;
L;+L66L;c                 $    U R                  U5      $ r1   )r|   r*   rr   s     r-   get_bridge_ports_attrs"mstpctlutil.get_bridge_ports_attrs   s    99*EEr/   c                     U R                  U5      nUR                  U0 5      R                  US5      nUS:X  d  US:X  a  g[        U5      $ )NnoTruetrueyes)r|   rh   rY   )r*   rr   rw   attrnamers   values         r-   get_bridge_port_attr mstpctlutil.get_bridge_port_attr   sI    :::F		(B'++Hd;F?evo5zr/   c                     U R                  U5      nU(       d  0 nX%;  a  0 XR'   XEU   U'   [        R                  X5        g r1   r   rg   rj   )r*   rr   rw   r   r   rs   s         r-   update_bridge_port_cache$mstpctlutil.update_bridge_port_cache   sA    ++J7E  EO$)h!:-r/   c                 j    U R                  U5      nU(       d  0 nX4U'   [        R                  X5        g r1   r   )r*   rr   r   r   rs   s        r-   update_bridge_cachemstpctlutil.update_bridge_cache   s/    ++J7Eh:-r/   Nc           
         U R                  XU5      nU(       a  Xd:X  a  g US:X  d  US:X  a"  U R                  SU< SU< SU< SU< 35        O!U R                  SU< SU< SU< SU< 35        U(       a  U R                  XXT5        g g )Nr#   rb   rj   r8    0 )r   _mstpctlutil__execute_or_batchr   )r*   rr   rw   r   r   	json_attrcache_values          r-   set_bridge_port_attr mstpctlutil.set_bridge_port_attr   sw    //
iP;/~%^)C##(JPXZ_$`a##*hX]$^_))*	Q r/   c                 ,  ^ ^ 0 n [        UU 4S j[        T R                  R                  5       5       5       5      nU$ ! [         aJ  nT R
                  R                  U5        T R
                  R                  [        U5      5         S nAU$ S nAff = f)Nc              3   P   >#    U  H  u  pUTR                  TU5      4v   M     g 7fr1   get_bridge_attr).0kvrr   r*   s      r-   	<genexpr>/mstpctlutil.get_bridge_attrs.<locals>.<genexpr>   s-      U,SSQ !"4#7#7
A#FG,Ss   #&)dictrm   _bridge_jsonAttr_mapitemsrK   r?   debugrY   )r*   rr   bridgeattrsrv   s   ``  r-   get_bridge_attrsmstpctlutil.get_bridge_attrs   s    	 U,01J1J1P1P1R,SU UK 	  	KKk*KKc!f%		s   7? 
B	?BBc                 R    US:X  a  SnU R                  U5      R                  U5      $ )Nr   r   )r|   rh   )r*   rr   r   s      r-   r   mstpctlutil.get_bridge_attr   s+    z!!H99*EII(SSr/   c                    U(       aD  US:X  a  U R                  X5      nOU R                  UU R                  U   5      nU(       a  XS:X  a  g US:X  a9  U R                  SU< SU< SU< 35        U R                  X[	        U5      5        g U R                  SU< SU< SU< 35        U R                  UU R                  U   [	        U5      5        g )Nr   rj   r8   r   )r   r   r   r   rY   )r*   rr   r   	attrvaluecheckattrvalue_currs         r-   set_bridge_attrmstpctlutil.set_bridge_attr   s    :%!%!5!5j!K!%!5!5j(,(A(A((K"M."=z!##xY$WX$$Z3y>J##Xz9$UV$$Z%)%>%>x%H%(^5r/   c           	          UR                  5        H!  u  pEU(       d  M   U R                  XXS5        M#     g ! [         a6  nU R                  R	                  U< S[        U5      < 35         S nAMa  S nAff = f)Nz: )r   r   rK   r?   warningrY   )r*   rr   attrdictr   r   r   rv   s          r-   set_bridge_attrsmstpctlutil.set_bridge_attrs   sc    NN$DAD$$ZA=	 %
  D##z3q6$BCCDs   7
A7+A22A7c                 &    U R                  US5      $ )Nr   r   r   s     r-   get_bridge_treepriomstpctlutil.get_bridge_treeprio  s    ##J
;;r/   c                     U(       a  U R                  U5      nU(       a  XB:X  a  g U R                  SU< S[        U5      < 35        U R                  US[        U5      5        g )Nzsettreeprio r   r   )r   r   rY   r   )r*   rr   r   r   r   s        r-   set_bridge_treepriomstpctlutil.set_bridge_treeprio
  sM    !55jAN."=S^ TU  ZYHr/   c                     U(       a+  [         R                  " [         R                  < SU< 35      $ [         R                  " S[         R                  -  5      $ )N showbridge z%s showbridger   r:   r;   r   s     r-   rc   mstpctlutil.showbridge  sI    %%(-(9(9:'G H H %%ou7H7H&HIIr/   c                 X    [         R                  " [         R                  < SU< 35      $ )Nz showportdetail r   r   s     r-   r`   mstpctlutil.showportdetail  s(    !!#(#4#4j#B C 	Cr/   c                 |     [         R                  " [         R                  < SU< 35        g! [         a     gf = f)Nr   TF)r   r:   r;   rK   r   s     r-   mstpbridge_existsmstpctlutil.mstpbridge_exists  s;    	 % 1 1: ? @ 		s   +. 
;;)__batch__batch_moder1   )T)$__name__
__module____qualname____firstlineno____doc__r[   rO   _bridgeattrmapr   _bridgeportattrmapr'   r9   r   &_mstpctlutil__execute_or_batch_dry_runrE   rL   classmethodrQ   rU   r]   r|   r   r   r   r   r   r   r   r   r   r   r   rc   r`   r   __static_attributes__ r/   r-   r   r      s    #. ) /%4!+ -+#;=N )3&.&0+:'0&2%0)?	 ->!7'8&6#4&6%3(9&:&:	<"!C	U
 & % %23.jF..	R	T
5(D<IJCr/   r   N)ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.ifupdownaddons.cache"ifupdown2.ifupdownaddons.utilsbaseImportErrorModuleNotFoundErrorifupdown.ifaceifupdown.utilsifupdownaddons.cacheifupdownaddons.utilsbaser&   r   r   r/   r-   <module>r      sG   +*.04O) O 	() + $&*+s   # AA