
    x[h#                         S SK r S SKrS SKrS SKJr  S SKJr  S SKJrJ	r	J
r
  S SKJrJrJrJrJr  \R"                  " \5      r " S S5      r " S S	5      rg)
    N)defaultdict)	lru_cache)IPv4AddressIPv4InterfaceIPv6Interface)DictListOptionalTupleUnionc                       \ rS rSrSrS r\S\4S j5       r\S\4S j5       r	\S\4S j5       r
\S\4S j5       r\S\4S	 j5       rS
rg)Ifstate   z
This class holds the parsed state of a BSD network interface.
It is itself side-effect free.
All methods with side-effects should be implemented on one of the
``BSDNetworking`` classes.
c                     Xl         SU l        0 U l        0 U l        SU l        / U l        / U l        / U l        SU l        SU l	        / U l
        S U l        S U l        S U l        S U l        / U l        0 U l        / U l        g )Nr   F)nameindexinetinet6upoptionsnd6flagsmtumetricgroupsdescriptionmediastatusmacmacsvlanmembers)selfr   s     D/usr/lib/python3/dist-packages/cloudinit/distros/parsers/ifconfig.py__init__Ifstate.__init__   s    	
	

*.$(
%)"&		    returnc                 L    SU R                   ;   =(       d    SU R                  ;   $ )Nloopbacklo)r   r   r#   s    r$   is_loopbackIfstate.is_loopback.   s    TZZ'>44;;+>>r'   c                     SU R                   ;   a  gU R                   / :X  a"  U R                  (       a  SU R                  ;   a  gg)NegressTEthernetF)r   r   r,   s    r$   is_physicalIfstate.is_physical2   s6     t{{";;"
djj0Hr'   c                      SU R                   ;   $ )Nbridger   r,   s    r$   	is_bridgeIfstate.is_bridge;   s    4;;&&r'   c                      SU R                   ;   $ )Nlaggr6   r,   s    r$   is_bondIfstate.is_bond?   s    $$r'   c                 L    SU R                   ;   =(       d    U R                  0 :g  $ )Nr!   )r   r!   r,   s    r$   is_vlanIfstate.is_vlanC   s    $++%;499?;r'   )r   r   r   r   r   r   r   r    r   r"   r   r   r   r   r   r   r   r!   N)__name__
__module____qualname____firstlineno____doc__r%   propertyboolr-   r2   r7   r;   r>   __static_attributes__ r'   r$   r   r      s    ( ?T ? ? T   '4 ' ' % % % < < <r'   r   c            
           \ rS rSrSrS r\" 5       S\S\\\	\
\\
   4   4   4S j5       rS rS\S\\\4   4S	 jrS
 rS\S\\\4   4S jrS\S\4S jrSrg)IfconfigH   a  
A parser for BSD style ``ifconfig(8)`` output.
For documentation here:
- https://man.freebsd.org/ifconfig(8)
- https://man.netbsd.org/ifconfig.8
- https://man.openbsd.org/ifconfig.8
All output is considered equally, and then massaged into a singular form:
an ``Ifstate`` object.
c                      0 U l         0 U l        g N)_ifs_by_name_ifs_by_macr,   s    r$   r%   Ifconfig.__init__S   s    r'   textr(   c                 	   Sn[        [        5      nSnUR                  5        GH  nU(       d  M  US   S;  aR  US-  nUR                  5       S   nUR	                  S5      (       a  USS n[        U5      nX$l        X@R                  U'   U(       d  Mq  UR                  5       R                  5       R                  5       n[        U5      S:  ax  US   R                  S5      (       a_  U R                  U5      nU0 :w  aH  [        R                  " US   5      Ul        US	   Ul        S
U;   a
  US
   Ul        SU;   a
  US   Ul        US   R                  S5      (       a5  [&        R                  " SUS   5      n	UR                  R)                  U	5        US   S:X  a  [+        US   5      Ul        US   S:X  a  XUR                  S5      S-   S Ul        US   R                  S5      (       d2  US   R                  S5      (       d  US   R                  S5      (       aP  [&        R                  " SUS   5      n
[        U
5      S:  a'  U=R.                  U
S   R                  S5      -  sl        US   S:X  a>  US   Ul        UR2                  R)                  US   5        X7S      R)                  U5        US   S:X  a4  UR2                  R)                  US   5        X7S      R)                  U5        US   S:X  a  U=R4                  USS -  sl        US   S:X  a  XUR                  S5      S-   S Ul        US   S:X  aB  [&        R                  " SUS   5      n[        U5      S:  a  US   R                  S5      Ul        US   S:X  a
  US   Ul        US   S:X  a:  U R=                  U5      n[        R                  " US   5      UR>                  US   '   US   S:X  a:  U RA                  U5      n[        R                  " US   5      URB                  US   '   US   S:X  d	  US   S:X  a  U=RD                  US   -  sl"        US   S :X  d  GM0  0 Ul#        US   URF                  S!'   [I        S[        U5      5       H!  nX}   S":X  d  M  X}S-      URF                  S#'   M#     GM     [K        U5      U l&        0 U R                  EU RL                  E$ )$a  
Parse the ``ifconfig -a`` output ``text``, into a dict of ``Ifstate``
objects, referenced by ``name`` *and* by ``mac`` address.

This dict will always be the same, given the same input, so we can
``@lru_cache()`` it. n.b.: ``@lru_cache()`` takes only the
``__hash__()`` of the input (``text``), so it should be fairly quick,
despite our giant inputs.

@param text: The output of ``ifconfig -a``
@returns: A dict of ``Ifstate``s, referenced by ``name`` and ``mac``
r   N)	    :zflags=r   r   r   r   zcapabilities=<|>r   zdescription:   zoptions=ec_capabilities
ec_enabled,etherhwaddrzgroups:zmedia:z: r   r   r   r   zmember:z	laggport:zvlan:idz
interface:link)'r   list
splitlinessplitendswithr   r   rN   lowerstriplen
startswith_parse_flagscopydeepcopyr   r   r   r   reappendintr   r   r   r    r   r   r   r   _parse_inetr   _parse_inet6r   r"   r!   rangedictrO   )r#   rQ   ifindex
ifs_by_macdevlinecuriftoksr   capsr   nd6_optsipis                 r$   parseIfconfig.parseW   s`     &
OO%DAwk)
 1

Q>>#&&!#2JEen#	+.!!%( ::<%%'--/D4y1}a!3!3H!=!=))$/B; $eGn =CI"4[CF~"',5(%*8_
Aw!!/22xxQ0		  &Aw'!QL	Aw.("&zz#':'<"= Q"":..7%%&7887%%l33((6473w<!#KK71:#3#3C#88K Aw'!q'Q(7#**3/Aw("Q(7#**3/Aw)#

d12h&
Aw(" D!1A!5!78	Aw%88FDG4x=1$&qk//4CGAw("!!W
Aw& %%d+"&--1"6AAw'!&&t,#'==A#7		"Q%  Aw)#tAw+'=tAw&Aw'!!%aq#d),Aw,.+/A;( -y &@  
+8$##8t'7'788r'   c                     U R                   $ rM   )rO   r,   s    r$   rt   Ifconfig.ifs_by_mac   s    r'   rx   c                 v   S nSUS   ;   a$  [        US   5      n[        UR                  5      nO6[        [        [	        US   S5      5      5      n[        US   < SU< 35      nSU;   a  XR                  S5      S-      nUR                  R                  S5      S   n[        UR                  5      UUUS.4$ )N/rU      r   	broadcast)netmaskr   	prefixlen)	r   strr   r   rn   r   with_prefixlenrc   r{   )r#   rx   r   r{   r   r   s         r$   ro   Ifconfig._parse_inet   s    	$q'>tAw'B"**oG+c$q'1o67G$q'7;<B$ZZ4q89I%%++C03	J"&&
 	
r'   c                 ^    [        S[        U5      5       H  nX   S:X  d  M  XS-      s  $    g )NrY   r   rU   )rq   rg   )r#   rx   r|   s      r$   _get_prefixlenIfconfig._get_prefixlen   s-    q#d)$Aw+%E{" %r'   c                    S nSUS   ;   aW  SnUS   R                  S5      u  p4SU;   a  UR                  S5      S   nOU R                  U5      n[        U< SU< 35      nOUSUS   ;   a&  [        US   5      nUS   R                  S5      S   nO&U R                  U5      n[        US   < SU< 35      nU(       d  UR                  (       a  SnOU(       d  UR                  (       a  Sn[        UR                  5      XRS.4$ )N%rU   z
link-localr   z
site-local)r   scope)rc   r   r   is_link_localis_site_localr   r{   )r#   rx   r   ip6restr   r{   s          r$   rp   Ifconfig._parse_inet6   s    $q'> EQc*ICd{ JJsOA.	 //5	#y9:BDG^tAw'BQc*1-I++D1I$q'9=>B)) E2++ EBEE
)DEEr'   c                 ^   [         R                  " SUS   5      n0 n[        U5      S:  a  US   R                  S5      US'   SUS   ;   a  SUS'   OSUS'   [        S[        U5      5       H=  nX   S	:X  a  [	        XS-      5      US	'   M   X   S
:X  d  M*  [	        XS-      5      US
'   M?     U$ )NrX   rU   r\   r   r   TFrY   r   r   )rl   rc   rg   rq   rn   )r#   rx   r   retts        r$   ri   Ifconfig._parse_flags  s    a)u:> 8>>#.CLs7|# D	!D	1c$i(7h&$'U$4CMW%!$Ta%[!1CJ	 )
 
r'   )rO   rN   N)r@   rA   rB   rC   rD   r%   r   r   r   r   r   r	   r}   rt   ra   r   rr   ro   r   rp   ri   rG   rH   r'   r$   rJ   rJ   H   s     [q9# q9$sE'4=2H,I'I"J q9 q9f 
 
sDy)9 
*#
F F%T	*: F2 $ r'   rJ   )rj   loggingrl   collectionsr   	functoolsr   	ipaddressr   r   r   typingr   r	   r
   r   r   	getLoggerr@   LOGr   rJ   rH   r'   r$   <module>r      sI      	 #  ? ? 5 5!3< 3<lG Gr'   