
    /I_T                         S SK r S SKrS SKrS SKrS SKr S SK7  S SKJr  S SKJ	r	  Sr " S S5      rg! \
\4 a    S SK7  S SKJr  S SKJ	r	   N(f = f)    N)*)utils)templateEnginez
	 c                       \ rS rSrSr/ SQ/ SQS.r    SS jr\S 5       rS 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 rS rS rS rS rS!S jrS!S jrS rSrg)"networkInterfaces   z4debian ifupdown /etc/network/interfaces file parser )staticmanualloopbackdhcpdhcp6ppptunnel)inetinet6Nc                    / U l         0 U l        SU l        Xpl        [        R
                  " SU R                  R                  -   5      U l        SSSS.U l        0 U l	        Xl
        X l        X0l        U R                  /U l        SU l        X@l        XPl        X`l        SU l        [&        R(                  " S5      U l        SU l        SU l        g)a  This member function initializes the networkinterfaces parser object.

Kwargs:
    **interfacesfile** (str):  path to the interfaces file (default is /etc/network/interfaces)

    **interfacesfileiobuf** (object): interfaces file io stream

    **interfacesfileformat** (str): format of interfaces file (choices are 'native' and 'json'. 'native' being the default)

    **template_engine** (str): template engine name

    **template_lookuppath** (str): template lookup path

Raises:
    AttributeError, KeyError Fz	ifupdown.N)iface_foundvalidateifaceattrvalidateifaceobjz	[\s\t]\s*r   )auto_ifaces	callbacksauto_allrawlogging	getLogger	__class____name__loggerallow_classesinterfacesfileinterfacesfileiobufinterfacesfileformat
_filestack_template_engine_template_enable_template_engine_name_template_engine_path_currentfile_has_templaterecompile_ws_split_regexerrorswarns)selfr    r!   r"   template_enabletemplate_enginetemplate_lookuppathr   s           2/usr/share/ifupdown2/ifupdown/networkinterfaces.py__init__networkInterfaces.__init__#   s    ( ''NN++), -*.04/35  ,#6 $8!../ $ /%4"%8").&!zz,7
    c                 Z     U R                   S   $ ! [         a    U R                  s $ f = f)N)r#   	Exceptionr    r.   s    r2   _currentfilenetworkInterfaces._currentfileQ   s1    	'??2&& 	'&&&	's    **c                     US:X  d  U R                   (       a#  U R                  R                  U< SU< 35        O U R                  R                  SXU4-  5        U =R                  S-  sl        g Nr7   z: z%s: line%d: %s   )r(   r   errorr,   r.   filenamelinenomsgs       r2   _parse_errornetworkInterfaces._parse_errorX   sS    R<499KK378KK.30GGHqr5   c                     US:X  d  U R                   (       a#  U R                  R                  U< SU< 35        O U R                  R                  SXU4-  5        U =R                  S-  sl        g r=   )r(   r   warningr-   r@   s       r2   _parse_warnnetworkInterfaces._parse_warn_   sR    R<499KK8S 9:KK 08S2I IJ

a
r5   c           
         UR                    H  nU R                  R                  U5      (       d@  U R                  U R                  USUR
                  < SU< S35        / Ul         S Ul          g UR                  (       ag  UR                  U R                  R                  U5      ;  a<  U R                  U R                  USUR
                  < SUR                  < S35        M  M  SUl        M     g )Niface z: unsupported address family ''z: unsupported address method 'r	   )addr_family	_addrfamsgetrD   r:   nameaddr_method)r.   ifaceobjrB   familys       r2   _validate_addr_family'networkInterfaces._validate_addr_familyf   s    **F>>%%f--!!$"3"3V%-]]F#<= (*$'+$##''t~~/A/A&/II%%d&7&7 *28L8L'NO J (0$ +r5   c                     U[        U R                  R                  5       5      ;  a  [        SU-   5        gX R                  U'   g)a  This member function registers callback functions.

Args:
    **callback_name** (str): callback function name (supported names: 'iface_found', 'validateifaceattr', 'validateifaceobj')

    **callback_func** (function pointer): callback function pointer

Warns on error
zwarning: invalid callback r7   N)listr   keysprint)r.   callback_namecallback_funcs      r2   	subscribenetworkInterfaces.subscribex   s;     T^^%8%8%: ;;.>?(5}%r5   c                 P    UR                  [        5      nU(       a	  US   S:X  a  gg)Nr   #r>   )stripwhitespaces)r.   linels      r2   ignore_linenetworkInterfaces.ignore_line   s#    JJ{#AaDCKr5   c                 n   X   n[         R                  " U R                  U5      n[        U5      S::  a  [	        SXC4-  5      eUS   R                  S5      S   nUSS  nU R
                  R                  U5      (       a(  U H!  nU R
                  U   R                  U5        M#     gXpR
                  U'   g)Nr>   z"invalid allow line '%s' at line %dr   -)r)   splitr+   lenr8   r   rO   append)	r.   linescur_idxrB   
allow_linewordsallow_class
ifacenamesis	            r2   process_allownetworkInterfaces.process_allow   s    ^
--z:u:?B(12 3 3 AhnnS)!,12Y
!!+.."";/66q9    3="";/r5   c                    U R                   R                  SX   -  5        [        R                  " U R                  X   S5      S   nU(       a_  [
        R
                  " U5      nU(       d'  SU;  a   U R                  U R                  USU-  5        gU H  nU R                  U5        M     gU R                  U R                  US5        g)Nzprocessing sourced line ..'%s'   r>   r   zcannot find source file %sr   zunable to read source line)
r   debugr)   rh   r+   globrH   r:   	read_filerD   )r.   rk   rl   rB   sourced_file	filenamesfs          r2   process_source networkInterfaces.process_source   s    <enLMxx 4 4enaHK		,/Il*$$T%6%68,FHq! 
  d//02r5   c           	         [         R                  " U R                  X   5      SS  nU(       d#  U R                  U R                  USX   -  5        gU H  nUS:X  a	  SU l          g[        R                  " U5      nU(       a  [        U5      S:X  a@  [        US   US   S-   5       H&  nU R                  R                  SUS   U4-  5        M(     OQ[        U5      S	:X  aB  [        US   US   S-   5       H)  nU R                  R                  S
US   XvS   4-  5        M+     U R                  R                  U5        M     g)Nr>   zinvalid auto line '%s'r   allT   ru   %s%d   %s%d%s)r)   rh   r+   rD   r:   r   r   parse_iface_rangeri   ranger   rj   )r.   rk   rl   rB   r   arrq   s           r2   process_autonetworkInterfaces.process_auto   s/   hht33U^DQRHd//.u~=?AEz $  ''*Aq6Q;"1Q41a0((//1q	0AB 1Vq["1Q41a0((//1Q4aD/0IJ 1 ##A&  r5   c           	      .   UR                  SS5      n U R                  R                  S5      " UU5      (       d'  U R                  U R                  USU< SU< S35        g  UR                  U/ 5      nUS;   ak  UR                  S5      nU(       aR  [        S	[        U5      [        U5      -
  S
-
  5       H  n	UR                  S5        M     UR                  U5        XrU'   g g U(       d  U/X&'   g X&   R                  U5        g ! [
         a     Nf = f)N_rg   r   rK   z: unsupported keyword ())scopenetmask	broadcastzpreferred-lifetimeaddressr   r>    )	replacer   rO   rD   r:   r8   r   ri   rj   )
r.   	ifacenameiface_configattrnameattrvalrB   newattrnameattrvallistaddrlistrq   s
             r2   _add_to_iface_config&networkInterfaces._add_to_iface_config   s   &&sC0	>>%%&9:;&-/ /!!$"3"3V#X/0 / #&&{B7QQ $''	2Hq#h-#k2B"BA"EFA&&r* G""7+,7[)  )0	L%%,,W5/  		s   AD 
DDc           
         SnUnX   R                  [        5      n[        R                  " U R                  U5      nUS   n	[
        R                  " U	5      (       d;  [
        R                  " U	5      (       a   U R                  U R                  USU	-  5        SU	;   a   U R                  U R                  USU	-  5        U R                  (       a  UR                  R                  U5        [        R                  " 5       n
[        US-   [!        U5      5       GH8  nX   R                  [        5      nU R#                  U5      S:X  a.  U R                  (       a  UR                  R                  U5        M^  [        R                  " U R                  US5      nU R%                  US   5      (       a  US-  n  O[!        U5      S:  a(  U R'                  U R                  USU	< SU< S	35        M  U R                  (       a  UR                  R                  U5        US   n[        R(                  " S
XS   5      nU R+                  XUXS-   5        GM;     Xb-
  nU	R-                  S5      S:w  a  U	R                  S5      S   Ul        OXl        Xl        UR3                  5          US   (       a  UR4                  R                  US   5        US   Ul        U R;                  XC5        U R<                  (       d  UR.                  U R>                  ;   a  SUl         U RC                  UR.                  5      nU(       a!  U Vs/ s H  nURE                  U5      PM       nU$ ! [8         a     Nf = fs  snf )Nr   r>   %s: interface name too long$z+%s: unexpected characters in interface nameru   rK   z: invalid syntax 'rL   z\$IFACE:r7   r   T)#r`   ra   r)   rh   r+   r   is_ifname_rangecheck_ifname_size_invalidrH   r:   r   
raw_configrj   collectionsOrderedDictr   ri   rd   _is_keywordrD   subr   findrP   configgenerate_envrM   rQ   
IndexErrorrT   r   r   autoget_allow_classes_for_iface	set_class)r.   rk   rl   rB   rR   lines_consumedline_idx
iface_lineiface_attrsr   r   rc   attrsr   r   classescs                    r2   parse_ifacenetworkInterfaces.parse_iface   s   ^))+6
hht33Z@N	%%i00++I66T..:IEG )D--vA9LN 88&&z2"..0gk3u:6H%%k2A"a'88''..q1HHT111a8Ea))A5zA~!!$"3"3X<EqIKxx##**1-QxHffZ!H=G%%ix&-z;) 7, "+ >>#"$%OOC03HM%M&	1~$$++KN;#.q>H  	""84==X]]d.>.>> HM228==A,34GqX"G4  		 5s   $2M ?M.
M+*M+c                 ~    [         R                  " U5      nSUR                  -  Ul        X%l        X5l        XEl        U$ )Nz%s)copydeepcopyrP   realnametypeflags)r.   rR   newifaceobjnamenewifaceobjtypenewifaceobjflagsifaceobj_news         r2   _create_ifaceobj_clone(networkInterfaces._create_ifaceobj_clone;  s9    }}X. $hmm 3++-r5   c                 B   [        5       nU R                  XX45      n[        R                  " UR                  5      nU(       Ga  [        U5      S:X  a  [        US   US   S-   5       H  nSUS   U4-  n[        R                  " U5      (       a   U R                  U R                  USU-  5        [         R                  n	XvS   :X  a  U	[         R                  -  n	U R                  UXR                  U	5      n
U R                  R                  S5      " U
5        M     U$ [        U5      S:X  a  [        US   US   S-   5       H  nS	US   XvS   4-  n[        R                  " U5      (       a   U R                  U R                  USU-  5        [         R                  n	XvS   :X  a  U	[         R                  -  n	U R                  UXR                  U	5      n
U R                  R                  S5      " U
5        M     U$ U R                  R                  S5      " U5        U$ )
Nr   r>   ru   r   r   r   r   r   r   )ifacer   r   r   rP   ri   r   r   rH   r:   IFACERANGE_ENTRYIFACERANGE_STARTr   r   r   rO   )r.   rk   rl   rB   rR   r   	range_valvr   r   r   s              r2   process_ifacenetworkInterfaces.process_ifaceE  s   7))%&K++HMM:	9~"y|Yq\!^<A &1q(9 9I66yAA(():):F)F	)QS!22EaL(!7!77#'#>#>x(1==%$ILNN&&}5lC =4  Y1$y|Yq\!^<A (9Q<aL*I II66yAA(():):F)F	)QS!22EaL(!7!77#'#>#>x(1==%$ILNN&&}5lC =  NN}-h7r5   c           	         [        5       nU R                  XX45      n[        R                  " UR                  5      nU(       GaI  [        U5      S:X  a  [        US   US   S-   5       Hy  n[         R                  nXvS   :X  a  U[         R                  -  nU R                  USUS   U4-  [        R                  U5      n	U R                  R                  S5      " U	5        M{     U$ [        U5      S:X  a  [        US   US   S-   5       H|  n[         R                  nXvS   :X  a  U[         R                  -  nU R                  USUS   XvS   4-  [        R                  U5      n	U R                  R                  S5      " U	5        M~     U$ [        R                  Ul        U R                  R                  S5      " U5        U$ )	Nr   r>   ru   r   r   r   r   r   )r   r   r   r   rP   ri   r   r   r   r   	ifaceTypeBRIDGE_VLANr   rO   r   )
r.   rk   rl   rB   rR   r   r   r   r   r   s
             r2   process_vlannetworkInterfaces.process_vlanh  s   7))%&K++HMM:	9~"y|Yq\!^<A!22EaL(!7!77#'#>#>x(.1q0A(A(1(=(=u$FL NN&&}5lC =,  Y1$y|Yq\!^<A!22EaL(!7!77#'#>#>x(09Q<aL2Q(Q(1(=(=(-$/L NN&&}5lC =  &11HMNN}-h7r5   )sourceallowr   r   vlanc                     U[        U R                  R                  5       5      ;   d  UR                  S5      S   S:X  a  gg)Nrg   r   r   r>   )rW   network_elemsrX   rh   )r.   strs     r2   r   networkInterfaces._is_keyword  s9    4**//122IIcN1(r5   c                 `    UR                  S5      S   nU R                  R                  U5      $ )Nrg   r   )rh   r   rO   )r.   r   tmp_strs      r2   _get_keyword_func#networkInterfaces._get_keyword_func  s+    ))C.#!!%%g..r5   c                     / n[        U R                  R                  5       5       H  u  p4X;   d  M  UR                  U5        M     U$ N)rW   r   itemsrj   )r.   r   r   
class_namerp   s        r2   r   -networkInterfaces.get_allow_classes_for_iface  sB    &*4+=+=+C+C+E&F"J&z* 'G r5   c                 ~   SR                  S UR                  S5       5       5      nSnSnUR                  S5      nU Vs/ s H  oUR                  [        5      PM     nnU[	        U5      :  a  U R                  Xb   5      (       a  US-  nM.  [        R                  " U R                  Xb   5      nU(       d  US-  nM_  U R                  US   5      (       a%  U R                  US   5      nU" XX"S-   5      nX#-  nO%U R                  U R                  US-   SXb   -  5        US-  nU[	        U5      :  a  M  gs  snf )N c              3   @   #    U  H  oR                  5       v   M     g 7fr   )r`   ).0ds     r2   	<genexpr>7networkInterfaces.process_interfaces.<locals>.<genexpr>  s     D/C!GGII/Cs   \r   
r>   zerror processing line '%s')joinrh   r`   ra   ri   rd   r)   r+   r   r   rD   r:   )	r.   filedatar   r   r   rc   rk   rn   keyword_funcs	            r2   process_interfaces$networkInterfaces.process_interfaces  s/    88Dx~~d/CDD^^D)
/9:z!%z:#e*$00AHHT115?CEAa))#55eAh?!-d8aZ!P*!!$"3"3X\6GIMH! #e*$" % ;s   D:c           	      ,   SU l         U(       a  SU;   a   U R                  (       d.  [        U R                  U R                  U R
                  S9U l        U R                  R                  U5      nX!L a  SU l         OSU l          U(       a7  [        U[        5      (       a  UR                  5       nU R                  U5        g U R                  U5        g ! [         a5  nU R                  U R                  SS[        U5      -  5        S n S nANS nAff = f)NF%)r0   r/   r1   Tr7   zGfailed to render template (%s). Continue without template rendering ...)r(   r$   r   r&   r%   r'   renderr8   rD   r:   r   
isinstancebytesdecoder   )r.   r   rendered_filedataes       r2   read_filedatanetworkInterfaces.read_filedata  s    ).&x),,,:(,(B(B(,(=(=,0,F,F-HD) %)$9$9$@$@$J!$05:D259D2 !/77(9(@(@(B%''(9:)  )!!$"3"3R"k$'F#+, %)!	)s   A%C <C 
D+DDc                    U(       a  U R                  U5        g U R                  R                  U5        U R                  R	                  SU-  5         [        U5       nUR                  5       nS S S 5        U R                  W5        U R                  R                  5         g ! , (       d  f       N:= f! [         a0  nU R                  R                  SU[        U5      5         S nAg S nAff = f)Nprocessing interfaces file %szerror processing file %s (%s))r   r#   rj   r   infoopenreadr8   rG   r   pop)r.   rA   	fileiobufr{   r   r   s         r2   rx   networkInterfaces.read_file  s    y)x(8(BC	h1668   	8$   	KK ?%s1v/	s6   B5 B$0B5 $
B2.B5 2B5 5
C/?&C**C/c                 `   U(       a  [         R                  USS9nONU(       aG  U R                  R                  SU-  5        [	        U5       n[         R                  U5      nS S S 5        [        W[        5      (       d  U/nSnU H~  n[        R                  U5      nU(       d  M!  U R                  U5        U R                  R                  S5      " U5      (       d  US-  nU R                  R                  S5      " U5        M     U =R                  U-  sl        g ! , (       d  f       N= f)Nzutf-8)encodingr   r   r   r>   r   )jsonloadsr   r   r   loadr   rW   ifaceJsonDecoderjson_to_ifaceobjrT   r   rO   r,   )r.   rA   r   
ifacedictsfpr,   	ifacedictrR   s           r2   read_file_json networkInterfaces.read_file_json  s    I@JKK<hFGh2!YYr]
  
 *T**$J#I'88CHx**84~~))*<=hGGaKF""=1(; $ 	v!  s   D
D-c                    U R                   (       d]  U R                  (       dL  U R                  R                  S5        U R                  R                  S5        U =R                  S-  sl        gU R
                  S:X  a&  U R                  U R                   U R                  5      $ U R                  U R                   U R                  5      $ )zThis member function loads the networkinterfaces file.

Assumes networkinterfaces parser object is initialized with the
parser arguments
zno terminal line stdin used or z#no network interfaces file defined.r>   Nr  )r    r!   r   rG   r-   r"   r
  rx   r9   s    r2   r  networkInterfaces.load  s     ""4+C+CKK ABKK EFJJ!OJ$$.&&t':':'+'?'?A A~~d11"668 	8r5   )r(   r#   r%   r$   r&   r'   r+   r   r   r   r   r,   r    r"   r!   r   r   r-   )z/etc/network/interfacesNnative0NNF)r7   r   ) r   
__module____qualname____firstlineno____doc__rN   r3   propertyr:   rD   rH   rT   r\   rd   rr   r|   r   r   r   r   r   r   r   r   r   r   r   r   rx   r
  r  __static_attributes__ r5   r2   r   r      s    ?\]_I '@@H6:/4,\ ' '0$6"$$.!6FL\!F> '5%2&2&3%1	3M/8*< 08r5   r   )r)   r   rw   r   r   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.ifupdown.templater   ImportErrorModuleNotFoundErrorifupdown.ifaceifupdown.utilsifupdown.templatera   r   r  r5   r2   <module>r     sW    
    1*.: u8 u8 	() 1 $01s   4 AA