name : ifconfig.cpython-39.pyc
a

'�Dg�#�@s�ddlZddlZddlZddlmZddlmZddlmZm	Z	m
Z
ddlmZm
Z
mZmZmZe�e�ZGdd�d�ZGdd	�d	�ZdS)
�N)�defaultdict)�	lru_cache)�IPv4Address�
IPv4Interface�
IPv6Interface)�Dict�List�Optional�Tuple�Unionc@sreZdZdZdd�Zeed�dd��Zeed�dd��Zeed�d	d
��Z	eed�dd��Z
eed�d
d��ZdS)�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.
    cCsp||_d|_i|_i|_d|_g|_g|_g|_d|_d|_	g|_
d|_d|_d|_
d|_g|_i|_g|_dS)NrF)�name�index�inet�inet6�up�options�nd6�flags�mtu�metric�groups�description�media�status�mac�macs�vlan�members)�selfr
�r �F/usr/lib/python3.9/site-packages/cloudinit/distros/parsers/ifconfig.py�__init__s$zIfstate.__init__)�returncCsd|jvpd|jvS)NZloopback�lo)rr�rr r r!�is_loopback.szIfstate.is_loopbackcCs0d|jvrdS|jgkr,|jr,d|jvr,dSdS)NZegressTZEthernetF)rrr%r r r!�is_physical2s

zIfstate.is_physicalcCs
d|jvS)NZbridge�rr%r r r!�	is_bridge;szIfstate.is_bridgecCs
d|jvS)NZlaggr(r%r r r!�is_bond?szIfstate.is_bondcCsd|jvp|jikS)Nr)rrr%r r r!�is_vlanCszIfstate.is_vlanN)�__name__�
__module__�__qualname__�__doc__r"�property�boolr&r'r)r*r+r r r r!rsrc@s�eZdZdZdd�Ze�eeeee	e
e	ffd�dd��Zdd�Ze
eeefd	�d
d�Zdd
�Ze
eeefd	�dd�Ze
ed	�dd�ZdS)�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.
    cCsi|_i|_dS�N)�_ifs_by_name�_ifs_by_macr%r r r!r"SszIfconfig.__init__)�textr#cCs�d}tt�}d}|��D�]�}t|�dkr,q|ddvrz|d7}|��d}|�d�rb|dd�}t|�}||_||j|<|s�q|�	��
���}t|�dkr�|d�d�r�|�|�}|ikr�t
�|d�|_|d	|_d
|vr�|d
|_d|vr�|d|_|d�d��r&t�d
|d�}	|j�|	�|ddk�rBt|d�|_|ddk�rh||�d�dd�|_|d�d��s�|d�d��s�|d�d��r�t�d
|d�}
t|
�dk�r�|j|
d�d�7_|ddk�r|d|_|j�|d�||d�|�|ddk�r8|j�|d�||d�|�|ddk�r\|j|dd�7_|ddk�r�||�d�dd�|_|ddk�r�t�d
|d�}t|�dk�r�|d�d�|_|ddk�r�|d|_|ddk�r|�|�}t
�|d�|j|d<|ddk�r6|� |�}t
�|d�|j!|d<|ddk�sR|ddk�rd|j"|d7_"|dd kri|_#|d|j#d!<t$dt|��D]&}
||
d"k�r�||
d|j#d#<�q�qt%|�|_&i|j�|j&�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``
        rN)�	� ��:���zflags=rrrrz
capabilities=�<|>rzdescription:�zoptions=Zec_capabilitiesZ
ec_enabled�,ZetherZhwaddrzgroups:zmedia:z: rrrrzmember:z	laggport:zvlan:�idz
interface:�link)'r�list�
splitlines�len�split�endswithrrr4�lower�strip�
startswith�_parse_flags�copy�deepcopyrrrr�re�append�intrrrrrrrr�_parse_inetr�_parse_inet6rrr�range�dictr5)rr6Zifindex�
ifs_by_mac�dev�lineZcurif�toksrZcapsrZnd6_opts�ip�ir r r!�parseWs�





���




zIfconfig.parsecCs|jSr3)r5r%r r r!rS�szIfconfig.ifs_by_mac)rVr#cCs�d}d|dvr(t|d�}t|j�}n*ttt|dd���}td|d|f�}d|vrl||�d�d}|j�d�d}t|j�|||d�fS)N�/r9�r�%s/%s�	broadcast)�netmaskr]�	prefixlen)	r�strr^rrNr�with_prefixlenrDrW)rrVr]rWr^r_r r r!rO�s��zIfconfig._parse_inetcCs4tdt|��D] }||dkr||dSqdS)Nr=r_r9)rQrC)rrVrXr r r!�_get_prefixlen�szIfconfig._get_prefixlencCs�d}d|dvrZd}|d�d�\}}d|vr>|�d�d}n
|�|�}td||f�}nJd|dvr�t|d�}|d�d�d}n|�|�}td|d|f�}|s�|jr�d}n|s�|jr�d}t|j�||d�fS)N�%r9z
link-localrZr\z
site-local)r_�scope)rDrbr�
is_link_local�
is_site_localr`rW)rrVrdZip6�restr_rWr r r!rP�s$



zIfconfig._parse_inet6cCs�t�d|d�}i}t|�dkr�|d�d�|d<d|dvrHd|d<nd|d<tdt|��D]F}||d	kr�t||d�|d	<q^||d
kr^t||d�|d
<q^|S)Nr<r9r>rrTFr=rr)rLrDrCrQrN)rrVr�ret�tr r r!rIs
zIfconfig._parse_flagsN)r,r-r.r/r"rr`rrrrrYrSrAr
rRrOrbrPrIr r r r!r2Hs
&sr2)rJZloggingrL�collectionsr�	functoolsr�	ipaddressrrr�typingrrr	r
rZ	getLoggerr,ZLOGrr2r r r r!�<module>s
6

© 2025 Cubjrnet7