
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me#                 @   s   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dZG dd dZG d	d
 d
ZdS )    N)defaultdict)	lru_cache)IPv4AddressIPv4InterfaceIPv6Interface)DictListOptionalTupleUnionz"([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}c               @   sr   e Zd ZdZdd ZeedddZeedddZeedd	d
Z	eedddZ
eedddZdS )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             C   sp   || _ d| _i | _i | _d| _g | _g | _g | _d| _d| _	g | _
d | _d | _d | _d | _g | _i | _g | _d S )Nr   F)nameindexinetinet6upoptionsnd6flagsmtumetricgroupsdescriptionmediastatusmacmacsvlanmembers)selfr    r    /usr/lib/python3.6/ifconfig.py__init__   s$    zIfstate.__init__)returnc             C   s   d| j kpd| jkS )NZloopbacklo)r   r   )r   r    r    r!   is_loopback0   s    zIfstate.is_loopbackc             C   s0   d| j krdS | j g kr,| jr,d| jkr,dS dS )NZegressTZEthernetF)r   r   )r   r    r    r!   is_physical4   s
    
zIfstate.is_physicalc             C   s
   d| j kS )NZbridge)r   )r   r    r    r!   	is_bridge=   s    zIfstate.is_bridgec             C   s
   d| j kS )NZlagg)r   )r   r    r    r!   is_bondA   s    zIfstate.is_bondc             C   s   d| j kp| ji kS )Nr   )r   r   )r   r    r    r!   is_vlanE   s    zIfstate.is_vlanN)__name__
__module____qualname____doc__r"   propertyboolr%   r&   r'   r(   r)   r    r    r    r!   r      s   r   c               @   s   e Zd ZdZdd Ze eeeee	e
e	 f f dddZdd Zeeeef d	d
dZdd Zeeeef d	ddZeed	ddZdS )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             C   s   i | _ i | _d S )N)_ifs_by_name_ifs_by_mac)r   r    r    r!   r"   U   s    zIfconfig.__init__)textr#   c             C   s  d}t t}x|j D ]}t|dkr,q|d d$krz|d7 }|j d }|jdrb|dd% }t|}||_|| j|< |j	 j
 j }t|dkr|d jdr| j|}|i krtj|d |_|d	 |_d
|kr|d
 |_d|kr|d |_|d jdr tjd|d }	|jj|	 |d dkr<t|d |_|d dkrb||jdd d |_|d jds|d jds|d jdrtjd|d }
t|
dkr| j|
d jd7  _|d dkr|d |_|jj|d  ||d  j| |d dkr2|jj|d  ||d  j| |d dkrV| j|dd 7  _|d dkr|||jdd d |_|d dkrtjd|d }t|dkr|d jd|_|d dkr|d |_|d dkr | j|}tj|d |j|d < |d dkr0| j |}tj|d |j!|d < |d dksL|d dkr^| j"|d 7  _"|d d kri |_#|d |j#d!< x8t$dt|D ]&}|| d"kr||d  |j#d#< qW qW t%|| _&| 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``
        r   	    :Nzflags=r   r   r   r   zcapabilities=z<|>r   zdescription:   zoptions=Zec_capabilitiesZ
ec_enabled,ZetherZhwaddrzgroups:zmedia:z: r   r   r   r   zmember:z	laggport:zvlan:idz
interface:link)r4   r5   )'r   list
splitlineslensplitendswithr   r   r1   lowerstrip
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dictr2   )r   r3   Zifindex
ifs_by_maclineZcurifZdevtoksr   Zcapsr   Znd6_optsipir    r    r!   parseY   s    










zIfconfig.parsec             C   s   | j S )N)r2   )r   r    r    r!   rO      s    zIfconfig.ifs_by_mac)rQ   r#   c             C   s   d }d|d krBt |d }t|j}d|kr||jdd  }nDttt|d d}d|krr||jdd  }t d|d |f }|jjdd }t|j|||dfS )N/r6   	broadcast   r   z%s/%s)netmaskrV   	prefixlen)	r   strrX   r   r   rJ   Zwith_prefixlenr@   rR   )r   rQ   rV   rR   rX   rY   r    r    r!   rK      s    
zIfconfig._parse_inetc             C   s4   x.t dt|D ]}|| dkr||d  S qW d S )Nr8   rY   r6   )rM   r?   )r   rQ   rS   r    r    r!   _get_prefixlen   s    zIfconfig._get_prefixlenc             C   s   d }d|d krZd}|d j d\}}d|kr>|j dd }n
| j|}td||f }nJd|d krt|d }|d j dd }n| j|}td|d |f }| r|jrd}n| r|jrd}t|j||dfS )N%r6   z
link-localrU   z%s/%sz
site-local)rY   scope)r@   r[   r   Zis_link_localZis_site_localrZ   rR   )r   rQ   r]   Zip6restrY   rR   r    r    r!   rL      s$    

zIfconfig._parse_inet6c             C   s   t jd|d }i }t|dkr|d jd|d< d|d krHd|d< nd|d< xXtdt|D ]F}|| d	krt||d  |d	< q`|| d
kr`t||d  |d
< q`W |S )Nz<|>r6   r9   r   r   TFr8   r   r   )rH   r@   r?   rM   rJ   )r   rQ   r   rettr    r    r!   rE      s    
zIfconfig._parse_flagsN)r*   r+   r,   r-   r"   r   rZ   r   r   r   r   rT   rO   r=   r
   rN   rK   r[   rL   rE   r    r    r    r!   r0   J   s   	&mr0   )rF   ZloggingrH   collectionsr   	functoolsr   Z	ipaddressr   r   r   Ztypingr   r   r	   r
   r   Z	getLoggerr*   ZLOGZMAC_REr   r0   r    r    r    r!   <module>   s   
6