
    x[h#                         d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZmZmZmZmZ  ej"                  e      Z G d d      Z G d d	      Zy)
    N)defaultdict)	lru_cache)IPv4AddressIPv4InterfaceIPv6Interface)DictListOptionalTupleUnionc                       e Zd ZdZd Zedefd       Zedefd       Zedefd       Z	edefd       Z
edefd       Zy	)
Ifstatez
    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                     || _         d| _        i | _        i | _        d| _        g | _        g | _        g | _        d| _        d| _	        g | _
        d | _        d | _        d | _        d | _        g | _        i | _        g | _        y )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__zIfstate.__init__   s    	
	

*.$(
%)"&		    returnc                 >    d| j                   v xs d| j                  v S )Nloopbacklo)r   r   r"   s    r#   is_loopbackzIfstate.is_loopback.   s    TZZ'>44;;+>>r%   c                 v    d| j                   v ry| j                   g k(  r| j                  rd| j                  v ryy)NegressTEthernetF)r   r   r*   s    r#   is_physicalzIfstate.is_physical2   s6     t{{";;"
djj0Hr%   c                     d| j                   v S )Nbridger   r*   s    r#   	is_bridgezIfstate.is_bridge;   s    4;;&&r%   c                     d| j                   v S )Nlaggr2   r*   s    r#   is_bondzIfstate.is_bond?   s    $$r%   c                 @    d| j                   v xs | j                  i k7  S )Nr    )r   r    r*   s    r#   is_vlanzIfstate.is_vlanC   s    $++%;499?;r%   N)__name__
__module____qualname____doc__r$   propertyboolr+   r/   r3   r6   r8    r%   r#   r   r      s    ( ?T ? ? T   '4 ' ' % % % < < <r%   r   c            
           e Zd ZdZd Z e       dedeeee	e
e	   f   f   fd       Zd Zdedeeef   fdZd	 Zdedeeef   fd
ZdedefdZy)Ifconfiga8  
    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                      i | _         i | _        y N)_ifs_by_name_ifs_by_macr*   s    r#   r$   zIfconfig.__init__S   s    r%   textr&   c                  	   d}t        t              }d}|j                         D ]>  }|s|d   dvrO|dz  }|j                         d   }|j	                  d      r|dd }t        |      }||_        || j                  |<   |s`|j                         j                         j                         }t        |      dkD  rm|d   j                  d      rY| j                  |      }|i k7  rCt        j                  |d         |_        |d	   |_        d
|v r
|d
   |_        d|v r
|d   |_        |d   j                  d      r4t'        j                  d|d         }	|j                  j)                  |	       |d   dk(  rt+        |d         |_        |d   dk(  r||j                  d      dz   d |_        |d   j                  d      s(|d   j                  d      s|d   j                  d      rNt'        j                  d|d         }
t        |
      dkD  r'|xj.                  |
d   j                  d      z  c_        |d   dk(  r?|d   |_        |j2                  j)                  |d          ||d      j)                  |       |d   dk(  r5|j2                  j)                  |d          ||d      j)                  |       |d   dk(  r|xj4                  |dd z  c_        |d   dk(  r||j                  d      dz   d |_        |d   dk(  r@t'        j                  d|d         }t        |      dkD  r|d   j                  d      |_        |d   dk(  r
|d   |_        |d   dk(  r9| j=                  |      }t        j                  |d         |j>                  |d   <   |d   dk(  r9| jA                  |      }t        j                  |d         |jB                  |d   <   |d   dk(  s|d   dk(  r|xjD                  |d   z  c_"        |d   d k(  si |_#        |d   |jF                  d!<   tI        dt        |            D ]   }||   d"k(  s||dz      |jF                  d#<   " A tK        |      | _&        i | j                  | jL                  S )$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   rD   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dictrE   )r"   rF   ifindex
ifs_by_macdevlinecuriftoksr   capsr   nd6_optsipis                 r#   parsezIfconfig.parseW   sj     &
OO% ^	7DAwk)
 1

Q>>#&!#2JEen#	+.!!%( ::<%%'--/D4y1}a!3!3H!=))$/B; $eGn =CI"4[CF~"',5(%*8_
Aw!!/2xxQ0		  &Aw'!QL	Aw.("&tzz#':'<"= Q"":.7%%&787%%l3((6473w<!#KK71:#3#3C#88K Aw'!q'Q(47#**3/Aw("Q(4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), 7AAw,.+/A;(7y^	7@  
+8$##8t'7'788r%   c                     | j                   S rC   )rE   r*   s    r#   ri   zIfconfig.ifs_by_mac   s    r%   rm   c                 l   d }d|d   v r$t        |d         }t        |j                        }n4t        t        t	        |d   d                  }t        |d   d|      }d|v r||j                  d      dz      }|j                  j                  d      d   }t        |j                        |||dfS )N/rJ      r   	broadcast)netmaskrw   	prefixlen)	r   strrx   r   rc   r   with_prefixlenrX   rp   )r"   rm   rw   rp   rx   ry   s         r#   rd   zIfconfig._parse_inet   s    	$q'>tAw'B"**oG+c$q'1o67G$q'7;<B$TZZ4q89I%%++C03	J"&&
 	
r%   c                 \    t        dt        |            D ]  }||   dk(  s||dz      c S  y )NrN   ry   rJ   )rf   r\   )r"   rm   rq   s      r#   _get_prefixlenzIfconfig._get_prefixlen   s6    q#d)$ 	#AAw+%AE{"	#r%   c                    d }d|d   v rTd}|d   j                  d      \  }}d|v r|j                  d      d   }n| j                  |      }t        |d|      }nQd|d   v r&t        |d         }|d   j                  d      d   }n$| j                  |      }t        |d   d|      }|s|j                  rd}n|s|j                  rd}t        |j                        ||dfS )N%rJ   z
link-localru   z
site-local)ry   scope)rX   r}   r   is_link_localis_site_localrz   rp   )r"   rm   r   ip6restry   rp   s          r#   re   z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
)eDEEr%   c                 R   t        j                  d|d         }i }t        |      dkD  r}|d   j                  d      |d<   d|d   v rd|d<   nd|d<   t        dt        |            D ]<  }||   d	k(  rt	        ||dz            |d	<    ||   d
k(  s)t	        ||dz            |d
<   > |S )NrM   rJ   rQ   r   r   TFrN   r   r   )ra   rX   r\   rf   rc   )r"   rm   r   retts        r#   r^   zIfconfig._parse_flags  s    a)u:> 8>>#.CLs7|# D	!D	1c$i( 27h&$'QU$4CM!W%!$T!a%[!1CJ	2
 
r%   N)r9   r:   r;   r<   r$   r   rz   r   r   r   r	   rr   ri   rV   r   rg   rd   r}   re   r^   r?   r%   r#   rA   rA   H   s     [q9# q9$sE'4=2H,I'I"J q9 q9f 
 
sDy)9 
*#
F F%T	*: F2 $ r%   rA   )r_   loggingra   collectionsr   	functoolsr   	ipaddressr   r   r   typingr   r	   r
   r   r   	getLoggerr9   LOGr   rA   r?   r%   r#   <module>r      sK      	 #  ? ? 5 5g!3< 3<lG Gr%   