܍~c#ddlZddlZddlmZddlmZmZmZddlm Z m Z m Z ddl m ZejeZdZGddZGd d ZdS) N) lru_cache) IPv4Address IPv4Interface IPv6Interface)DictOptionalTuple)logz"([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}ceZdZdZdZedefdZedefdZedefdZ edefdZ edefdZ edefd 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||_d|_i|_i|_d|_g|_g|_g|_d|_d|_ g|_ d|_ d|_ d|_ d|_g|_i|_g|_dS)NrF)nameindexinetinet6upoptionsnd6flagsmtumetricgroups descriptionmediastatusmacmacsvlanmembers)selfrs D/usr/lib/python3/dist-packages/cloudinit/distros/parsers/ifconfig.py__init__zIfstate.__init__s        *.$( %) "&   returnc&d|jvpd|jvS)Nloopbacklo)rrr s r! is_loopbackzIfstate.is_loopback0sTZ'>44;+>>r#cVd|jvrdS|jgkr|jr d|jvrdSdS)NegressTEthernetF)rrr(s r! is_physicalzIfstate.is_physical4s@ t{ " "4 ;"    dj0H0H4ur#cd|jvS)Nbridgerr(s r! is_bridgezIfstate.is_bridge=s4;&&r#cd|jvS)Nlaggr0r(s r!is_bondzIfstate.is_bondA$$r#c*d|jvp |jikS)Nr)rrr(s r!is_vlanzIfstate.is_vlanEs$+%;49?;r#cd|jvS)Nwlanr0r(s r!is_wlanzIfstate.is_wlanIr5r#N) __name__ __module__ __qualname____doc__r"propertyboolr)r-r1r4r7r:r#r!r r s(?T???X?TX'4'''X'%%%%X%<<<<X<%%%%X%%%r#r ceZdZdZdZededeeeffdZ dZ dZ de de eeffd Zd Zde de eeffd Zde defd Zd 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. ci|_dS)N)_ifsr(s r!r"zIfconfig.__init__Ys  r#textr$cX d}|D] }t|dkr|ddvr^|dz }|d}|dr |dd}t |}||_||j|<|}t|dkr|d dri| |}|ikrNtj |d|_ |d |_d |vr |d |_d |vr |d |_|d d r5t#jd |d}|j ||ddkrt'|d|_|ddkr%||ddzd|_|d ds6|d ds|d drWt#jd |d} t| dkr)|xj| ddz c_|ddkr=|d|_|j|d||j|d<|ddkr0|j|d||j|d<|ddkr|xj|ddz c_|ddkr%||ddzd|_|ddkrNt#jd |d} t| dkr | dd|_|ddkr |d|_|ddkr=||} tj | d|j| d<|ddkr=||} tj | d|j| d<|ddks |ddkr|xj |dz c_ |dd krVi|_!|d|j!d!<tEdt|D]!} || d"kr|| dz|j!d#<"|jS)$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)  :Nzflags=rrrrz capabilities=<|>rz description:zoptions=ec_capabilities ec_enabled,etherhwaddrzgroups:zmedia:z: rrrrzmember:z laggport:zvlan:idz interface:link)# splitlineslensplitendswithr rrElowerstrip startswith _parse_flagscopydeepcopyrrrrreappendintrrrrrrrr _parse_inetr _parse_inet6rrrrange) r rFifindexlinecurifdevtoksrcapsrnd6_optsipis r!parsezIfconfig.parse\sOO%%Y 7Y 7D4yyA~~Awk)) 1  Q>>#&&'!#2#JEenn# #& % ::<<%%''--//D4yy1}}a!3!3H!=!=}))$//B;; $ eGn = =CI"4[CF~~"',5((%*8_ Aw!!/22 'xQ00   &&&Aw'!!QLL Aw.(("&tzz#':'<'<"=Q"":.. 97%%&788 97%%l33 9 (64733w<z(Ifconfig.ifs_by_name..s?   a VQ8O8O q   r#rEitemsr(s r! ifs_by_namezIfconfig.ifs_by_name/  #y00    r#cHd|jDS)NcNi|]"\}}tjt|||#SrArrrus r!ryz'Ifconfig.ifs_by_mac..s?   aBL4K4K q   r#rzr(s r! ifs_by_maczIfconfig.ifs_by_macr}r#rjcd}d|dvrLt|d}t|j}d|vr||ddz}nltt t |dd}d|vr||ddz}t|dd|}|jdd}t|j|||dfS)N/rJ broadcastr)netmaskr prefixlen) rstrrrrrbwith_prefixlenrXrm)r rjrrmrrs r!rczIfconfig._parse_inets $q'>>tAw''B"*ooGd"" K!8!81!<= +c$q'1oo6677Gd"" K!8!81!<= $q'''77;<> EQ c**ICd{{ JJsOOA.  //55 ###yy9::BB DG^^tAw''BQ c**1-II++D11I$q'''99=>>B !) ! EE !2+ ! EBE )eDDEEr#ctjd|d}i}t|dkr|dd|d<d|dvrd|d<nd|d<tdt|D]Q}||d krt ||dz|d <*||d krt ||dz|d <R|S) NrMrJrQrrTFrNrr)r`rXrWrerb)r rjrretts r!r]zIfconfig._parse_flagssa)) u::>> 8>>#..CLs7|## D !D 1c$ii(( 2 27h&&$'QU $4$4CMM!W%%!$T!a%[!1!1CJ r#N)r;r<r=r>r"rrrr ror|rlistr dictrcrrdr]rAr#r!rCrCNsY[[i#i$sG|"4iii[iV        sDy)9    .### FF%T *:FFFF2$r#rC)r^r` functoolsr ipaddressrrrtypingrrr cloudinitr logging getLoggerr;LOGrtr rCrAr#r!rs ??????????(((((((((($$$$$$g!! 27%7%7%7%7%7%7%7%tGGGGGGGGGGr#