
    /I_i                         S SK r S SKr S SK7  S SK7  S SKJr  S SK7  S SKJs  J	r	  S SK
Js  Jr   " S S5      r " S S5      rg! \\4 a$    S SK7  S SK7  S SKJr  S SK7  S SKJr  S SKJ	r	   N@f = f)    N)*)utilsc                        \ rS rSrSrSrSrSrg)ifaceSchedulerFlags   zEnumerates scheduler flags        N)__name__
__module____qualname____firstlineno____doc__INORDER	POSTORDER__static_attributes__r
       */usr/share/ifupdown2/ifupdown/scheduler.pyr   r      s    &GIr   r   c                      \ rS rSrSrSrSr\R                  R                  SSS9r
\S 5       r\S 5       r\S	 5       r\SS j5       r\S 5       r\ SS j5       r\S
\R&                  S4S j5       r\S
\R&                  SS4S j5       r\  SS j5       r\  SS j5       r\S 5       r\ SS j5       r\ SS j5       r\ SS j5       r\S
S
\R&                  SSS4S j5       rSrg
)ifaceScheduler%   zscheduler functions to schedule configuration of interfaces.

supports scheduling of interfaces serially in plain interface list
or dependency graph format.

Tvrfzvrf-mgmt-devname)module_nameattrc                      SU l         SU l        g )NT)_STATE_CHECK_SCHED_STATUSclss    r   resetifaceScheduler.reset6   s     r   c                     U R                   $ Nr   r   s    r   get_sched_statusifaceScheduler.get_sched_status;   s       r   c                     Xl         g r#   r$   )r   states     r   set_sched_statusifaceScheduler.set_sched_status?   s    !r   Nc                 ~   UR                   nUR                  (       a  UR                  UR                  :w  a  gUR                  R                  (       d  gUS:X  a  UR	                  U5      nUR                  UR                   5      (       dR  UR                  [        R                  :w  a4  UR                  [        R                  U5      [        R                  5        gUR                  R                  U5       GH  nUR                  R                  U5      nSn	 [!        US5      (       Ga  U< SU< SU< 3n
US:X  GaE  UR"                  (       a  UR"                  R$                  (       a   U	(       d  UR&                  [        R(                  :X  aZ  UR                  [        R                  U5      [        R(                  5        SU;   d  SU;   d  SU;   a  U R+                  S	5        M  M  UR&                  [        R(                  :X  a  UR&                  O[        R,                  nUR                  [        R                  U5      U5        GMV  UR.                  R1                  U
5        UR3                  X#WUR4                  S
9  O5UR.                  R1                  U
5        UR3                  X#UR4                  S
9  U	(       d  UR&                  [        R(                  :X  a\  UR                  [        R                  U5      [        R(                  5        SU;   d  SU;   d  SU;   a  U R+                  S	5        GM@  GMC  UR&                  [        R(                  :X  a  UR&                  O[        R,                  nUR                  [        R                  U5      U5        GM     UR>                  R                  SS5      S:X  Ga.  UR                   (       a  UR                   OS[@        RB                  S'   UR                   (       a  UR                   OS[@        RB                  S'   URD                  (       a  URD                  OS[@        RB                  S'   URF                  (       a  SRI                  URF                  5      OS[@        RB                  S'   URJ                  R                  U/ 5       H>  nUR.                  R1                  U< SU< SU< 35         [L        RN                  " XtS9  M@     gg! [6         aP  nUR9                  [;        U5      5      (       d&  Sn	UR.                  R=                  [;        U5      5         SnAGNSnAff = f! U	(       d  UR&                  [        R(                  :X  aX  UR                  [        R                  U5      [        R(                  5        SU;   d  SU;   d  SU;   a  U R+                  S	5        f f UR&                  [        R(                  :X  a  UR&                  O[        R,                  nUR                  [        R                  U5      U5        f = f! [6         a  nS[;        U5      RQ                  5       ;   a6  UR.                  RS                  U< SU< S[;        U5      < 35         SnAGM  URU                  U< SU< S[;        U5      < 35         SnAGM  SnAff = f)z#Runs sub operation on an interface Nzquery-checkcurrr   run: z : running module updownF)ifaceobj_getfuncr   addon_scripts_support01 IFACELOGICALMETHOD,ADDRFAMz : running script )envzpermission denied )+nametypeflagsADDONS_ENABLEcreate_n_save_ifaceobjcurrlink_exists	ifaceTypeBRIDGE_VLANset_state_n_status
ifaceStatefrom_strifaceStatusNOTFOUND
module_opsgetmoduleshasattr
priv_flagsNOCONFIGstatusERRORr)   SUCCESSloggerdebugr,   get_ifaceobjs	Exceptionignore_errorstrerrorconfigosenvironaddr_methodaddr_familyjoin
script_opsr   exec_commandlowerwarning	log_error)r   ifupdownobjifaceobjopcenv	ifacenamequery_ifaceobjmnamemerrmsgrO   es                r   run_iface_opifaceScheduler.run_iface_opC   s7    MM	 0 0HMM A  ..""&AA(KN  ++HMM::!6!6611*2E2Eb2I2=2F2FH ++//3E##''.AC&81e$$:CROC.. %//$//88$$ (//[->->>//
0C0CB0G0;0A0AC{fl6G26M,,U3 7N "*K4E4E!E 'oo#.#6#6  //
0C0CB0G0689 $**005hN/:/H/H  J $**005h/:/H/H  J (//[->->>//
0C0CB0G0;0A0AC{fl6G26M,,U3 7N "*K4E4E!E 'oo#.#6#6  //
0C0CB0G068Q 4V !!"93?3F3;==(--bBJJw5=]]HMMBJJy!;C;O;O8#7#7UWBJJx FNFZFZCHHX-A-A$B`bBJJy!$//33B;""((U*, -U&&u7	 < G1  "//A77C  &&,,SV4 (//[->->>//
0C0CB0G0;0A0AC{fl6G26M,,U3 7N "*K4E4E!E 'oo#.#6#6  //
0C0CB0G068 ! U*c!flln<#**22)RQTUVQW3XYY#--YCPQF.STT	Us^   AS06S0U5S0X.0
U
:AU?UU

UCX+.
Z<8AZ7%Z77Z<c                    US   R                   nUR                  R                  SU-  5        SUS   ;   a  US   R                  [        R
                  :w  a  US   R                  S:w  a~  UR                  U5      (       dh  UR                  R                  SU-  5        UR                  R                  S5      nU(       a'  U H!  n[        R                  Ul        U" XS5        M#     gU H|  nUR                  R                  U5      nU(       a   U" XS   5        U HE  nU R'                  XUUR(                  R                  S	S
5      S:X  a  UR+                  Xg5      OSS9  MG     M~     UR                  R                  S5      nU(       a   U Vs/ s H  nU" XUS   5      PM       ngg! [         aa  n	UR!                  [#        U	5      5      (       d8  UR                  R%                  US   R                   < S[#        U	5      < 35         Sn	A	NSn	A	ff = fs  snf ! [         a1  n	UR                  R%                  S[#        U	5      -  5         Sn	A	gSn	A	ff = f)zQRuns all operations on a list of interface
configurations for the same interface
r   z%s: running ops ...r/   pppz%s: does not existposthookNr-   r1   r2   r3   )rg   %s)r<   rR   infor=   rB   rC   r\   rA   rS   sched_hooksrJ   rG   rQ   rO   ops_handlersrU   link_master_slave_ignore_errorrW   rb   ro   rY   generate_running_env)
r   rd   	ifaceobjsopsrh   posthookfuncre   rf   handlerrn   s
             r   run_iface_list_ops!ifaceScheduler.run_iface_list_ops   s3    aL%%	 5y @Ac!f!!!Y%:%::!((E1++I66$$%99%DE '2266zBL )H&1&9&9HO ? !* B "..2226GK16 &  &--112I!$'( %99(G-1 ! 3 & " #..22:>$-/$- kSV<$-/  ! &EEc!fMM"))11%.q\%6%6A3@ A	/ ""**4Q<8sC   F,H H(H ,
H6AHHH 
I)'IIFc                 `   SUS   ;  a  gUR                   R                  (       a  g[        R                   R                  (       dp  UR                   R                  (       aU  UR                  U5      (       d@  UR                  R                  SS5      S:X  a   [        R                   R                  (       d  gUR                  nU(       d  gU(       a  U Vs/ s H  owU:w  d  M
  UPM     snOUnU(       d  gU H  nUR                  U5      (       d  M  [        R                   R                  (       dt  UR                  U5      (       a0  UR                  R                  SUR                  -  SU-  -   5          gUR                  R                  SUR                  -  SU-  -   5          g   gs  snf )	zCheck if upperifaces are hanging off us and help caller decide
if he can proceed with the ops on this device

Returns True or False indicating the caller to proceed with the
operation.
r/   r   Twarn_on_ifdownr2   z%s: skipping interface down,z upperiface %s still around F)r>   SCHED_SKIP_CHECK_UPPERIFACESifupdownflagsFORCEr?   is_ifaceobj_noconfigrY   rJ   ALLupperifacesrA   rR   ru   r<   rb   )	r   rd   re   r{   parentfollowdependentsulistutmpulists	            r   _check_upperifaces!ifaceScheduler._check_upperifaces   sq    Q::%%%%33 55h??""&&'7=D!''++$$ :@51fQ5 	 A&&q))$**.."77AA#**//0N%]]1+-KQ-N1O P
  $**223Q%]]4+-KQ-N4O P  # 6s   	F+#F+c                 N   UR                  U5      nU(       d  [        SU-  5      eU R                  (       aH  US   R                  [        R                  US   5      :X  a  UR                  R                  SU-  5        gU H  nU R                  XX4U5      (       a  M    g   U[        R                  :X  a  U R                  XU5        U GHC  nUR                  n	U	(       d  M  UR                  [        R                  :X  a|  [!        U	5       Hm  n
UR                  U
5      =(       d    /  HL  nU(       d  M  UR"                  (       a  M  UR$                  U R&                  :X  d  M;  U	R)                  U
5        MN     Mo     UR                  R                  U< S[+        U	5      < 35         U(       dJ  U	 Vs/ s H  nUR-                  U5      (       d  M  UPM     nnU(       a  U R/                  XUX%USS9  GM-  GM0  U R/                  XUX%USS9  GMF     U[        R:                  :X  a  U R                  XU5        ggs  snf ! [         aZ  nUR1                  [+        U5      5      (       a   SnAGM  UR3                  [        R4                  [6        R8                  5        e SnAff = f)	8runs interface by traversing all nodes rooted at itself %s: not foundr   %s: already processedNz: found dependents Fcontinueonfailure)rT   rU   r   r(   rE   rF   rR   rS   r   r   r   r~   lowerifaces	link_kindifaceLinkKindVRFlistautor<   VRF_MGMT_DEVNAMEremoverW   is_iface_noconfigrun_iface_listrV   rD   NEWrG   rP   r   )r   rd   rh   r{   r   orderr   rz   re   dlistlower_ifnamelower_ifaceobjd	new_dlistrn   s                  r   run_iface_graphifaceScheduler.run_iface_graph   sc     --i8	OY677 q\:#6#6s2w#??$$%<i%GH!H))+*-7GI I " '///"";3?!H((Eu%%):)::(,U.9.G.G.U.[Y[.[N-~n6I6I6Ihmm_b_s_sNs %\ : /\ )4
 ""(('U*5 6+ 16 %I1'2'D'DQ'G &'	 %I$..{s+4=M=B / D %
 **;s,5,<>C + E9 "P '111"";3? 2'%I ! #00Q88 !33JNN0;0A0ACs<   *I 5H;H;I ;I ;I  
J$
J0/JJ$c           	         U H  n U R                  XX4XV5        M     g! [         a  n	U(       a  UR                  R                  [        R
                  5      (       a+  [        R                  [        R                  " 5       S   5        UR                  R                  U< S[        U	5      < 35         Sn	A	M  UR                  [        U	5      5      (       a   Sn	A	M  [        U< S[        U	5      < S35      eSn	A	ff = f)Runs interface list r	    : z : ()N)r   rU   rR   isEnabledForloggingDEBUG	tracebackprint_tbsysexc_inforX   rW   rV   )
r   rd   
ifacenamesr{   r   r   r   r   rh   rn   s
             r   r   ifaceScheduler.run_iface_list6  s     $IJ!!+#/ $  
J$"))66w}}EE!**3<<>!+<=&&,,CF-KL#00Q88'iQ(HII
Js!   
D BC;:C;C;;D c           
      ^   UR                  U5      nU(       d  [        SU-  5      eU R                  (       aH  US   R                  [        R                  US   5      :X  a  UR                  R                  SU-  5        gU(       d  U R                  XU5        U HW  nUR                  n	U	(       d  M  UR                  R                  U< S[        U	5      < 35         U R                  XUUUSS9  MY     g! [         a+  n
UR                  [        U
5      5      (       a   Sn
A
M  e Sn
A
ff = f)	r   r   r   r   r   Nz: found upperifaces Tr   )rT   rU   r   r(   rE   rF   rR   rS   r~   r   rW   run_iface_list_upperrV   )r   rd   rh   r{   r   r   	skip_rootrz   re   r   rn   s              r   run_iface_graph_upper$ifaceScheduler.run_iface_graph_upperL  s     --i8	OY677q\:#6#6s2w#??$$%<i%GH"";3?!H((Eu""((.7U*E F	,,[,5,<>B - D " ! #00Q88	s   C77
D,D'&D''D,c           	      v   U H  n U R                  XX4XW5        M     g! [         a  n	UR                  R                  [        R
                  5      (       a+  [        R                  [        R                  " 5       S   5        UR                  R                  U< S[        U	5      < 35         Sn	A	M  Sn	A	ff = f)r   r	   r   N)r   rU   rR   r   r   r   r   r   r   r   rb   rW   )
r   rd   r   r{   r   r   r   r   rh   rn   s
             r   r   #ifaceScheduler.run_iface_list_uppero  s     $I''&3 $  %%227==AA&&s||~a'89""**y#a&+IJ	s   
B8BB33B8c                    / nU GH  nUR                  U5      nU(       d  M  [        UR                  =(       d    / 5      R                  U5      n/ nU H  n	UR                  U	5      n
U
(       d  M  U
R                  =(       a    U
R                  R
                  (       + nU(       a  UR                  U	5      (       d	  U(       a  Mq  UR                  U	5      (       a   U
R                  [        R                  :X  d  M  UR                  U	5        M     UR                  U5        GM     UR                  U5        U(       a  U R                  XU5        g)a  Recursively find valid upperifaces

valid upperifaces are:
    - An upperiface which had no user config (example builtin
      interfaces. usually vlan interfaces.)
    - or had config and previously up
    - and interface currently does not exist
    - or is a bridge (because if your upperiface was a bridge
    - u will have to execute up on the bridge
      to enslave the port and apply bridge attributes to the port) N)get_ifaceobj_firstsetr   
differencerM   rN   get_ifaceobjs_savedrA   r   r   BRIDGEappendextend_get_valid_upperifaces)r   rd   r   allupperifacenamesupperifacenamesrh   re   r   nulistr   	uifaceobj
has_configs               r   r   %ifaceScheduler._get_valid_upperifaces  s    #I"55i@H,,23>>OEF'::1=	 "+"6"6 #@"+"6"6"?"?A
 [%D%DQ%G%G#k.E.Ea.H.H '00M4H4HH]]1%  ""6*- $. 	!!/2&&{'9;r   c                 v   / nU R                  XU5        U(       d  gUR                  R                  U5        U H0  n UR                  U5      nU(       d  M  U R	                  XU5        M2     g! [
         a?  nU(       a-  UR                  R                  S[        U5      -  5         SnAMs   SnAMy  SnAff = f)zRun through valid upperifaces Nrt   )r   rR   rS   rT   r~   rU   rb   rW   )	r   rd   r   r{   r   r   r   rz   rn   s	            r   run_upperifacesifaceScheduler.run_upperifaces  s     "";KH  -A='55a8	 &&{sC   =$&&..tSV|<< %=s   A/A//
B89.B33B8c                    UR                   R                  S5        UR                   R                  S5        U H8  nUR                  U5      nU H  nUR                  UR                   5        M      M:     U(       a6  UR                   R                  S5        UR                   R                  U5        U(       a6  UR                   R                  S5        UR                   R                  U5        UR                   R                  S5        g )Nz{
z
ifaceobjs:z
Dependency Graph:z
Indegrees:z}
)rR   ru   rT   dump)r   rd   r   dependency_graph	indegreesinameiobjsiobjs           r   _dump_dependency_info$ifaceScheduler._dump_dependency_info  s     	&/E--e4E		+,,-    ##$9:##$45##N3##I.&r   c                 z   [        U5      S:X  a  U$ U(       d=  [        5       n[        UR                  5       5       H  nUR	                  U5      XV'   M     [
        R                  XE5      n[        R                  R                  (       a  U$ / nU Vs/ s H  nXb;   d  M
  UR                  U5      PM       nU$ s  snf )Nr   )lenOrderedDictr   keysget_iface_refcntgraphtopological_sort_graphs_allr   r>   r   r   )	r   rd   r   r{   r   r   rh   ifacenames_all_sortedifacenames_sorteds	            r   get_sorted_iface_list$ifaceScheduler.get_sorted_iface_list  s     z?a#I!"2"7"7"9:	'2'C'CI'N	$ ; !& A A(8!E ""(( )>	8)>I(6 
-		!	!)	,)>	8 ! 	8s   	B8B8c
           	         Sn
/ n[        UR                  R                  SS5      5      nU(       dD  U(       d=  [        5       n[	        UR                  5       5       H  nUR                  U5      X]'   M     [        R                  R                  (       d  SUS   ;   am  [        U Vs/ s H  nUR                  U5      (       d  M  SPM     sn5      (       a4  U Vs/ s H  nUR                  U5      (       a  M  UPM     sn(       a  SOSn
U(       d:  U	(       a3  U R                  XX4U5      nU(       a  SUS   ;   a  UR                  5         OU(       d  U R                  UX#UU5      nU(       ak  U Vs/ s H3  nX;   d  M
  UR                  U5      (       a  M"  UR                  U5      PM5       nUR                   R#                  SS[%        U5      -  -   5        OUR                   R'                  S	5        U(       d$  [	        U5      nS
US   ;   a  UR                  5         U R)                  XUSUUS9  U R+                  5       (       d  gU(       d  UR                  R                  SS5      S:X  a  [        R                  R                  (       d  U(       d  U
(       a  SUS   ;   ax  UR                   R-                  S5         SU l        S[        R                  l        U R3                  XU5        S[        R                  l        SU l        U R5                  S5        gggggs  snf s  snf s  snf ! S[        R                  l        SU l        U R5                  S5        f = f)a  runs interface configuration modules on interfaces passed as
    argument. Runs topological sort on interface dependency graph.

Args:
    **ifupdownobj** (object): ifupdownMain object

    **ifacenames** (list): list of interface names

    **ops** : list of operations to perform eg ['pre-up', 'up', 'post-up']

    **dependency_graph** (dict): dependency graph in adjacency list format

Kwargs:
    **indegrees** (dict): indegree array of the dependency graph

    **order** (int): ifaceSchedulerFlags (POSTORDER, INORDER)

    **followdependents** (bool): follow dependent interfaces if true

    **sort** (bool): sort ifacelist in the case where ALL is not set

Fskip_ifacesortr2   r.   r   Tz3graph roots (interfaces that dont have dependents):z %szinterface sort returned Noner/   N)r   r   r   skip_upperifacesz7running upperifaces (parent interfaces) if available ..)intrY   rJ   r   r   r   r   r   r>   r   anymust_follow_upperifacesrA   r   reverser   rR   rS   rW   rb   r   r%   ru   r   IGNORE_ERRORSr   r)   )r   rd   r   r{   r   r   r   r   skipupperifacessortfollowupperifaces	run_queuer   rh   isorted_ifacenamess                   r   sched_ifacesifaceScheduler.sched_ifaces  s9   N "	[//334DcJKi#I!"2"7"7"9:	'2'C'CI'N	$ ; ""&&s1v~ j Cj&>>qA j C D D 1; %K
1/:/F/Fq/I &'
 %K *. .3 & "d55k$'9F	Q%%' "$'$=$=k,6=M,5%7! % *;:):I(6 1 !*i 8 1Y%%i0)::  &&,, .57<c)n7L.M N  &&../MN Z(I
 Q!!# 	;3"&e,< 	 	> ##%%""&&'93?3F#))--2B"A ## %6 7+ $) 48##1##KSA49##1#'  $$T*/  # G  eC%K(:d 5:##1#'  $$T*s6   &L!L!L&8L&2	L+?L+L+.L0 0/Mr
   r#   )F)NTF)NTTF)T)NN)r   r   r   r   r   r   r   policymanagerpolicymanager_apiget_module_globalsr   classmethodr    r%   r)   ro   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   %   s    LM$66II J 
 ! ! ! ! " " KU KUZ . .` ,1, ,\ AE1;;)-B@ B@H #'/B/L/L(,J J* GK9>   D :>9>  ) )V *.= =( ?C' '  :>! !4 !%)33!%u5@+ @+r   r   )rZ   r   ifupdown2.ifupdown.graphifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.ifupdown.statemanager ifupdown2.ifupdown.policymanagerifupdownr    ifupdown2.ifupdown.ifupdownflagsr   ImportErrorModuleNotFoundErrorifupdown.graphifupdown.ifaceifupdown.utilsifupdown.statemanagerifupdown.ifupdownflagsifupdown.policymanagerr   r   r
   r   r   <module>r     si    
 
3**.1<<<< H	+ H	+! 	() 3  $'223s   'A )A21A2