
    /I_                       S SK r S SKr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	s  J
r
  S SKrS SKJs  Jr  S SK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7  S SK7  S SK7  S SK7  S SK7  S SKJrJ r J!r!   Sr2Sr3S\2-  r4S\3-  r5 " S S	5      r6 " S
 S5      r7 " S S5      r8g! \"\#4 aP    S SK$J
r
  S SK%r&S SK'Jr  S SK(rS SK)rS SK*Jr  S SK(Jr  S SK+Jr  S SK,7  S SK-7  S SK.7  S SK/7  S SK07  S SK1JrJ r J!r!   Nf = f)    N)OrderedDict)*)ADDON_MODULES_DIRADDONS_CONF_PATHIFUPDOWN2_ADDON_DROPIN_FOLDERu   ✓u   ✗z(%s)c                   0    \ rS rSrSrSrSrSrSrSr	Sr
Srg)ifupdownMainFlagsG   FT N)__name__
__module____qualname____firstlineno__COMPAT_EXEC_SCRIPTSSTATEMANAGER_ENABLESTATEMANAGER_UPDATEADDONS_ENABLE%DELETE_DEPENDENT_IFACES_WITH_NOCONFIGSCHED_SKIP_CHECK_UPPERIFACESCHECK_SHARED_DEPENDENTS__static_attributes__r       -/usr/share/ifupdown2/ifupdown/ifupdownmain.pyr	   r	   G   s+    M,1)#( "r   r	   c                   &    \ rS rSrSrSrSS jrSrg)ifacePrivFlagsP   Fc                     Xl         X l        g NBUILTINNOCONFIG)selfbuiltinnoconfigs      r   __init__ifacePrivFlags.__init__U   s     r   r   N)FF)r   r   r   r   r    r!   r%   r   r   r   r   r   r   P   s    GH!r   r   c                      \ rS rSrSrSr\r\r	S r
S rS r\" S\
4S\4/5      rS	 rS
\0rS rS rS rS rS r0 SSSSSSSSSSSSSSS4S jrS rS rS rS rS rS rS rS r  S|S jrS  r S}S! jr!S" r"S# r#S$ r$S% r%S& r&S' r'S( r(S) r)S* r*S+ r+S, r,S~S- jr-S~S. jr.S/ r/S~S0 jr0S1 r1S2 r2S3 r3S~S4 jr4S~S5 jr5S~S6 jr6S~S7 jr7S~S8 jr8S~S9 jr9S~S: jr:S~S; jr;S~S< jr<S~S= jr=S~S> jr>S~S? jr?S~S@ jr@SA rAS~SB jrBS~SC jrCS~SD jrDS~SE jrES~SF jrFS~SG jrGSH rHS~SI jrIS~SJ jrJS~SK jrKS~SL jrLS~SM jrMSN rNSO rOSP rPSQ rQSR rRSS rSSST jrTSU rUSV rVSW rWS~SX jrXSY rYSZ rZS[ r[  SS\ jr\S] r]S^ r^S_ r_S` r`Sa raSb rbSc rcSd rdSe reSf rf   SSg jrgSSh jrhSi ri   SSj jrj    SSk jrk   SSl jrl   SSm jrmSn rnSo roSp rpSq rqSr rrS~Ss jrsSSt jrtSSu jruSv rvSSw jrwSSx jrxSy rySz rzS{r{g)ifupdownMainY   zifupdown2 main class z/etc/networkc                    UR                   [        R                  :X  a  g UR                  [        R
                  -  (       d"  UR                  [        R                  -  (       a  U R                  U5        g U R                  (       a&  U R                  R                  UR                  5        g UR                  [        R                   :X  a  g U R#                  UR                  5      (       d  g U R                  U5      (       a  g  U R$                  R'                  UR                  5        g ! [(         a    UR*                  S:X  a   g e f = f)Nmanual)type	ifaceTypeBRIDGE_VLAN	link_kindifaceLinkKindVRFlink_privflagsifaceLinkPrivFlags	VRF_SLAVE_keep_link_down_delay_admin_state_delay_admin_state_iface_queueappendname	link_typeifaceLinkType
LINK_SLAVElink_existsnetlinklink_up	Exceptionaddr_methodr"   ifaceobjs     r   run_upifupdownMain.run_upa   s     ==I111-"3"33$$'9'C'CC  *""//66x}}E
 !9!99..))	LL  / 	##x/		s   %D+ +E	E	c                     UR                   [        R                  -  (       aN  U R                  R	                  SUR
                  -  5        U R                  R                  UR
                  5        gg)Nz(%s: keeping link down due to user configTF)r2   r3   KEEP_LINK_DOWNloggerinfor9   r>   	link_downrB   s     r   r5   ifupdownMain._keep_link_down   sQ    ""%7%F%FF KKGVWLL""8==1r   c                    UR                   [        R                  -  (       d"  UR                  [        R
                  -  (       a  g UR                  [        R                  :X  a  g U R                  (       a&  U R                  R                  UR                  5        g UR                  [        R                  :X  a  g U R!                  UR                  5      (       d  g  UR                  [        R"                  -  (       d&  U R$                  R'                  UR                  5        g U R(                  R+                  SUR                  -  5        g ! [,         a    UR.                  S:X  a   g e f = f)Nz2%s: ifupdown2 cannot bring loopback interface downr+   )r/   r0   r1   r2   r3   r4   r,   r-   r.   r6   r7   r8   r9   r:   r;   r<   r=   LOOPBACKr>   rJ   rH   rI   r@   rA   rB   s     r   run_downifupdownMain.run_down   s   -"3"33$$'9'C'CC ==I111""//66x}}E
 !9!99..
	**-?-H-HH&&x}}5  !UX`XeXe!ef 	##x/		s   AE %(E E,*E,updownc                    UR                   (       a7  UR                   R                  (       d  UR                   R                  (       a  g U R                  R                  (       a  U R
                  R                  X5        g g r   )
priv_flagsr    r!   flagsr   statemanagerifaceobj_sync)r"   rC   ops      r   run_sched_ifaceobj_posthook(ifupdownMain.run_sched_ifaceobj_posthook   sQ    X%8%8%@%@((::))++H9 *r   posthookc                 L   [        0 5      U l        0 U l        [        R	                  5          [
        R                  R                  R	                  5         [
        R                  R                  R	                  5         [
        R                  R                  R	                  5         [        R                  " 5         [
        R                  R                  R                  R	                  5         g ! [         a     [        R                  R	                  5         [        R                  R	                  5         [        R                  R	                  5         [        R                  " 5         [        R                  R                  R	                  5          g ! [         a      g f = ff = fr   )r   modulesmodule_attrsifaceSchedulerreset	ifupdown2ifupdownrU   policymanagerifupdownflagsifupdownConfigifupdownaddonsmstpctlutilr@   r"   s    r   reset_ifupdown2ifupdownMain.reset_ifupdown2   s   "2	++113,,224,,224  "$$00<<BBD 	%%++-&&,,.&&,,.$$&**66<<> 	s+   B?C- -
F#8BF
FF#FF#c                     [         R                  R                  S:X  d9  [        R                  " SU[        R
                  [        R                  -  5       b  gg)NTexistsF)rc   rT   FORCEresearch
IGNORECASE	MULTILINE)r"   errmsgs     r   ignore_errorifupdownMain.ignore_error   sC    %%-9fMMBLL(2*1526r   c                    U R                  U5      S:X  aq  U R                  R                  5       [        R                  :X  a*  [
        R                  " 5         [
        R                  " 5         U R                  R                  U5        g NF)	rr   rH   getEffectiveLevelloggingDEBUG	tracebackprint_stack	print_excwarningr"   strs     r   log_warnifupdownMain.log_warn   s[    S!U*{{,,.'--?%%'##%KK$r   c                 D    U R                  U5      S:X  a  [        U5      eg ru   )rr   r@   r}   s     r   	log_errorifupdownMain.log_error   s"    S!U*C. r   c                 F    [         R                  R                  SU-  5      $ )N/sys/class/net/%s)ospathrk   r"   	ifacenames     r   r=   ifupdownMain.link_exists   s    ww~~19<==r   NF   Tz/etc/network/interfacesnativec                    U R                   R                  n[        R                  " SU-   5      U l        U(       a  U R                  5         Oz[        R                  R                  UR                  (       a  [        R                  O[        R                  5        [        R                  R                  5       R                  5         [        R                  R                  5       U l        U R                  R                  5         [!        5       U l        [!        5       U l        [!        S/ 4S/ 4S/ 4S/ 4S/ 4S/ 4S/ 4S	/ 4S
/ 4S/ 4S/ 4/5      U l        [!        S/ 4S/ 4S/ 4S
/ 4S/ 4S/ 4/5      U l        [        R                  " S5      U l        U[*        R,                  l        U[*        R,                  l        U[*        R,                  l        U[*        R,                  l        U[*        R,                  l        U
[*        R,                  l        U[*        R,                  l        S[*        R,                  l        [?        5       U l        XR,                  l         Xl!        Xl"        Xl#        Xl$        U R                  RK                  U RH                  5        SU l&        [N        RP                  U l)        SU R,                  l*        XR,                  l+        [!        5       U l,        Xl-        [\        R^                  " SS9U l0        [!        0 5      U l1        0 U l2        / U l3        U RH                  Ri                  SS5      S:X  a  U Rk                  U Rl                  5        U RH                  Ri                  SS5      S:X  a  U Ro                  U Rp                  5        [!        0 5      U l9        0 U l:        U RH                  [v        l$        [x        Rz                  R                  5         U R,                  R@                  (       a1  [x        Rz                  U l<         U Rx                  R}                  5         OSU R,                  lD        U RH                  Ri                  SS5      S:X  a  SOSU lE        / U lF        U R                  (       a  U R                  R                  S5        U RH                  Ri                  SS5      S:X  a  SOSU lH        U R                  (       a  U R                  R                  S5        U RH                  Ri                  SS5      S:X  a  SOSU lI        U RH                  Ri                  SS5      S:X  a  SOSU lJ        U R                  5       U lL        U R                  R                  SU R                  -  5        0 S U R                  _S!U R                  _S"U R                  _S#U R                  _S$U R                  _S%U R                  _S&U R                  _S'U R                  _S(U R                  _S)U R                  _S*U R                  _S+U R                  _S,U R                  _S-U R                  _S.U R                  _S/U R                  _S0U R                  _U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S1.EU lf        g! [~         aG  nU R                  R                  S[        U5      -  5        SSKBnUR                  " 5          SnAGNSnAff = f)2a  This member function initializes the ifupdownmain object.

Kwargs:
    config (dict):  config dict from /etc/network/ifupdown2/ifupdown2.conf
    force (bool): force interface configuration
    dryrun (bool): dryrun interface configuration
    withdepends (bool): apply interface configuration on all depends
    interfacesfile (str): interfaces file. default is /etc/network/interfaces
    interfacesfileformat (str): default is 'native'. Other choices are 'json'

Raises:
    AttributeError, KeyError z	ifupdown.zpre-uprP   zpost-upquery-checkcurrquery-runningquery-dependencyquery	query-rawzpre-downrQ   z	post-downra   r   F   )indentaddon_python_modules_support1addon_scripts_support0zerror reading state (%s)Ndelay_admin_state_changeTzT'delay_admin_state_change' is set. admin state changes will be delayed till the end.link_master_slavezj'link_master_slave' is set. slave admin state changes will be delayed till the masters admin state change.ifaceobj_squashifaceobj_squash_internalz"using mgmt iface default prefix %sz<mac>z<text>z<ipv4>z<ipv6>z<ip>z<number>z<interface>z<ipv4-vrf-text>z<number-ipv4-list>z<interface-list>z<ipv4/prefixlen>z<ipv6/prefixlen>z<ip/prefixlen>z<number-range-list>z<number-comma-range-list>z<interface-range-list>z%<interface-range-list-multiple-of-16>)z<mac-ip/prefixlen-list>z<number-interface-list>z<interface-yes-no-list>z<interface-on-off-list>z<interface-yes-no-0-1-list>z&<interface-disabled-automatic-enabled>z<interface-yes-no-auto-list>z"<interface-l2protocol-tunnel-list>)g	__class__r   rw   	getLoggerrH   rh   nlcacheNetlinkListenerWithCacheinitnldebugrx   WARNINGget_instancestartr>   reset_errorqr   ifaceobjdictifaceobjcurrdict
module_ops
script_opsrc   rT   rl   DRYRUNWITHDEFAULTSNOWAITPERFMODECACHEWITH_DEPENDSCACHE_FLAGSr	   r   interfacesfileinterfacesfileiobufinterfacesfileformatconfigdebugblacklisted_ifaces_presentr-   UNKNOWNr,   r   r   ifacesnjobspprintPrettyPrinterppr\   r]   overridden_ifupdown_scriptsgetload_addon_modulesaddon_modules_dirload_scriptsscripts_dirdependency_graph_cache_no_repeatsrd   rU   statemanager_apiread_saved_stater@   r|   r~   ry   r{   r   r6   r7   rI   _link_master_slave_ifaceobj_squash_ifaceobj_squash_internal_get_mgmt_iface_default_prefixmgmt_iface_default_prefix_keyword_mac_keyword_text_keyword_ipv4_keyword_ipv6_keyword_ip_keyword_number_keyword_interface_keyword_ipv4_vrf_text_keyword_number_ipv4_list_keyword_interface_list_keyword_ipv4_prefixlen_keyword_ipv6_prefixlen_keyword_ip_prefixlen_keyword_number_range_list _keyword_number_comma_range_list_keyword_interface_range_list,_keyword_interface_range_list_multiple_of_16_keyword_mac_ip_prefixlen_list_keyword_number_interface_list_keyword_interface_yes_no_list_keyword_interface_on_off_list"_keyword_interface_yes_no_0_1_list2_keyword_interface_disabled_automatic_enabled_list#_keyword_interface_yes_no_auto_list)_keyword_interface_l2protocol_tunnel_listvalidate_keywords)r"   r   argsdaemonforcedryrunnowaitperfmodewithdependsr   cacheaddons_enablestatemanager_enabler   r   r   withdefaults
modulenameery   s                       r   r%   ifupdownMain.__init__   sP   * ^^,,
''j(@A  " ,,114<<'--U\UdUde ,,99;AAC 77DDF!!# (M
 !, &"~#'*#,b/#4b"9#2B"7#5r":#*B-#."3#-r"2#)2,#."3
'5 
6 &"~#'*#,b/#-r"2#)2,#."3'5 6 ''
3$)!%+"+7(%+"'/$$)!+6( +.'&(
)<

&,#6 $8!$++&*/'%%	;@

8#0

 !m
&&a0"2+-(;;??93?3F##D$:$:;;;??2C8C?d../ +B!# !%%%**,::)) , = =D&!!224 .3DJJ**.++//6+=@C+D$IN 	.0+""KK K L +/++//)3+036+7$<A 	""KK ; < )--s)47:);@E 	 2662=@C2DIN 	& *.)L)L)N&=t?]?]]^"
T&&"
d(("
 d(("
 d((	"

 D$$"
 ,,"
 422"
 t::"
 !$"@"@"
  < <"
  < <"
  < <"
 d88"
 "4#B#B"
 ()N)N"
  %d&H&H!"
" 4T5f5f#"
$ (,'J'J'+'J'J'+'J'J'+'J'J+/+R+R6:6m6m,0,T,T262`2`3"
K  & ##$>A$FG ##%%&s   Z: :
\<\\c                    S n [         R                  R                  R                  R	                  SSS9nU(       d  SnU$ ! [
         a=     [        R                  R                  R	                  SSS9n N@! [
         a      NMf = ff = f)Nmainmgmt_intf_prefix)module_nameattreth)r`   ra   rb   policymanager_apiget_module_globalsr@   )r"   r   s     r   r   +ifupdownMain._get_mgmt_iface_default_prefix  s    $(!
	(1(:(:(H(H(Z(Z(m(m"); )n )% )(-%((  	,4,B,B,T,T,g,g &-? -h -)  	s)   2A 
B(A66
B BBBc                 4    U R                   (       a  SU;   a  gg)NzNetwork is downTF)r   )r"   errorstrs     r   link_master_slave_ignore_error+ifupdownMain.link_master_slave_ignore_error  s     ""8+r   c                 8    U R                   R                  U5      $ r   r   r   r   s     r   get_ifaceobjsifupdownMain.get_ifaceobjs  s      $$Y//r   c                 p    U R                   R                  (       a  U R                  R                  U5      $ g)z&Return ifaceobjects from statemanager N)rT   r   rU   r  r   s     r   get_ifaceobjs_saved ifupdownMain.get_ifaceobjs_saved  s)    ::))##11)<<r   c                 >    U R                  U5      nU(       a  US   $ g Nr   r  )r"   r   	ifaceobjss      r   get_ifaceobj_firstifupdownMain.get_ifaceobj_first  s"    &&y1	Q<r   c                 H    [        U R                  R                  5       5      $ r   )listr   keysrg   s    r   get_ifacenamesifupdownMain.get_ifacenames  s    D%%**,--r   c                 >    U R                   R                  U5      S   $ )Nr  r   s     r   get_iface_obj_lastifupdownMain.get_iface_obj_last  s      $$Y/33r   c                 d    U R                  U5      nUR                  [        R                  :X  a  gg)NFT)r  r,   r-   r.   r"   r   rC   s      r   must_follow_upperifaces$ifupdownMain.must_follow_upperifaces  s,     **95==I111r   c                     [        5       nXl        X$l        SUl        U R                  (       d  [
        R                  Ul        U(       a  UR                  5         U/U R                  U'   U$ )z;creates a iface object and adds it to the iface dictionary T)
ifacer9   rS   autor   r;   LINK_NAr:   
inc_refcntr   )r"   r   rS   	increfcntrC   s        r   create_n_save_ifaceobj#ifupdownMain.create_n_save_ifaceobj  sZ     7!(&&!.!6!6H!(0z)$r   c                 T   [        5       nUR                  Ul        UR                  Ul        UR                  Ul        [        R                  UR                  5      Ul        UR                  Ul        U R                  R                  UR                  / 5      R                  U5        U$ )z^creates a copy of iface object and adds it to the iface
dict containing current iface objects
)r  r9   r,   lowerifacescopydeepcopyrS   r  r   
setdefaultr8   )r"   rC   ifaceobjcurrs      r   create_n_save_ifaceobjcurr'ifupdownMain.create_n_save_ifaceobjcurr  s     w$MM$MM#+#7#7 "&--0C0C"D$MM((%'	))/)=r   c                 b    U R                   R                  U5      nU(       d  g U(       d  U$ X2   $ r   )r   r   )r"   r   idxifaceobjlists       r   get_ifaceobjcurrifupdownMain.get_ifaceobjcurr  s0    ,,00;$$r   c                     SnU R                  U5      nU(       d  gU H!  nUR                  U:  d  M  UR                  nM#     U$ )zReturn iface ref count r   )r  refcnt)r"   r   maxr  is        r   get_iface_refcntifupdownMain.get_iface_refcnt  sB    &&y1	Axx#~hh  
r   c                     SU;   $ )Returns true if iface name is a builtin interface.

A builtin interface is an interface which ifupdown understands.
The following are currently considered builtin ifaces:
    - vlan interfaces in the format <ifacename>.<vlanid>
.r   r   s     r   is_iface_builtin_byname$ifupdownMain.is_iface_builtin_byname  s     ir   c                 ^    UR                   (       a  UR                   R                  (       a  gg)r8  TF)rS   r    rB   s     r   is_ifaceobj_builtin ifupdownMain.is_ifaceobj_builtin   s!     H$7$7$?$?r   c                 T    UR                   =(       a    UR                   R                  $ )zReturns true if iface object did not have a user defined config.

These interfaces appear only when they are dependents of interfaces
which have user defined config
)rS   r!   rB   s     r   is_ifaceobj_noconfig!ifupdownMain.is_ifaceobj_noconfig+  s!     ##D(;(;(D(DEr   c                 V    U R                  U5      nU(       d  gU R                  U5      $ )z$Returns true if iface has no config T)r  r@  r  s      r   is_iface_noconfigifupdownMain.is_iface_noconfig3  s*     **95((22r   c           
         [        U5      n[        U R                  R                  5       5       H  u  pEU(       d  M  SnU R	                  U5      nU(       d  M*  U H%  nUR
                  [        R                  :X  d  M#  SnM'     U(       d  M^  [        U5      R                  U5      n	U	(       d  M  U R                  R                  SUR                  < SU< S3S[        [        U	5      5      -  -   5        M     g)zABSOLETE: Check if dlist intersects with any other
interface with slave dependents.
example: bond and bridges.
This function logs such errors FTzmisconfig..?. iface z and  z!seem to share dependents/ports %sN)setr  r   itemsr  dependency_typeifaceDependencyTypeMASTER_SLAVEintersectionrH   errorr9   r~   )
r"   rC   dlistsetdlistr   
ifacedlistcheck_dependsiobjsr4  commons
             r   check_shared_dependents$ifupdownMain.check_shared_dependents:  s    
 u:%)$*?*?*E*E*G%H!I!M&&y1E%%)<)I)II$(M  }Z55h?6KK%%&mmY'8?T&\ARR'S T &Ir   c           
         U R                   R                  (       a  UR                  [        R                  -  (       a  U[        R                  :X  a  UR                  [        R
                  -  (       a  U R                  R                  SUR                  < S[        R                  UR                  5      < S[        UR                  5      < 35        UR                  [        R                   5        g X!l        g )Nzmisconfig..? rF  z$ is enslaved to multiple interfaces )rT   r   role	ifaceRoleSLAVEMASTERrH   rM  r9   r3   get_strr2   r~   upperifaces
set_statusifaceStatusERROR)r"   rC   rW  upperifaceobjs       r   _set_iface_roleifupdownMain._set_iface_roleQ  s    JJ..]]Y__,Y__$=+=+=	@P@P+PKK!)!3!;!;H<S<S!TVYZbZnZnVoq r  1 12r   c                 Z   UR                   [        R                  -  (       aD  U R                  U[        R
                  U5        U=R                  [        R                  -  sl        UR                   [        R                  -  (       aD  U R                  U[        R
                  U5        U=R                  [        R                  -  sl        UR                   [        R                  -  (       aE  UR                   [        R                  -  (       a#  U=R                  [        R                  -  sl        UR                   [        R                  -  (       d"  UR                  [        R                  -  (       aD  U R                  U[        R
                  U5        U=R                  [        R                  -  sl        U R                  (       a5  UR                   ["        R$                  :X  a  ["        R&                  Ul        g g ["        R(                  Ul        ["        R(                  Ul        g r   )r/   r0   BONDra  rX  rY  r2   r3   
BOND_SLAVEBRIDGEBRIDGE_PORTVXLANBRIDGE_VXLANr1   r4   r   r:   r;   LINK_MASTERr<   r  )r"   rC   r`  s      r   _set_iface_role_n_kind#ifupdownMain._set_iface_role_n_kind\  sn   ##m&8&88  9??MJ##'9'D'DD###m&:&::  9??MJ##'9'E'EE#!4!44",,}/C/CC((,>,K,KK( $$}'8'88$$'9'C'CC  9??MJ##'9'C'CC#""&&-*C*CC%2%=%=" D '4&;&;M#!.!6!6Hr   c           
      N   U R                   R                  5        H  u  pUS   nU R                  R                  SUU R	                  U5      UR
                  (       a  [        UR
                  5      O/ UR                  (       a  [        UR                  5      O/ 4-  5        M     g)zDdebug funtion to print raw dependency
info - lower and upper devicesr   z$%s: refcnt: %d, lower: %s, upper: %sN)r   rH  rH   rI   r5  r%  r~   r\  )r"   r   r  iobjs       r   dump_iface_dependency_info'ifupdownMain.dump_iface_dependency_infov  s     %)$5$5$;$;$= IQ<DKKCi!229=6:6F6FS!1!12B6:6F6FS!1!12BFP P Q %>r   c                 z   / nU GH  nU R                  U5      nU(       d  SnU R                  U5      (       a  U R                  U[        SS5      S5      nOJU R                  R
                  (       d  U R                  U[        SS5      S5      nOUR                  U5        U(       a.  UR                  UR                  5        U R                  Xq5        M  M  U H?  nUR                  5         UR                  UR                  5        U R                  X5        MA     GM     U H  nUR                  U5        M     g)a  We go through the dependency list and
delete or add interfaces from the interfaces dict by
applying the following rules:
    if flag DELETE_DEPENDENT_IFACES_WITH_NOCONFIG is True:
        we only consider devices whose configuration was
        specified in the network interfaces file. We delete
        any interface whose config was not specified except
        for vlan devices. vlan devices get special treatment.
        Even if they are not present they are created and added
        to the ifacesdict
    elif flag DELETE_DEPENDENT_IFACES_WITH_NOCONFIG is False:
        we create objects for all dependent devices that are not
        present in the ifacesdict
NTF)r  r:  r"  r   rT   r   r8   add_to_upperifacesr9   rk  r   remove)	r"   r`  rN  opsdel_listddilistnidis	            r   preprocess_dependency_list'ifupdownMain.preprocess_dependency_list  s    A''*F//2244Q*46>BII44Q$25$$?GB OOA&))-*<*<=//B  !BMMO))-*<*<=//B !! ( ALLO r   c                 :   U H  nUR                   (       a  XAR                   ;   a  M%  UR                  U5        U R                  U5      nU(       d  MP  U H?  nUR                  5         U R	                  X5        UR                  UR                  5        MA     M     g r   )r\  rr  r  r   rk  add_to_lowerifacesr9   )r"   lowerifaceobjulistrt  u
uifacelistuis          r   preprocess_upperiface"ifupdownMain.preprocess_upperiface  s    A))...,,Q/++A.Jz$B!,,.//B))-*<*<= % r   c           	         / n[        U R                  R                  5       5       Hr  n US   S:X  a%  [        US5      (       d  M   UR	                  U5      nO&[        US5      (       d  ME  UR                  UU5      n U(       d  Ma  UR                  U5        Mt     [        [        U5      5      $ ! [         aB  nU R                  R                  UR                  < S[        U5      < S35        Sn SnANySnAff = f)z9Gets iface dependents by calling into respective modules r   r    get_dependent_ifacenames_runningget_dependent_ifacenamesz&: error getting dependent interfaces ()N)r  r\   valueshasattrr  r  r@   rH   r|   r9   r~   extendrG  )	r"   rC   rt  
ifacenamesr,   	ret_dlistmodulerN  r   s	            r   query_lowerifacesifupdownMain.query_lowerifaces  s    	 4<<..01Fq6_,#F:< < "CCHME#F,FGG ";;H(24E ui&&u-# 2$ C	N##  ##"--Q%1 2	s)   B0B0B0+B00
C<:8C77C<c           	         / n[        U R                  R                  5       5       Hq  n US   S:X  a%  [        US5      (       d  M   UR	                  U5      nO%[        US5      (       d  ME  UR                  X5      n U(       d  M`  UR                  U5        Ms     [        [        U5      5      $ ! [         aB  nU R                  R                  UR                  < S[        U5      < S35        Sn SnANySnAff = f)z:Gets iface upperifaces by calling into respective modules r   r   get_upper_ifacenames_runningget_upper_ifacenamesz": error getting upper interfaces (r  N)r  r\   r  r  r  r  r@   rH   r|   r9   r~   r  rG  )	r"   rC   rt  r  r,   	ret_ulistr  r  r   s	            r   query_upperifacesifupdownMain.query_upperifaces  s    	 4<<..01Fq6_,#F68 8 "??IE#F,BCC "77ME ui&&u-! 2" C	N##  ###+==#a&%: ;	s)   B/B/B/+B//
C;98C66C;c                    UR                  S5      S:w  a  g U H  nU R                  U5      nU(       a  U(       a  UR                  S5      S:w  a  M9  UR                  S5      nU(       d  MS  XQR                  :X  d  Md  UR                  nU(       d  My  UR                  U;   d  M  UR	                  UR                  5        M     g )Nz	link-typevethzveth-peer-name)get_attr_value_firstr  r9   r%  rs  )r"   rC   rN  diface	difaceobjdiface_peer_name
peer_dlists          r   "_remove_circular_veth_dependencies/ifupdownMain._remove_circular_veth_dependencies  s    ((5?F//7I y/M/Mk/Z^d/d
  )==>NO$4$E&22
! ==J.LL0' r   c           
         U(       d#  [        U R                  R                  5       5      n[        U5      nU(       a  UR	                  5       nSnSnU R                  U5      nU(       d  M5  SnUS   n	U HE  n
U R                  XU5      nU
R                  (       a  Sn  OU R                  XU5      nU(       d  ME    O   U(       a  U R                  XU5        U(       a  M  U(       aI  U R                  X5        U R                  U	XQ5        XYl        U Vs/ s H  oR                  U5      PM       nU(       a  M  [        U R                  R                  5       5       GH,  nU R                  U5      n
U
R                  (       dU  U
R                  [         R"                  -  (       d3  U
R$                  S:X  a#  U
=R                  [         R"                  -  sl        U
R$                  R'                  U R(                  5      (       aK  U R*                  R-                  SU
R$                  -  5        U
=R                  [         R.                  -  sl        U
R                  (       a  U
R                  U R0                  U'   GM  / U R0                  U'   GM/     U R2                  (       d  g[        U R0                  R                  5       5       H  nU R                  U5      n	U	(       d  M  U	R4                  (       d  M0  U	R6                  (       a  MC  U	R                  nU(       aX  U HR  nU R                  U5      nU(       d  M   U H.  nUR9                  5         UR6                  R;                  U5        M0     MT     U R*                  R-                  S
U-  5        U R0                  U	 M     gs  snf ! [<         a(    U R*                  R-                  SU< SU< S	35         M  f = f)z5recursive function to generate iface dependency info NFr   Tloz$%s: marking interface with mgmt flagzerror removing z from z upperifacesz;populate_dependency_info: deleting blacklisted interface %s)r  r   r  dequepopleftr  r  r%  r  r  r  rz  r8   r  r/   r2   r3   rM   r9   
startswithr   rH   r   	MGMT_INTFr   r   blacklistedr\  
dec_refcntrs  r@   )r"   rt  r  iqueuer4  rN  r  r  dependents_processedrC   rn  rv  
difaceobjss                r   populate_dependency_info%ifupdownMain.populate_dependency_info  s    d//4467Jz" AEE**1-I#(  !|H!..t*E##+/(..t*E5 " **8C@#77H//05<',$+015aq!51= fD d'',,./A**1-DNN''*<*E*EEyyD ""&8&A&AA"yy##D$B$BCC{{  !G!RS""&8&B&BB"+/+;+;%%a(+-%%a( 0 .. d++0023A..q1H###H,@,@,@ !,,"%)%7%7%:
)$!%/ ! ! 4 4Q 7 &0 # !!"_ab"bc))!,1 4/ 2T  ) ! KK--XY[\.]^ !s   N74N$$.OOc           	         [        U R                  R                  5       5       Hk  u  p#UR                  R	                  U5      nU(       d  M)  US   U:X  d  M4  U R
                  R                  SUR                  -  S-   SU< SU< S3-   5          g   [        U R                  R	                  S0 5      R                  5       5       HB  u  p#UR                  R	                  U5      nU(       d  M)  US   U:X  d  M4  X0R                  U'   MD     g	)
zncheck if object has an attribute that is
restricted to a single object in the system.
if yes, warn and return r   zignoring interface %s. zOnly one object with attribute 'rF  z
' allowed.T
no_repeatsF)r  r   rH  r   r   rH   rM  r9   )r"   rC   kvivs        r   _check_config_no_repeats%ifupdownMain._check_config_no_repeatsX  s     ..4467CA$$Q'Brbeqj!!";X]]"J9#:/0!4#5 6  8 r:@@BCDA$$Q'Brbeqj,-&&q) D r   c                    U R                  U5      (       a  g[        5       Ul        U R                  (       d  [        R
                  Ul        U R                  R                  UR                  5      nU(       d  U/U R                  UR                  '   gUR                  US   5      (       a)  U R                  R                  SUR                  -  5        gU R                  UR                      H0  nUR                  UR                  :X  d  M  UR                  U5          g   U R                  UR                     R                  U5        g)zAsquash ifaceobjects belonging to same iface
into a single object Nr   duplicate interface %s found)r  r   rS   r   r;   r  r:   r   r   r9   comparerH   r|   r,   squashr8   )r"   rC   currentifaceobjlistobjs       r   _save_iface_squashifupdownMain._save_iface_squashi  s     ((22,.&& - 5 58"//33HMMB"08zDhmm,/233KK > MN$$X]]3Cxx8==(

8$ 4 	(--(//9r   c                    U R                  U5      (       a  g [        5       Ul        U R                  (       d  [        R
                  Ul        U R                  R                  UR                  5      nU(       dK  U/U R                  UR                  '   U R                  (       d  U=R                  UR                  -  sl        g UR                  US   5      (       a)  U R                  R                  SUR                  -  5        g US   R                   UR                   :X  aA  US   =R                  UR"                  -  sl        U=R                  UR"                  -  sl        U R                  UR                      H#  nU=R                  UR$                  ) -  sl        M%     U=R                  UR$                  -  sl        U R                  UR                     R'                  U5        g )Nr   r  )r  r   rS   r   r;   r  r:   r   r   r9   r   rT   YOUNGEST_SIBLINGr  rH   r|   r,   HAS_SIBLINGSOLDEST_SIBLINGr8   )r"   rC   r  r  s       r   _save_ifaceifupdownMain._save_iface~  sl   ((22,.&& - 5 58"//33HMMB"/7jDhmm,(((";";;/233KK > MNq!&&(--7"((H,A,AA(NNh333N&&x}}5EKKH3333K 6 	(111(--(//9r   c                 L    [        U[        5      =(       a    [        U5      S:  $ r
  )
isinstancer~   lenr"   value
validranges      r   r   ifupdownMain._keyword_text  s    %%8#e*q.8r   c                     UR                  5       R                  S5      (       a  UR                  5       SS  n[        R                  " SUR	                  5       5      $ )Nether   z5[0-9a-f]{1,2}([-:])[0-9a-f]{1,2}(\1[0-9a-f]{1,2}){4}$)stripr  rm   matchlowerr  s      r   r   ifupdownMain._keyword_mac  sH    ;;=##G,,KKM!"%ExxP' 	'r   c                     U(       a1  US:  a+  [        SU5       H  nU" X   5        M     [        U5      U:H  $ U H  nU" U5        M     g! [         a1  nU R                  R	                  S[        U5      -  5         S nAgS nAff = f)Nr   Tzkeyword: check list: %sF)ranger  r@   rH   r   r~   )r"   _listr  limitr4  elemr   s          r   _keyword_check_list ifupdownMain._keyword_check_list  s{    	q%AM )5zU**!DI " 	KK7#a&@A	s   7A A 
B'BBc                 \    U R                  UR                  5       [        R                  SS9$ Nr   )r  )r  split	ipnetworkIPv4Addressr  s      r   r   ifupdownMain._keyword_ipv4  '    ''y7L7LTU'VVr   c                 \    U R                  UR                  5       [        R                  SS9$ r  )r  r  r  IPv4Networkr  s      r   r   $ifupdownMain._keyword_ipv4_prefixlen  r  r   c                 \    U R                  UR                  5       [        R                  SS9$ r  )r  r  r  IPv6Addressr  s      r   r   ifupdownMain._keyword_ipv6  r  r   c                 \    U R                  UR                  5       [        R                  SS9$ r  )r  r  r  IPv6Networkr  s      r   r   $ifupdownMain._keyword_ipv6_prefixlen  r  r   c                 \    U R                  UR                  5       [        R                  SS9$ r  )r  r  r  	IPAddressr  s      r   r   ifupdownMain._keyword_ip  '    ''y7J7JRS'TTr   c                 \    U R                  UR                  5       [        R                  SS9$ r  )r  r  r  	IPNetworkr  s      r   r   "ifupdownMain._keyword_ip_prefixlen  r  r   c                     UR                  5       nU R                  US   5      (       d  gUSS  H  nU R                  U5      (       a  M    g   g! [         a1  nU R                  R                  S[        U5      -  5         SnAgSnAff = f)z
MAC address followed by optional list of ip addresses
<mac> [<ip> <ip> ...]
ex: address-virtual 00:11:22:33:44:01 11.0.1.1/24 11.0.1.2/24
r   Fr   NTz!keyword: mac ipaddr prefixlen: %s)r  r   r   r@   rH   r   r~   )r"   r  r  resipr   s         r   r   +ifupdownMain._keyword_mac_ip_prefixlen_list  s    
	++-C$$SV,,!"g11"55    	KKACFJK	s(   )A A A A 
B'BBc                 6    UR                  S5      nU(       d  gU H;  nUR                  S5      n[        US   5        [        R                  " US   5        M=     g! [         a1  nU R
                  R                  S[        U5      -  5         SnAgSnAff = f)	z]
<number>=<ipv4> [<number>=<ipv4> ...]
ex: bridge-mcqv4src 100=172.16.100.1 101=172.16.101.1
rF  F=r   r   Tzkeyword: number ipv4: %sN)r  intr  r  r@   rH   r   r~   )r"   r  r  elementsr  r  r   s          r   r   &ifupdownMain._keyword_number_ipv4_list  s    
	{{3'H JJsOAaD	%%ad+ !  	KK83q6AB	s   A AA 
B''BBc                 $    U R                  U5      $ r   r  )r"   r   r  s      r   r   ifupdownMain._keyword_interface  s    !!),,r   c                 d   UR                  5       n[        U5      nUS:  d  US:  a  g [        R                  " US   5        US:  a*  US   S:w  a  gUS:  a  U R	                  US   5      (       d  gg! [
         a1  nU R                  R                  S[        U5      -  5         S	nAgS	nAff = f)
z>
<ipv4> "vrf" <text>
ex: clagd-backup-ip 10.10.10.42 vrf blue
   r   Fr   vrf   Tzkeyword: ipv4 vrf text: %sN)	r  r  r  r  r   r@   rH   r   r~   )r"   r  r  r  sizer   s         r   r   #ifupdownMain._keyword_ipv4_vrf_text  s    
 6{!8tax	!!&),ax!9% !8--fQi88$ 	KK:SVCD	s   (A4 A4 4
B/>'B**B/c                 l   UR                  5       n [        U5      S:X  a
  US   U;   a  gU HF  nUR                  S5      n[        U5      nUS:w  a  US   S:X  d	  US   S:X  a  M9    gUS   U;  d  MF    g   g! [         a1  nU R                  R	                  S	[        U5      -  5         S nAgS nAff = f)
Nr   r   Tr  r  globregexFz&keyword: interface list with value: %s)r  r  r@   rH   r   r~   )r"   r  	validvalsr  r  iface_valuer  r   s           r   "_keyword_interface_list_with_value/ifupdownMain._keyword_interface_list_with_value  s    	6{a!9	)ggcl;'19"1~/;q>W3L  "1~2    	KKFQOP	s.   A8 <A8 (A8 3A8 5A8 8
B3'B..B3c                 *    U R                  USS/5      $ )ze
<yes|no> | ( <interface>=<on|off> [<interface>=<on|off> ...] )
ex: bridge-learning swp1=on swp2=off
onoffr  r  s      r   r   +ifupdownMain._keyword_interface_on_off_list  s    
 66utUmLLr   c                 *    U R                  USS/5      $ )zk
<yes|no> | ( <interface>=<yes|no> [<interface>=<yes|no> ...] )
ex: mstpctl-portrestrrole swp1=yes swp2=no
yesnor
  r  s      r   r   +ifupdownMain._keyword_interface_yes_no_list  s    
 66uudmLLr   c                 *    U R                  U/ SQ5      $ )z
<yes|no|auto> |
    ( <interface>=<yes|no|auto> [<interface>=<yes|no|auto> ...] )
ex: mstpctl-portp2p swp1=yes swp2=no swp3=auto
)r  r  r  r
  r  s      r   r   0ifupdownMain._keyword_interface_yes_no_auto_list   s     66u8MO 	Or   c                 J    SU;   a\  UR                  5        HG  nUR                  S5      nUS   R                  SS5      R                  5        H  nUS;  d  M      g   MI     gUR                  SS5      R                  5        H  nUS;  d  M    g    g! [         a     gf = f)z
bridge-l2protocol-tunnel swpX=lacp,stp swpY=cdp swpZ=all
bridge-l2protocol-tunnel lacp stp,lldp,cdp
bridge-l2protocol-tunnel stp lacp cdp
bridge-l2protocol-tunnel lldp pvst
bridge-l2protocol-tunnel stp
bridge-l2protocol-tunnel all
r  r   ,rF  )allstplldplacpcdppvstFT)r  replacer@   )r"   r  r  intf_argintf_arg_splitargs         r   r   6ifupdownMain._keyword_interface_l2protocol_tunnel_list)  s    	e| %H%-^^C%8N-a088cBHHJ&SS#(  K !.  !==c288:C"OO$ ;
   		s0   AB B B $'B B B 
B"!B"c                 *    U R                  U/ SQ5      $ )z
<yes|no|0|1> |
    ( <interface>=<yes|no|0|1> [<interface>=<yes|no|0|1> ...] )
ex: bridge-portmcrouter swp1=yes swp2=yes swp3=1
)r  r  r   r   2r
  r  s      r   r   /ifupdownMain._keyword_interface_yes_no_0_1_listA  s     66u7SU 	Ur   c                 *    U R                  U/ SQ5      $ )N)r   disabledr  r   	automaticr  r   enabledr
  r  s      r   r   ?ifupdownMain._keyword_interface_disabled_automatic_enabled_listJ  s    66u ?  	r   c                 "    U R                  XSS9$ )N   )multiple)r   r  s      r   r   9ifupdownMain._keyword_interface_range_list_multiple_of_16P  s    11%b1QQr   c                    UR                  5       n [        U5      S:X  a  SUS   ;  aw   [        US   5      nU[        US   5      :  d  U[        US   5      :  a%  [        SUS   < SSR	                  U5      < 35      eUb  XS-  S:X  d  [        SU< S	U< 35      eg
U H  nUR                  S5      n[        U5      n	U	S:w  a    g[        US   5      n
U
[        US   5      :  d  U
[        US   5      :  a,  [        SUS   < SUS   < SSR	                  U5      < 35      eUc  M  X-  S:X  a  M  [        SU
< S	U< 35      e   g
! [         a  nUeSnAf[
         a1  nU R                  R                  S[        U5      -  5         SnAgSnAff = f! [         a  nUeSnAf[
         a1  nU R                  R                  S[        U5      -  5         SnAgSnAff = f)zg
<number> | ( <interface>=<number> [ <interface>=number> ...] )
ex: mstpctl-portpathcost swp1=0 swp2=1
r   r  r   value of out range "": valid attribute range: -Nzinvalid value z: must be a multiple of Tz!keyword: interface range list: %sFr  z" for iface ")	r  r  r  invalidValueErrorjoinr@   rH   r   r~   )r"   r  r  r)  r  nr   r  r  r  numbers              r   r   *ifupdownMain._keyword_interface_range_listS  s   
 .	6{aCvay$8!F1IA3z!}--S"16' 2'/39!93688J3G1I J J
  + ! 1"3dego4p"qq ggcl;'19 [^,C
1..&3"1<' 3'+ 'q>&q>88J/	12 2 '"-2/`fhp0qrr# & 3 ) G  !KK%%&I(+A'/ 0 !0 ! 	G 	KKACFJK	sl   F A5E !(F 
AF -F 7F 
FEF&'FF FF 
G$$F&&G$3'GG$c                     UR                  5       n[        U5      nSnXT:  a;  X5   S:X  d  X5   S:X  a  US-  nOU R                  X5   5      (       d  gUS-  nXT:  a  M;  g)z|
[glob|regex] <interface> [ [glob|regex] <interface> ...]
ex: bridge-ports swp1 swp2 glob swp3-5.100 regex (swp[6|7|8].100)
r   r  r  r   FT)r  r  r   )r"   r  r  interface_listr  r4  s         r   r   $ifupdownMain._keyword_interface_list  sm    
 >"h F*n.?7.JQ..~/@AA FA h r   c                    UR                  5       n SnU[        U5      :  aa  SX4   ;   a6  X4   R                  S5      n[        US   5      n[        US   5      nXg:  a  gO[        X4   5        US-  nU[        U5      :  a  Ma  g! [         a1  nU R                  R                  S[        U5      -  5         SnAgSnAff = f)z9
<number> [<number>-<number>]
ex: bridge-vids 42 100-200
r   r.  r   FTzkeyword: number range list: %sN)r  r  r  r@   rH   r   r~   )	r"   r  r  number_listr4  r  abr   s	            r   r   'ifupdownMain._keyword_number_range_list  s    
 kkm	Ac+&&+.('N005EE!HAE!HAu$  'Q c+&&  	KK>QGH	s   AB  "B 
C 'B;;C c                 J   UR                  5       nU(       d  g [        US   5        SnUSS  H  n [        U5        U(       a    gSnM     U(       + $ ! [         a    Sn M4  f = f! [         a1  nU R                  R	                  S[        U5      -  5         SnAgSnAff = f)zl
<number> <interface> [<interface>... [<number> <interface> ... ]]
bridge-waitport 42 swp1 swp2 swp3 9 swp4
Fr   Tr   Nz"keyword: number interface list: %s)r  r  r@   rH   r   r~   )r"   r  r  r5  prevr  r   s          r   r   +ifupdownMain._keyword_number_interface_list  s    
 	q!"D&qr*!I$D + 8O ! ! D!  	KKBSVKL	sF   A' AA' A	
A' A$ A' #A$$A' '
B"1'BB"c                      [        U5        g! [         a1  nU R                  R                  S[	        U5      -  5         S nAgS nAff = f)NTzkeyword: number: %sF)r  r@   rH   r   r~   )r"   r  r  r   s       r   r   ifupdownMain._keyword_number  s@    	J 	KK3c!f<=	s    
A	'AA	c                     [        U[        5      (       a  gXR                  ;   nUR                  S5      (       a+  UR	                  S5      (       a  U(       d  [        SU-  5      eU$ )NT<>zM%s: invalid keyword, please make sure to use a valid keyword see `ifquery -s`)r  tupler   r  endswithr@   )r"   r  keyword_founds      r   _is_keywordifupdownMain._is_keyword  se    eU##!7!77C  U^^C%8%8 @BGH I Ir   c                 J   U(       a  X#;  a  SnU Hd  nU R                  U5      (       d  M  U(       a"  U R                  U   " X$5      (       a  SS0s  $ MD  U R                  U   " U5      (       d  M`  SS0s  $    U(       d  SSU< SU< 3S.$  SS0$ U(       a
  X#;   a   SS0$ U(       aw  [        U5      S:w  a  [        SS	R	                  U5      -  5      e[        U5      nU[        US
   5      :  d  U[        US   5      :  a  SSU< SS	R	                  U5      < 3S.$ SS0$ )NFresultTzinvalid value "z": valid attribute values: )rJ  messager  z(%s: invalid range in addon configurationr.  r   r   r,  r-  )rG  r   r  r@   r0  r  )r"   attrnamer  r  r  is_validkeyword_values           r   _check_validvals_value#ifupdownMain._check_validvals_value  sJ   /H$##G,,!11':5MM$,d#33 N  11':5AA$,d#33 % #"' 4  ( $ 5- $ :!# J"%((:"6!7 8 8ZFJqM**fs:a=7I.I# #(*)= ?  $r   c                 D   U R                  U5      nU(       d  g Sn[        US   R                  R                  5       5       H  u  pg UR	                  U0 5      nUR	                  S/ 5      n	UR	                  S/ 5      n
U HN  nU R                  UUU	U
5      nUS   (       a  M#  U R                  R                  U< SU< SUS   < 35        SnMP     M     U$ ! [         a=  nU R                  R                  S	U< S
U< S[        U5      < 35        Sn S nAM  S nAff = f)NTr   r  r  rJ  : rK  Fzaddon 'z': )
r  r  r   rH  r   rP  rH   r|   r@   r~   )r"   r   r   attrsrC   successrL  	attrvalueattrname_dictr  r  r  r  r   s                 r   _check_validvalsifupdownMain._check_validvals  s   %%i0#'(:(:(@(@(B#CH  %		(B 7)--k2>	*..|R@
&E55h6;6?6@BC x==++*3Xs9~-O P"' ' $D&    ##k;C;>q6%C D  	 s   AC#/C
D"2DDc           
      |   SnU H  n[        U R                  R                  5       5       H  n [        US5      (       aH  U R	                  UUR
                  R                  UR                  R                  S0 5      5      (       d  Sn[        US5      (       aU  [        UR                  5      (       a9  UR                  U R                  U5      S   U R                  5      (       d  SnM  M  M  M     M     U$ ! [         a9  nU R                  R                  U< S[        U5      < 35        Sn S nAGM  S nAff = f)NT_modinforT  Fsyntax_checkr   rS  )r  r\   r  r  rX  r   r   r[  r   callabler\  r  r@   rH   r|   r~   )r"   filtered_ifacenamesrJ  r   r  r   s         r   _module_syntax_check!ifupdownMain._module_syntax_check  s   ,It||2245#vz22#44Y5;5E5E5N5N5;__5H5HRT5U W  W &+Fv~668FDWDW;X;X%2243E3Ei3PQR3S373E3E G  G%*F G <Y6 6 -  ! #KK''Is1v(FG"F#s   B9C88
D;-D66D;c                    [        U R                  R                  5       5       H  u  p4U(       d  M  UR                  S5      n UR                  U5      nU(       as  UR                  S5      (       a[  UR                  S5      nU(       a%  U R                  R                  SU< SU< S35        OU R                  R                  SU-  5          gU H  nS	XX   ;   d  M  XU   S	   ;   d  M      g   M     g
! [         a     M  f = f)NrT  
deprecatedznew-attributez
attribute z is deprecated. use z	 instead.zattribute %s is deprecated.TaliasesF)r  r]   rH  r   rH   r|   AttributeError)	r"   rL  attrvalmmdict	attrsdictr9  newakeys	            r    _iface_configattr_syntax_checker-ifupdownMain._iface_configattr_syntax_checker(  s    T..4467HA		'*IMM(+uu\** uu_5 KK//`hjn0op KK//0M.617 8($	6'S>)+DD'+  )! 8,  " s+   B	C5C5	C5+C5.C55
DDc                    Sn[        UR                  R                  5       5       H  u  p4Sn[        U R                  R                  5       5       H8  u  pgU(       d  M  UR	                  S0 5      R	                  U5      (       d  M6  Sn  O   U(       a  Mo  SnU R
                  R                  UR                  < SU< S35        M     U$ )NTFrT  z: unsupported attribute 'r  )r  r   rH  r]   r   rH   r|   r9   )r"   rC   retrL  rV  foundr  r  s           r   _ifaceobj_syntax_checker%ifupdownMain._ifaceobj_syntax_checkerA  s    #'(=(=(?#@HET..44671w+//99 E 8 5##$,MM8%= > $A 
r   c           
         Sn[        U R                  U R                  U R                  U R                  R                  SS5      U R                  R                  S5      U R                  R                  S5      US9nU R                  (       d  U R                  (       a  UR                  SU R                  5        OUR                  SU R                  5        U R                  R                  SS	5      S	:X  a8  UR                  S
U R                  5        UR                  SU R                  5        UR                  5         UR                  (       d  UR                  (       a  SnU R!                  5         U$ )z@Reads default network interface config /etc/network/interfaces. Ttemplate_enabler   template_enginetemplate_lookuppath)rs  rt  ru  rawiface_foundaddon_syntax_checkr   validateifaceattrvalidateifaceobjF)networkInterfacesr   r   r   r   r   r   r   	subscriber  r  rk  rp  loaderrorswarns_schedule_addon_translate)r"   rv  rn  nifacess       r   read_iface_configifupdownMain.read_iface_configP  s   #D$7$70011(,8I1(M(,8I(J$(KKOO4I$J(+-   D$B$BmT-D-DEmT-=-=>;;??/5<1"CCE0$2O2OP>>W]]C&&(
r   c                 `    [         R                  U R                  R                  5      U l        g)zyReads the saved iface config instead of default iface config.
And saved iface config is already read by the statemanager N)r&  r'  rU   r   rg   s    r   read_old_iface_config"ifupdownMain.read_old_iface_configi  s!     !MM$*;*;*H*HIr   c                    [        U R                  S5       nUR                  5       nU Hd  n UR                  S5      R	                  S5      nU(       a  [        U5      S:  a  M<  US   nUS   nU R                  U   R                  U5        Mf     S
S
S
5        g
! [         a8  nU R                  R                  SU< S[        U5      < S	35         S
nAM  S
nAff = f! , (       d  f       g
= f)zLoad addon modules config file rz 
	r  r  r   r   zerror reading line 'z' :N)openaddon_modules_configfile	readlinesr  r  r  r   r8   r@   rH   r|   r~   )r"   flinesllitems	operationmnamer   s           r   _load_addon_modules_config'ifupdownMain._load_addon_modules_confign  s     $//5KKME	WWY/55c:F!S[1_  &q	I"1IEOOI.55e<  65 ! KK''!SQRV(TU 65s@   C 6B$C &(BC 
C%-CC CC  
C.c                 ~   [        5       nU R                  R                  S[        U5      -  5        U R	                  5         U GH>  nU[
        R                  ;  a   [
        R                  R                  SU5         [        U R                  R                  5       5       H  u  pEU H  nU R                  R                  U5      (       a  M%  US-   U-   S-   n[        R                  R                  U5      (       d  MV  Xr;  d  M]   [        U5      n[        X5      n	 U	" 5       nUR'                  5       nU R(                  R+                  U5        XR                  U'    UR/                  5       U R0                  U'   M     M     GMA     [        U R                  R3                  5       5      U R                  S'   [        U R                  R3                  5       5      U R                  S'   [        U R                  R3                  5       5      U R                  S'   [        U R                  R3                  5       5      U R                  S'   [        U R                  R3                  5       5      U R                  S'   g! [          aI  n
U R                  R#                  SU< S[        U
5      < 35        UR%                  U5         Sn
A
GM  Sn
A
ff = f! [,         a9  n
U R                  R                  SU< S	[        U
5      < S
35         Sn
A
GMe  Sn
A
f[          a    e f = f! [          a     GM  f = f! [          a    e f = f)zYload python modules from modules_dir

Default modules_dir is /usr/share/ifupdownmodules

zloading builtin modules from %sr   /z.pyzcannot load "z
" module: Nzmodule z not loaded (r  r   r   r   r   r   )r  rH   rI   r~   r  sysr   insertr   rH  r\   r   r   rk   
__import__getattrr@   r|   r8   get_overrides_ifupdown_scriptsr   r  moduleNotSupportedget_modinfor]   r  )r"   modules_dir_listfailed_importmodules_dirrW   mlistr  mpathrf  mclassr   	minstancescript_overrides                r   r   ifupdownMain.load_addon_modules  s    :SAQ=RRS'')+K#((*;/!%doo&;&;&=!>IB!&<<++E22$ +c 1E 9E A77>>%00U5O)$.u$5)0):
	&,2H	2;2Z2Z2\ $ @ @ G G X 3<LL/%;D;P;P;R 1 1% 81 "' "?	 ,H .2$,,2C2C2E-F)*+/0A0A0C+D(.24<<3D3D3F.G*+#'(9(9(;#< '+DLL,=,=,?'@$7 $- ) $ 3 3UZ\_`a\b4c d - 4 4U ; () $6 ) $ 0 038#a&2B !C (#, & %&
 $- % $% s   =A<L0=L0I82KL0L:L08
K	=K	?L0K	L0
L	-L	L0L	L0
L-	(L0,L-	-L00L<c                 B    U R                  UR                  SS5      US9$ )Nr  rF  )r  )r   r  r  s      r   r   -ifupdownMain._keyword_number_comma_range_list  s$    ..u}}S#/FS].^^r   c           
      N   US:X  a  0 n[        U R                  R                  5       5       H:  u  p4[        US5      (       d  M  UR                  S   UR                  5       S.X#'   M<     [        [        R                  U5      5        gSn[        U R                  R                  5       5       GH  u  pgU(       d  M  [        U< SUR                  S5      < 35        U R                  U   R                  5       nU(       d  MV   [        UR                  5       5       GHc  u  pU
R                  SS5      (       a  M  [        U< U	< 35        [        US-   < S	U
R                  S
S5      < 35        [        US-   < SU
R                  SS5      < 35        U
R                  S5      nU(       a  [        US-   < SU< 35        U
R                  S5      nU(       a  [        US-   < SUS   < SUS   < 35        U
R                  S5      nU(       a$  [        US-   < SSR                  U5      < 35        U
R                  S5      nU(       d  GM5  [        SUS-   -  5        U H  n[        US-   < U< 35        M     GMf     [        S5        GM     g! [         a     Nf = f)z&Prints addon modules supported syntax jsonr[  mhelp)r  rT  z  rS  compatFzhelp: help z
required: requireddefaultz	default: r  zvalidrange: r   r.  r   r  zvalidvals: r  examplez
%sexample:z    N)r  r\   rH  r  r[  merge_modinfo_with_policy_filesprintr  dumpsr]   r   r0  r@   )r"   fmtmodinfosrj  r  r   rf  rg  attrdictrL  attrvaldictr  r  r  examplesr   s                   r   _modules_helpifupdownMain._modules_help  s:    &=H"4<<#5#5#78
5*--!&!8!&!F!F!H%HM 9 $**X&'F !2!2!8!8!:;!UYYw%78:<<?JJL15hnn6F1G-&??8U;;$9;ftm)oofb9 ; =&4- +
E B D F"-//)"<"!Vd]G#LN%0__\%B
%!$*TM:a=*Q-$Q S %0OOK$@	$!$*TM388I3F$H J $/??9#='$lVd];<!)A!6F?A">? "*7 2H> b	O <J ! s   FJ
J$#J$c                    U R                   R                  SU-  5        [        U R                  R	                  5       5       H  u  p#USU-  -   nU R                   R                  SU-  5         [
        R                  " U5      nU HX  nU R                  R                  U5      (       d  X`R                  ;   a  M4  U R                  U   R                  US-   U-   5        MZ     M     g! [         a     M  f = f)zloading user modules from /etc/network/.

Note that previously loaded python modules override modules found
under /etc/network if any

z!looking for user scripts under %sz/if-%s.dzloading scripts under %s ...r  N)rH   rI   r  r   rH  r   listdirr\   r   r   r8   r@   )r"   r  rW   r  msubdirmodule_listr  s          r   r   ifupdownMain.load_scripts  s     	<kIJdoo3356IB!JN2GKK;WDE jj1)F||''//6=]=]3] OOB'..w}v/EF * 7  s   .A4C''
C54C5c                    [        [        R                  R                  U R                  R                  5       5      5      nU R                  R                  5        H  n UR                  U5        M     g ! [         a     M'  f = fr   )	r  	itertoolschainfrom_iterabler   r  r\   	translaterd  )r"   merged_ifaceobjsaddons      r   r  &ifupdownMain._schedule_addon_translate  sh    	 = =d>O>O>V>V>X YZ\\((*E 01 + " s   A55
BBc                    U R                   R                  S[        U5      < S[        U5      < 35        U R                  SU R                  5        [
        R                  XUU R                  SUS   ;   a  [        R                  O[        R                  UUU(       d  [        R                  R                  (       a  SOSS9  [
        R                  5       $ )	Nzscheduling 'z' for zdependency graphrQ   r   TF)r   orderfollowdependentsskipupperifacessort)rH   r   r~   _pretty_print_ordered_dictr   r^   sched_ifacesifaceSchedulerFlagsINORDER	POSTORDERrc   rT   CLASSget_sched_status)r"   r  rt  r  r  r  s         r   _sched_ifacesifupdownMain._sched_ifaces  s    Hc*o7 	8''(:))	+##Dc595J5J%Q/ +>*E*E%8%B%B5E4C26-:M:M:S:SZ_ 	$ 	a ..00r   c                 *   / n[         R                  " SU5      nU(       am  UR                  5       nUS   (       aS  US   (       aI  [        [	        US   5      [	        US   5      S-   5       Vs/ s H  nUR                  SU-  5      PM       nU$ s  snf )Nz^([\d]+)-([\d]+)r   r   z%d)rm   r  groupsr  r  r8   )r"   r   new_ifacenames
vlan_matchvlan_groupsr  s         r   _render_ifacenameifupdownMain._render_ifacename  s    XX0)<
$++-K1~+a."3{1~#6A/1343  &&tQw/34 4s   .Bc                 d   / nSnU H  nU R                  U5      nU(       dd  [        R                  U5      nU(       a>  U H6  nU R                  U5      nU(       d
  USU-   -  nM%  UR                  U5        M8     Mu  USU-   -  nM  UR                  U5        M     U(       a  [	        SU-  5      eU$ )zpvalidates interface list for config existance.

returns -1 if one or more interface not found. else, returns 0

r  rF  zcannot find interfaces:%s)r  utilsexpand_iface_ranger8   r@   )r"   r  r  	err_ifacer4  r  rendered_ifacenamesris           r   _preprocess_ifacenames#ifupdownMain._preprocess_ifacenames*  s     	A**1-I&+&>&>q&A#&1$($6$6r$:	(%r1I*11"5 2 q(I%%a(   7BCCr   c                    SnU(       a(  U H"  n[         R                  " Xd5      (       d  M   SnM$     U R                  U5      nU(       d*  U(       a!  U R                  R	                  SU-  S-   5        U$ U(       d  U H  nSUl        SU l        M     U$ U(       av  SnU HN  nUR                  (       d  M  [        U5      R                  [        UR                  5      5      n	U	(       d  ML  SnMP     U(       d  SU l        U H
  nSUl        M     U$ U(       a>  SnU H  nUR                  (       d  M  SnM     U(       d  SU l        U H
  nSUl        M     U$ )zChecks if interface is whitelisted depending on set of parameters.

interfaces are checked against the allow_classes and auto lists.

TFziface %sz
 not found)rm   rn   r  rH   r   r  r   classesrG  rL  r  )
r"   r  allow_classesexcludepatsr   rn  r   r  r4  rS  s
             r   _iface_whitelistedifupdownMain._iface_whitelistedF  s8      99Q**C ! &&y1	!!*i"7,"FGJ $26/  J C999 /<<S^LFv"	 
  37/"A$(AM #J C666C   37/"A$(AM #
r   c                 "    SU;   a  gSU;   a  gU$ )z2Returns old op name to work with existing scripts rP   r   rQ   stopr   )r"   rW   s     r   _compat_conv_op_to_mode$ifupdownMain._compat_conv_op_to_mode~  s    2:r\Ir   c                     SnUR                  5       nU(       a5  [        [        R                  5      nU(       a  UR	                  U5        OUnO0 nU R                  U5      US'   X#S'   U$ )zvGenerates a dictionary with env variables required for
an interface. Used to support script execution for interfaces.
NMODEPHASE)get_envdictr   environupdater  )r"   rC   rW   cenv	iface_envs        r   generate_running_env!ifupdownMain.generate_running_env  sa    
 $$&	

#DI& D33B7VWr   c                    U R                   R                  (       a  U R                   R                  (       d  g  U R                  R	                  5         g ! [
         a  nU R                  R                  [        R                  5      (       aY  [        R                  5       S   n[        R                  " U5        U R                  R                  S[        U5      -  5         S nAg  S nAg S nAff = f)Nr  zerror saving state (%s))rT   r   r   rU   
save_stater@   rH   isEnabledForrw   rx   r  exc_infory   print_tbr|   r~   )r"   r   ts      r   _save_stateifupdownMain._save_state  s    

..

..	G((* 	G{{''66LLN1%""1%##$=s1v$EFF 7	Gs   A 
C/BC**C/c                     US:X  a  [         R                  U l        g US:X  a  [         R                  U l        g [         R                  U l        g )Nr  vlan)r-   IFACEr,   r.   r   )r"   r,   s     r   set_typeifupdownMain.set_type  s5    7?!DIV^!--DI!))DIr   c                 ~   U R                   (       d  g US:X  a  U R                  R                  nOUS:X  a  U R                  R                  nOg U R                    H$  n U R	                  U5      (       a
  U" U5        M$  M&     g ! [
         a/  nU R                  R                  [        U5      5         S nAM]  S nAff = f)NrP   rQ   )	r7   r>   r?   rJ   r=   r@   rH   r|   r~   )r"   rW   funcr4  r   s        r    _process_delay_admin_state_queue-ifupdownMain._process_delay_admin_state_queue  s    22:,,&&46\,,((444A##A&&7 ' 5  ##CF+s   B
B<$B77B<c                      [         R                  R                  R                  R	                  SUSS9$ ! [
         a,    [        R                  R                  R	                  SUSS9s $ f = f)Nr   exclude-companion)r   ifnamer   )r`   ra   rb   r   get_iface_defaultr@   r   s     r   _get_iface_exclude_companion)ifupdownMain._get_iface_exclude_companion  sx    	>%%33EEWW06y)< X > >  	>));;MM06y)< N > >	>s   25 3A+*A+c                    UnU H  nU R                  U5      nU=(       d    /  H~  nUR                  S5      nU(       a  M  U R                  U5      nU(       d  M7  UR                  5        H3  nXr;   a  M
  U R                  U5      (       d  M"  UR	                  U5        M5     M     M     U R
                  R                  SSR                  U5      -  5        U$ )Nr  z,excludepats after processing companions [%s]rF  )r  r  r  r  r8   rH   rI   r0  )r"   r  new_excludepatsr   r  rn  ecees           r   _preprocess_excludepats$ifupdownMain._preprocess_excludepats  s    %A**1-I!R../BCr::1=B "$((*B!4 (#11"55 !0 6 6r : #- (   	GRaIbbcr   c
           	      2   U R                  U5        U(       a  S[        R                  l        U R                  R                  (       d  SU R                  l        U(       a*  S[        R                  l        S[        R                  l         U R                  5       n
U(       a  U R                  U5      nSnU(       a*  U R                  U5      nU(       a  U R                  X#XT5      nU(       d#  [        U R                  R                  5       5      nU(       d+  U Vs/ s H  nU R!                  X#X\5      (       d  M  UPM      nnU(       d  [        S5      eU(       a#  U R#                  X5        U R%                  X5        gU R#                  U5        U(       aR  U R'                  U5      (       d
  [        5       eU
(       d
  [        5       eU R)                  U5      (       a
  [        5       egSn U R+                  XU	[        R                  R                  (       a  SOSS9nU R-                  S5        [        R                  R.                  (       d+  U R                  R                  (       a  U R1                  5         U
(       a  U(       d
  [        5       eU R3                  U5        g! [         a    e f = fs  snf ! U R-                  S5        [        R                  R.                  (       d-  U R                  R                  (       a  U R1                  5         f f f = f)a  This brings the interface(s) up

Args:
    ops (list): list of ops to perform on the interface(s).
    Eg: ['pre-up', 'up', 'post-up'

Kwargs:
    auto (bool): act on interfaces marked auto
    allow_classes (list): act on interfaces belonging to classes in the list
    ifacenames (list): act on interfaces specified in this list
    excludepats (list): list of patterns of interfaces to exclude
    syntaxcheck (bool): only perform syntax check
TFN*no ifaces found matching given allow lists)r  r  rP   )r  rc   rT   r  r   r   ALLr   r  r@   r  r  %_get_filtered_ifacenames_with_classesr  r   r  r  r  print_dependencyr_  _any_iface_errorsr  r
  r   r  check_running_configuration)r"   rt  r  r  r  r  printdependencysyntaxcheckr,   r  iface_read_retr^  r4  rn  s                 r   rP   ifupdownMain.up  sy   " 	d(,M%zz''-2DJJ*&*M#/3M,	!335N 66{CK"44Z@J&*&P&PQUfq&~# T->->-C-C-E(F:".8 #Aj'+'>'>t0;(@ $%j #A #HII))#C!!"5G))#.
 ,,-@AAk!!k!''(;<<k!		#$$%85D(5(;(;(H(H 7;*/	 % 1C 11$7 &&--$**2J2J  "S+(()<=w  		$#AD 11$7 &&--$**2J2J  " 3K-s%   J# J2;J2,2J7 #J/7ALc                    U(       d  / nU R                   R                  5        H  u  p4U(       d  X1;  a  M  SnU H  nUR                  (       a  M  Sn  O   [        R                  R
                  (       a  MT  U(       d  M]  [        R                  R                  SU-  5      (       a  M  U R                  R                  SU-  5        M     g)z
Print warning and better info message when we don't recognize an interface
AKA when the interface wasn't created.

:param filtered_ifacenames:
:param all:
:return:
TFr   zC%s: interface not recognized - please check interface configurationN)r   rH  r  rc   rT   r   r   r   rk   rH   r|   )r"   r^  r  r  ifaceobj_listr  rC   s          r   r  (ifupdownMain.check_running_configuration9  s     #"$%)%6%6%<%<%>!F6<D)}}} D *
 !&&---$$rww~~NadjNj?k?k##$ilr$rs &?r   c           	         [        U R                  R                  5       5       Vs/ s H  nU R                  XX55      (       d  M  UPM      nnXd-  nU H+  nU R	                  U5      =(       d    /  H
  nSUl        M     M-     U$ s  snf ru   )r  r   r  r  r  r  )	r"   r  r  r  r  r4  r^  intfr  s	            r   r  2ifupdownMain._get_filtered_ifacenames_with_classesT  s     +/t/@/@/E/E/G*H K*HQ"&"9"9$:E#J  !*H K 	)D))$/525"' 6  #"Ks   BBc	           	         U R                  U5        U(       a  S[        R                  l        U R                  R                  (       d  SU R                  l        U(       a*  S[        R                  l        S[        R                  l        U(       db  U R                  R                  (       aG  U R                  R                  (       a,  U R                  R                  S5        U R                  5         O U R                  5         U(       a  U R#                  U5      nSn
U(       a+   U R%                  U5      nU(       a  U R'                  X#XT5      n
U(       d#  [)        U R                  R+                  5       5      nU
(       d+  U Vs/ s H  nU R-                  X#X[5      (       d  M  UPM      n
nU
(       d  [        S5      eU(       a#  U R/                  X5        U R1                  X5        gU R/                  U5         U R3                  X[        R                  R                  (       a  SOSS	9  U R5                  S
5        [        R                  R6                  (       d-  U R                  R                  (       a  U R9                  5         ggg! [         a  n	[        S[!        U	5      -  5      eSn	A	ff = f! [         a  n	[        S[!        U	5      -  S-   5      eSn	A	ff = fs  snf ! U R5                  S
5        [        R                  R6                  (       d-  U R                  R                  (       a  U R9                  5         f f f = f)zdown an interface TFzLooking at old state ..zerror reading iface config (%s)Nz%sz$ (interface was probably never up ?)zSno ifaces found matching given allow lists (or interfaces were probably never up ?)r  rQ   )r  rc   rT   r  r   r   r  r   r   rU   r   rH   r   r  r  r@   r~   r  r  r  r  r  r  r  r  r  r
  r   r  )r"   rt  r  r  r  r  r  usecurrentconfigr,   r   r^  r4  s               r   rQ   ifupdownMain.downc  s   
 	d(,M%zz''-2DJJ*&*M#/3M, !TZZ%C%C%%22 KK78&&(K&&( 66{CK"? 77
Cz)-)S)STXit  *B& T->->-C-C-E(F:".8 #Ej&*&=&=d4?'D $%j #E # ? @ @ ))#C!!"5G))#.	#2"/"5"5"B"B 15HM  O 11&9 &&--$**2J2J  " 3K-_  K A3q6 IJJK   ?tSV|= > ? ??#E( 11&9 &&--$**2J2J  " 3K-sI   5J
 '*J3 K%K;1K$ 

J0J++J03
K=KK$AMc
           	         U R                  U	5        SU l        U(       a  S[        R                  l        U R                  R
                  (       a$  US   S:X  a  U R                  R                  U5      $ SU R                  l        Sn
U(       aE  U R                  R                  S5        S[        R                  l        S[        R                  l        US   S:X  a  U R                  U5        gUS   S:X  a&  U H  nU R                  U[        SS5      5        M!     O U R!                  US   S	:H  S
9n
U(       a  US   S:w  a  U R%                  U5      nU(       a  U R'                  X$Xe5      nU(       d#  [)        U R*                  R-                  5       5      nUS   S:X  a  UnO3U(       d,  U Vs/ s H  nU R/                  UUXk5      (       d  M  UPM!     nnW(       d  [#        S5      eU R1                  U5        US   S:X  a  U(       a  U R3                  X5        gU(       a#  US   S:X  d	  US   S	:X  a  U R5                  U5      $ US   S:X  a0  [        R                  R6                  (       d  U R9                  X5      $ US   S	:X  a  U R;                  X5      $ U R=                  X[        R                  R                  (       a  SOSS9nUS   S:X  a0  [        R                  R6                  (       a  U R9                  X5      $ US   S:X  a"  U R?                  X5      (       a  [#        S5      eOUS   S:X  a  U RA                  X5        gU
(       a  U(       d
  [#        5       eg! ["         a    e f = fs  snf )zquery an interface FTr   zquery-savedstatezsetting flag ALLzquery-syntaxNr   r   )rv  r  r   r   r*  r   r  )!r  r   rc   rT   r  r   rU   dump_prettyr   rH   r   r  r   r  r"  r   r  r@   r  r  r  r   r  r  r  r  print_ifaceobjs_listr   print_ifaceobjs_prettyprint_ifaceobjs_rawr  print_ifaceobjscurr_prettyprint_ifaceobjsrunning_pretty)r"   rt  r  format_listr  r  r  r  formatr,   r!  r4  r^  rn  s                 r   r   ifupdownMain.query  s?    	d
 */&(,M%::))c!f8J.J$$00<<).

&KK01&*M#/3M,q6^#v&V&++A~eT/JK  !%!7!7CFk<Q!7!R #a&O344Z@J"&"L"LTbm"z T->->-C-C-E(F: q6_$",%#%a**! :   # # !, - - 	%%c*q6''O!!"5GCFg-Q;1F,,-@AAq6W]%8%8%E%E../BKKV{"++,?HH  !4+11>> 37DI ! K q6W!4!4!A!A../BKKV((../BKKm# L V&../BKS+ &)s  "#s   M! .M0M0!M-c	           	      x   0 n
U R                   R                  S5         U R                  5       nU R                  (       d  U R                   R                  S5        g/ nU(       d#  [        U R                  R                  5       5      nU(       dc  U R                  R                  (       aH  U R                  R                  (       a-  [        U R                  R                  R                  5       5      n[        U5      R                  U5      n[        U5      R                  U5      nUnU R                  X5        U(       aR  U R                  U5      (       d
  [        5       eU(       d
  [        5       eU R                  U5      (       a
  [        5       egU(       a  U R                   R#                  S5      S:X  a  U R                   R                  S[%        U5      -  5        ['        U R                  5      n
['        U R(                  5      nU R+                  5         [-        0 5      U l        U Vs/ s H  nU R/                  X4UU5      (       d  M  UPM!     nnU R                  UU5        U R1                  UUSSS	9  OU R                   R                  S
5        U(       a*  S[2        R                  l        S[2        R                  l        U
(       a  Xl        WU l        U R                  (       d  U R                   R                  S5        gU R                   R                  S[%        U5      -  5        U R1                  X[2        R                  R6                  (       a  SOSS9n[2        R                  R8                  (       a  gU R;                  5         U(       a  U(       d
  [        5       eg! [         a    e f = fs  snf )zreload currently up interfaces z-reloading interfaces that are currently up ..nothing to reload ..exiting.N$ifreload_currentlyup_down_notpresentr   z'reload: schedule down on interfaces: %sFTr  r  no interfaces to down ..no interfaces to up'reload: scheduling up on interfaces: %sr*  )rH   rI   r  r@   r   r|   r  r  rT   r   rU   rG  
differencer  r_  r  r   r   r~   r  r   r  r   r  r  rc   r  r   r   r  )r"   upopsdownopsr  allowr  r  r+  r   
extra_argsnew_ifaceobjdictr!  already_up_ifacenames!already_up_ifacenames_not_present#already_up_ifacenames_still_presentinterfaces_to_upnew_dependency_graphr4  "falready_up_ifacenames_not_presentrn  s                       r   _reload_currentlyup ifupdownMain._reload_currentlyup  s7    HI	!335N   KK >? "T->->-C-C-E(F: TZZ%C%C%%22$():):)G)G)L)L)N$O! -0--//9z*/E 	*.1-///9z90; 	, ? 	%%e>
 ,,-=>>k!!k!''(899k!- FG3N;;E !BCD E #4#4#45"&t'<'<"= %%' $/r?4 $E15$E 89'+'>'>t$/(4 23$E . 15 (()KM@'/44  A ;;67 &*M#/3M, 0$8D!  KK23B./0 	1  !1$1$7$7$D$D 37JO ! Q %%S+ &)g  		d15s   N( -N7N7(N4c	           	         0 n
 U R                  5       nU R                  (       d  U R                  R	                  S5        gU(       d#  [        U R                  R                  5       5      nU Vs/ s H  nU R                  X4Xl5      (       d  M  UPM      nnU R                  U5        U(       aR  U R                  U5      (       d
  [        5       eU(       d
  [        5       eU R                  U5      (       a
  [        5       egU(       d  U R                  R                  (       ax  U R                  R                  (       a]  [        U R                  5      n
[        U R                  5      n[!        0 5      U l        [!        0 5      U l        U R#                  5         SnOSnU R                  n
U R                  nU(       a  U R%                  U5      nUS:X  Ga%  U(       Ga  [        U R                  R                  5       5      nU Vs/ s H  nU R                  X4Xl5      (       d  M  UPM      nn SU R                  l        U R                  U5        SU R                  l        [-        U R.                  R1                  SS	5      5      n/ n[        U R                  R                  5       5       GHx  nU R                  R1                  U5      nU R3                  US
   5      (       d  UU;  a  M@  S
nU
R1                  U5      nU(       d  UR5                  U5        Mm  U R7                  US
   5      (       Ga  U R3                  US
   5      (       Gd  US
   R9                  5       (       Ga  US
   R:                  (       Ga  SnUU   R<                  =(       d    /  H  n/ nU R                  R1                  U5       HU  nUR?                  URA                  S5      =(       d    / 5        UR?                  URA                  S5      =(       d    / 5        MW     SRC                  U5      nUU   RD                  U;  d  M  SU;  nU(       a  M    O   UU   RD                  < S[+        UU   R<                  5      < SUU   RD                  < S3nU(       a  U R                  R	                  U5        OUU   RD                  nUR5                  U5         U
(       a  U
U	 URG                  5        H  u  nn UU ;   d  M  U RI                  U5        M!     UU	 OUS
   R:                  (       a  US
   R:                  (       dn  U R                  R	                  UU   RD                  < S[J        RM                  US
   R:                  5      < S35        UR5                  UU   RD                  5        U(       d  GM  [O        U5      [O        U5      :w  a  UR5                  U5        GM)  [Q        S
[O        U5      5       H6  nUU   n!UU   n"U"RS                  U!5      (       a  M%  UR5                  U5        M8     GM{     U(       a  U R                  R)                  S[+        U5      -  5        [!        0 5      U l        SU R                  l        U R                  UU5        SU R                  l         SU R                  l*        U RW                  UUSSS9  SU R                  l*        U R[                  S5        OU R                  R)                  S5        U
(       d  U R                  R]                  S5        gU(       a*  S[^        R                  l0        S[^        R                  l1        Xl        Xl        U R                  R)                  S[+        U5      -  5        S[^        R                  l2         U RW                  X[^        R                  Rb                  (       a  SOSS9n#U R[                  S5        [^        R                  Rf                  (       a  gU Ri                  5         U(       a  U#(       d
  [        5       eg! [         a    e f = fs  snf s  snf ! [         a2  nU R                  R)                  S[+        U5      -  5         SnAGNSnAff = f! [         aM  nU R                  R	                  U5        U R                  R	                  S[+        U5      -  5         SnAGN0SnAff = f! [         a/  nU R                  RY                  [+        U5      5         SnAGNLSnAff = f! SU R                  l*        U R[                  S5        f = f! [         a1  nSn#U R                  RY                  [+        U5      5         SnAGNSnAff = f! U R[                  S5        f = f)reload interface config r8  NreloadrP   FTz;error generating dependency graph for saved interfaces (%s)ifreload_down_changedr   r   zbond-slaveszbridge-portsrF  r  z:: misconfig ? removed but still exists as a dependency of z0.
Please remove the dependency manually `ifdown z-` if it is being picked up as part of a regexzGwhile trying to fix this situation we ran into the following issues: %sz: moved from being a z to a physical interface (non-logical interface).This interface will be downed.
 If this was not intentional, please restore the original interface definition and execute ifreloadz)reload: scheduling down on interfaces: %sr:  rQ   r;  r<  r=  r*  )5r  r@   r   rH   r|   r  r  r  r  r_  r  rT   r   rU   r  r   r   r  r  r   rI   r~   r  r   r   r=  r8   r@  is_config_presentr/   r\  r  get_attr_valuer0  r9   rH  rs  r0   to_strr  r  r  r   r  rM  r
  r   rc   r  r   r   r   r  )$r"   r?  r@  r  rA  r  r  r+  r   rB  rC  r!  r4  new_filtered_ifacenamesrH  rW   old_filtered_ifacenamesr   down_changedifacedownlistr  lastifaceobjlistobjidxnewifaceobjlistprint_warningupperslavesupper_ifaceobjslaves_stringwarning_no_config_regexifname_to_remover  r  oldobjnewobjrn  s$                                       r   _reload_defaultifupdownMain._reload_defaulto  s?    	!335N   KK >?T->->-C-C-E(F:.8 #0j"&"9"9$*#/ $%j #0 	%%e,
 ,,-DEEk!!k!''(?@@k! TZZ%C%C%%22#D$5$56#'(=(=#>  +BD$/OD!
 &&(B B#00#'#8#8 66{CK>jd//4467J2< '0*Q"&"9"9$*#/ ()*# '05:

2--e459

2 t{{/FLML Mt005578#'#4#4#8#8#@ //0@0CDD %<<  #3"6"6v">&!((0 --oa.@AA001CDD$Q'99;;$Q'111 %)M!0!8!D!D!J!J!#.2.?.?.C.CE.JN"MM.*G*G*V*\Z\]"MM.*G*G*W*][]^ /K ),(8*6277}L,3=,HM#0= % "K  ,F388 7 C CD+F388 , %++,CD ,;6+B+G+G(%,,-=>a/$45E$F(<(B(B(D1#3q#8$%HH-=$> )E !55E F 'q)33'*44KK''
 )8(?(D(D(5(<(<=Ma=P=Z=Z([)] ^ "(()@)E)EF#'3/?+@@!((0
 $As+;'<=F-f5F,V4F!>>&11%,,V4  >A 9N   !L#&}#5"6 7 )4B% 6;

2--g}E59

2B ?CDJJ;&&}g8=,0 ' 2 ?DDJJ;99&A  !;<  KK34&*M#/3M,, 4B567 	8$(!		8$$%<(5(;(;(H(H 7;*/ % 1C 11$7%%S+ &)m  		#0V'0     "9:=a&"A Br  ) a KK//0GH KK// 1WY\]^Y_1` a aal ! KK%%c!f- ?DDJJ;99&A2  	&CKKc!f%%	& 11$7s   `  /`/`/`4!`4*3`9 $a8+a8#c 1d5  `,9
a5'a00a58
cAc

c
d$d d dd $d25
e0?&e+%e3 +e00e3 3fc                     U R                   R                  S5        UR                  SS5      (       a  U R                  " U0 UD6  OU R                  " U0 UD6  U R                  / SS9  g)rM  zreloading interface config ..currentlyupFT)r  N)rH   r   r   rJ  rc  r  )r"   r   kargss      r   rN  ifupdownMain.reloadp	  s_    9:99]E**$$d4e4  $0%0(((6r   c                     U He  nU R                  U5      nU(       d  M  U HB  nUR                  [        R                  :X  d   UR                  [        R                  :X  d  MA      g   Mg     g)NTF)r  statusr^  NOTFOUNDr_  )r"   r  r4  r  rC   s        r   r  ifupdownMain._any_iface_errorsz	  sW    A**1-Ih%OO{';';;OO{'8'88 &  r   c                     US-   n[        UR                  5       5       H  u  pEUSU< S[        U5      < S3-  nM     U R                  R	                  US-   5        g )Nz {
	 : 
})r  rH  r~   rH   r   )r"   prefixargdictoutbufr  vlists         r   r  'ifupdownMain._pretty_print_ordered_dict	  sK    &W]]_-HAaU44F .&3,'r   c                    U(       d#  [        U R                  R                  5       5      nUS:X  aH  [        U R                  R	                  5       5       H   u  p4[        U< S[        U5      < 35        M"     gUS:X  an  0 n[        U R                  R                  5       5       H$  nUR                  X`R                  U5      05        M&     [        R                  U R                  U5        gg)z$prints iface dependency information r  ro  dotN)r  r   r  r   rH  r  r~   r  r5  graphgenerate_dots)r"   r  r5  r  r  	indegreesr4  s          r   r  ifupdownMain.print_dependency	  s     d//4467JVD11779:!SV,- ;u_I$//4467  !%:%:1%=!>? 8 5 5yA	 r   c                 ,    U H  n[        U5        M     g r   )r  )r"   r  r4  s      r   r/  !ifupdownMain.print_ifaceobjs_list	  s    A!H r   c                    US:X  a  U R                  X5        gU H  nU R                  U5       H  nU R                  U5      (       a  M  UR                  U R                  5        [
        R                  R                  (       d  MW  [
        R                  R                  (       a  Mx  UR                  nU(       d  M  U R                  U5        M     M     g)z-prints raw lines for ifaces from config file r  N)r0  r  r=  dump_rawrH   rc   rT   r   r  r%  r1  )r"   r  r5  r4  rC   rN  s         r   r1   ifupdownMain.print_ifaceobjs_raw	  s     V''
;A ..q1++H55!!$++.!''444%++///$00E (,,U3 2 r   c                    U H  nU R                  U5       H  nU(       d  U R                  U5      (       dC  U(       a>  UR                  5       (       d)  U R                  U5      (       d  UR                  (       d  Me  UR                  U5        [        R                  R                  (       d  M  [        R                  R                  (       a  M  UR                  nU(       d  M  U R                  XbU5        M     M     g)zreturns iface obj list N)r  r@  rP  r:  r\  r8   rc   rT   r   r  r%  _get_ifaceobjs_pretty)r"   r  r  runningr4  rC   rN  s          r   r  "ifupdownMain._get_ifaceobjs_pretty	  s     A ..q1 T%>%>x%H%HX%?%?%A%A55a88!--  *!''444%++///$00E (..uI 2 r   c           	         / nU R                  X5        U(       d  gUS:X  a$  [        [        R                  U[        SSS95        g[        U R                  R                  SS5      5      nU Hq  nU(       dW  UR                  [        R                  -  (       a5  UR                  [        R                  -  (       a  UR                  SS	9  M_  Ma  UR                  5         Ms     g)
z:pretty prints iface in format given by keyword arg format Nr  r   r  rS  clsr   
separatorsifquery_ifacename_expand_ranger   T)use_realname)r  r  r  r  ifaceJsonEncoderr  r   r   rT   r  IFACERANGE_ENTRYIFACERANGE_STARTr.  )r"   r  r5  r  expandr4  s         r   r0  #ifupdownMain.print_ifaceobjs_pretty	  s     	"":9&V$**Y,<$%+  ? @ )I3OPF177U-C-C#Cww!7!77}}$}7 8 MMO r   c                    SnU GH  nU R                  U5      nU(       d  M  U H  nUR                  [        R                  :X  d  UR                  [        R                  :X  a  SnU R                  U5      (       a  MY  UR                  U5        [        R                  R                  (       d  M  [        R                  R                  (       a  M  UR                  nU(       d  M  U R                  Xr5      nU(       d  M  SnM     GM     U$ )Nr   r   )r/  rj  r^  rk  r_  r@  r8   rc   rT   r   r  r%  _get_ifaceobjscurr_pretty)	r"   r  r  rn  r4  ifaceobjscurrrC   rN  drets	            r   r  &ifupdownMain._get_ifaceobjscurr_pretty	  s    A 11!4M ()OO{';';;OO{'8'88C,,X66  *!''444%++///$00E (99%KDt1S *   
r   c           	         / nU R                  X5      nU(       d  gU R                  R                  S[        5      [        l        U R                  R                  S[        5      [        l        U R                  R                  SS5      [        l        US:X  a%  [        [        R                  U[        SSS	95        U$ U H  nUR                  S
S9  M     U$ )zpretty prints current running state of interfaces with status.

returns 1 if any of the interface has an error,
else returns 0
Nifquery_check_success_strifquery_check_error_strifquery_check_unknown_strr  r  r  r  r  T)with_status)r  r   r   _success_symifaceStatusUserStrsSUCCESS
_error_symr_  r   r  r  r  ifaceJsonEncoderWithStatusr.  )r"   r  r5  r  rn  rC   s         r   r2  'ifupdownMain.print_ifaceobjscurr_pretty	  s     	,,ZC& '+kkoo6QS_&`#$(KKOO4Mz$Z!&*kkoo6QSU&V#V$**Y,F$%+  ? @
 
 &$$$6 &
r   c           	          / nU R                  XSS9  U(       d  gUS:X  a$  [        [        R                  U[        SSS95        gU H  nUR                  5         M     g)z"pretty prints iface running state T)r  Nr  r  r  r  )r  r  r  r  r  r.  )r"   r  r5  r  r4  s        r   r3  *ifupdownMain.print_ifaceobjsrunning_pretty	  s`     	"":$"G&V$**Y,<Q"-  / 0  r   c                     [        S5        [        U R                  R                  U R                  5      5        [        U R                  R                  U R                  5      5        g )Nzifupdown main object dump)r  r   r   r\   r   rg   s    r   _dumpifupdownMain._dump	
  s?    )*dggnnT\\*+dggnnT../0r   c                     U HC  nU R                  U5      nU H)  nUR                  U R                  5        [        S5        M+     ME     g )Nrp  )r  dumprH   r  )r"   r  r4  r  s       r   _dump_ifaceobjsifupdownMain._dump_ifaceobjs
  s=    A**1-It{{#d  r   )r   r6   r7   r   r   r   r   r   r   rT   r   r   r   r   r   r   rH   r   r]   r   r\   r>   r   r   r   r   rU   r,   r   ru   )r   r   )F)FTF)FNNNNFNF)FNNNNFN)FFNNNNr   N)FNNNFF)r   )|r   r   r   r   __doc__r   r   r   r   r  rD   r5   rN   r   ops_handlersrX   sched_hooksrh   rr   r   r   r=   r%   r   r   r  r  r  r  r  r  r"  r*  r/  r5  r:  r=  r@  rC  rT  ra  rk  ro  rz  r  r  r  r  r  r  r  r  r   r   r  r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   rG  rP  rX  r_  rk  rp  r  r  r  r   r   r  r   r  r  r  r  r  r  r  r  r  r
  r  r  rP   r  r  rQ   r   rJ  rc  rN  r  r  r  r/  r1  r  r0  r  r2  r3  r  r  r   r   r   r   r(   r(   Y   s     K)/<@ v!' 2 4 5L:  ;<K*> !tU5U!Dd 9%)&.#
B)$0.4 <@).%	 	F3T.	74	Q&P>$2$014Tl":*:29'WWWWUU$$-.(MMO0UR4l".0 B4&22J
"3Aj_5n. >C271 	86p(G*">* BF?D&+W>rt6# DHFKJ#X GK04$(^@ EI@E^@ AE@EB7(B4$J"$&(, 1
r   r(   )9rm   r   rw   r  ry   r   collectionsr   ifupdown2.lib.nlcachelibr   $ifupdown2.ifupdownaddons.mstpctlutilr`   ifupdown2.nlmanager.ipnetwork	nlmanagerr   ifupdown2.ifupdown.policymanagerifupdown2.ifupdown.statemanagerra   rU    ifupdown2.ifupdown.ifupdownflagsrc   !ifupdown2.ifupdown.ifupdownconfigifupdownconfigrd   ifupdown2.ifupdown.graphifupdown2.ifupdown.ifaceifupdown2.ifupdown.schedulerifupdown2.ifupdown.exceptions$ifupdown2.ifupdown.networkinterfacesifupdown2.ifupdown.configr   r   r   ImportErrorModuleNotFoundErrorlib.nlcacheifupdownaddons.mstpctlutilre   nlmanager.ipnetworkifupdown.ifupdownflagsifupdown.policymanagerifupdown.statemanagerifupdown.ifupdownconfigifupdown.graphifupdown.ifaceifupdown.schedulerifupdown.exceptionsifupdown.networkinterfacesifupdown.config	_tickmark
_crossmarkr  r  r	   r   r(   r   r   r   <module>r     s    
 	     #$c++/55+::<<>>**./6ll, 	
y Z
# #! !z& z&i 	() c!%+!!024  $%,bb%cs   AB& &AC>=C>