a 'Dg#@sddlZddlZddlZddlmZddlmZddlmZm Z m Z ddl m Z m Z mZmZmZeeZGdddZGdd d ZdS) N) defaultdict) lru_cache) IPv4Address IPv4Interface IPv6Interface)DictListOptionalTupleUnionc@sreZdZdZddZeedddZeedddZeedd d Z eedd d Z eedd dZ dS)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)nameindexinetinet6upoptionsnd6flagsmtumetricgroups descriptionmediastatusmacmacsvlanmembers)selfr r F/usr/lib/python3.9/site-packages/cloudinit/distros/parsers/ifconfig.py__init__s$zIfstate.__init__)returncCsd|jvpd|jvS)NZloopbacklo)rrrr 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)NZbridgerr%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"propertyboolr&r'r)r*r+r r r r!r sr c@seZdZdZddZeeeeee e e ffdddZ ddZ e eeefd d d Zd d Ze eeefd ddZe ed ddZdS)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|_dSN) _ifs_by_name _ifs_by_macr%r r r!r"SszIfconfig.__init__)textr#cCsd}tt}d}|D]}t|dkr,q|ddvrz|d7}|d}|drb|dd}t|}||_||j|<|sq| }t|dkr|d dr| |}|ikrt |d|_|d |_d |vr|d |_d |vr|d |_|d d r&td |d} |j| |ddkrBt|d|_|ddkrh||ddd|_|d ds|d ds|d drtd |d} t| dkr|j| dd7_|ddkr|d|_|j|d||d||ddkr8|j|d||d||ddkr\|j|dd7_|ddkr||ddd|_|ddkrtd |d} t| dkr| dd|_|ddkr|d|_|ddkr||} t | d|j| d<|ddkr6| |} t | d|j!| d<|ddksR|ddkrd|j"|d7_"|dd kri|_#|d|j#d!<t$dt|D]&} || d"kr|| d|j#d#<qqt%||_&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)'rlist splitlineslensplitendswithr rr4lowerstrip startswith _parse_flagscopydeepcopyrrrrreappendintrrrrrrrr _parse_inetr _parse_inet6rrrrangedictr5)rr6Zifindex ifs_by_macdevlineZcuriftoksrZcapsrZnd6_optsipir r r!parseWs                    zIfconfig.parsecCs|jSr3)r5r%r r r!rSszIfconfig.ifs_by_mac)rVr#cCsd}d|dvr(t|d}t|j}n*ttt|dd}td|d|f}d|vrl||dd}|jdd}t|j|||dfS)N/r9r%s/%s broadcast)netmaskr] prefixlen) rstrr^rrNrwith_prefixlenrDrW)rrVr]rWr^r_r r r!rOs   zIfconfig._parse_inetcCs4tdt|D] }||dkr||dSqdS)Nr=r_r9)rQrC)rrVrXr r r!_get_prefixlens zIfconfig._get_prefixlencCsd}d|dvrZd}|dd\}}d|vr>|dd}n ||}td||f}nJd|dvrt|d}|ddd}n||}td|d|f}|s|jrd}n|s|jrd}t|j||dfS)N%r9z link-localrZr\z site-local)r_scope)rDrbr is_link_local is_site_localr`rW)rrVrdZip6restr_rWr r r!rPs$       zIfconfig._parse_inet6cCstd|d}i}t|dkr|dd|d<d|dvrHd|d<nd|d<tdt|D]F}||d krt||d|d <q^||d kr^t||d|d <q^|S) Nr<r9r>rrTFr=rr)rLrDrCrQrN)rrVrrettr r r!rIs     zIfconfig._parse_flagsN)r,r-r.r/r"rr`rr r rrYrSrAr rRrOrbrPrIr r r r!r2Hs &sr2)rJZloggingrL collectionsr functoolsr ipaddressrrrtypingrrr r r Z getLoggerr,ZLOGr r2r r r r!s   6