Ë
    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   € à˜TŸZ™ZÐ'Ò>¨4°4·;±;Ð+>Ð>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—{‘{Ñ"ØØ�;‰;˜"Ò §¢°
¸d¿j¹jÑ0HØØ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   € à˜$Ÿ+™+Ð%Ò;¨4¯9©9¸©?Ð;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  € ð ˆÜ ¤Ó&ˆ
ØˆØ—O‘OÓ%ó ^	7ˆDÙØØ�A‰w˜kÑ)ð
 ˜1‘�ØŸ
™
› Q™�à—>‘> #Ô&Ø! # 2˜J�EÜ˜e“n�Ø#�”	Ø+.�×!Ñ! %Ñ(áð à—:‘:“<×%Ñ%Ó'×-Ñ-Ó/ˆDä�4‹y˜1Š}  a¡×!3Ñ!3°HÔ!=Ø×)Ñ)¨$Ó/�Ø˜B’;Ü $§¡¨e°G©nÓ =�C”IØ" 4™[�C”FØ ‘~Ø"'¨¡,˜œØ 5Ñ(Ø%*¨8¡_˜œ
Ø�A‰w×!Ñ! /Ô2Ü—x‘x ¨¨Q©Ó0�Ø—	‘	× Ñ  Ô&à�A‰w˜'Ò!ä  Q¡›L�”	à�A‰w˜.Ò(Ø"& t§z¡z°#£¸Ñ':Ð'<Ð"=�”ð �Q‘×"Ñ" :Ô.Ø˜‘7×%Ñ%Ð&7Ô8Ø˜‘7×%Ñ% lÔ3äŸ(™( 6¨4°©7Ó3�Ü�w“< !Ò#Ø—K’K 7¨1¡:×#3Ñ#3°CÓ#8Ñ8•Kð �A‰w˜'Ò!Ø˜q™'�”Ø—‘—‘  Q¡Ô(Ø˜4 ™7Ñ#×*Ñ*¨3Ô/Ø�A‰w˜(Ò"Ø—‘—‘  Q¡Ô(Ø˜4 ™7Ñ#×*Ñ*¨3Ô/à�A‰w˜)Ò#Ø—
’
˜d 1 2˜hÑ&•
à�A‰w˜(Ò"Ø  §¡¨DÓ!1°AÑ!5Ð!7Ð8�”	à�A‰w˜%ÒÜŸ8™8 F¨D°©GÓ4�Ü�x“= 1Ò$Ø& q™k×/Ñ/°Ó4�C”Gà�A‰w˜(Ò"Ø! !™W�”
à�A‰w˜&Ò Ø×%Ñ% dÓ+�Ü"&§-¡-°°1±Ó"6�—‘˜˜A™‘à�A‰w˜'Ò!Ø×&Ñ& tÓ,�Ü#'§=¡=°°A±Ó#7�—	‘	˜"˜Q™%Ñ ð �A‰w˜)Ò# t¨A¡w°+Ò'=Ø—’˜t A™wÑ&•à�A‰w˜'Ô!Ø�”Ø!% a¡�—‘˜‘Ü˜q¤# d£)Ó,ò 7�AØ˜A‘w ,Ó.Ø+/°°A±©;˜Ÿ™ Ò(ò7ðy^	7ô@   
Ó+ˆÔØ8�$×#Ñ#Ð8 t×'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‘'‰>Ü˜t A™wÓ'ˆBÜ˜"Ÿ*™*“o‰Gäœ+¤c¨$¨q©'°1£oÓ6Ó7ˆGÜ¨$¨q«'±7Ð;Ó<ˆBà˜$ÑØ˜TŸZ™Z¨Ó4°qÑ8Ñ9ˆIØ×%Ñ%×+Ñ+¨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Ø�A‰w˜+Ó%Ø˜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Ó*‰IˆC�Ø�d‰{Ø ŸJ™J s›O¨AÑ.‘	à ×/Ñ/°Ó5�	Üª#©yÐ9Ó:‰BØ�D˜‘G‰^Ü˜t A™wÓ'ˆBØ˜Q™Ÿ™ cÓ*¨1Ñ-‰Ià×+Ñ+¨DÓ1ˆIÜ¨$¨q«'±9Ð=Ó>ˆBá˜×)Ò)Ø ‰EÙ˜2×+Ò+Ø ˆEä�B—E‘E“
¨)¸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Ø�s˜7‘|Ñ#Ø ��D’	à!��D‘	Ü˜1œc $›iÓ(ò 2�Ø˜‘7˜hÒ&Ü$'¨¨Q°©U©Ó$4�C˜’MØ˜!‘W Ó%Ü!$ T¨!¨a©%¡[Ó!1�C˜’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 $ s¨E°'¸4À¹=Ð2HÑ,IÐ'IÑ"Jò q9ó ðq9òf ð
 ð 
¨¨s°D¨yÑ)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%   