3 \me#@sddlZddlZddlZddlmZddlmZddlmZm Z m Z ddl m Z m Z mZmZmZejeZdZGdddZGd d d ZdS) N) defaultdict) lru_cache) IPv4Address IPv4Interface IPv6Interface)DictListOptionalTupleUnionz"([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}c@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 /usr/lib/python3.6/ifconfig.py__init__s$zIfstate.__init__)returncCsd|jkpd|jkS)NZloopbacklo)rr)rr r r! is_loopback0szIfstate.is_loopbackcCs0d|jkrdS|jgkr,|jr,d|jkr,dSdS)NZegressTZEthernetF)rr)rr r r! is_physical4s  zIfstate.is_physicalcCs d|jkS)NZbridge)r)rr r r! is_bridge=szIfstate.is_bridgecCs d|jkS)NZlagg)r)rr r r!is_bondAszIfstate.is_bondcCsd|jkp|jikS)Nr)rr)rr r r!is_vlanEszIfstate.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|_dS)N) _ifs_by_name _ifs_by_mac)rr r r!r"UszIfconfig.__init__)textr#cCsd}tt}x|jD]}t|dkr,q|dd$krz|d7}|jd}|jdrb|dd%}t|}||_||j|<|j j j}t|dkr|dj dr|j |}|ikrt j|d|_|d |_d |kr|d |_d |kr|d |_|dj d r tjd |d} |jj| |ddkrrz description:zoptions=Zec_capabilitiesZ ec_enabled,ZetherZhwaddrzgroups:zmedia:z: rrrrzmember:z laggport:zvlan:idz interface:link)r4r5)'rlist splitlineslensplitendswithr rr1lowerstrip startswith _parse_flagscopydeepcopyrrrrreappendintrrrrrrrr _parse_inetr _parse_inet6rrrrangedictr2)rr3Zifindex ifs_by_maclineZcurifZdevtoksrZcapsrZnd6_optsipir r r!parseYs                 zIfconfig.parsecCs|jS)N)r2)rr r r!rOszIfconfig.ifs_by_mac)rQr#cCsd}d|dkrBt|d}t|j}d|kr||jdd}nDttt|dd}d|krr||jdd}td|d|f}|jjdd}t|j|||dfS)N/r6 broadcastrz%s/%s)netmaskrV prefixlen) rstrrXrrrJZwith_prefixlenr@rR)rrQrVrRrXrYr r r!rKs   zIfconfig._parse_inetcCs4x.tdt|D]}||dkr||dSqWdS)Nr8rYr6)rMr?)rrQrSr r r!_get_prefixlens zIfconfig._get_prefixlencCsd}d|dkrZd}|djd\}}d|kr>|jdd}n |j|}td||f}nJd|dkrt|d}|djdd}n|j|}td|d|f}| r|jrd}n| r|jrd}t|j||dfS)N%r6z link-localrUz%s/%sz site-local)rYscope)r@r[rZ is_link_localZ is_site_localrZrR)rrQr]Zip6restrYrRr r r!rLs$       zIfconfig._parse_inet6cCstjd|d}i}t|dkr|djd|d<d|dkrHd|d<nd|d<xXtdt|D]F}||d krt||d|d <q`||d kr`t||d|d <q`W|S) Nz<|>r6r9rrTFr8rr)rHr@r?rMrJ)rrQrrettr r r!rEs     zIfconfig._parse_flagsN)r*r+r,r-r"rrZrr r rrTrOr=r rNrKr[rLrEr r r r!r0Js &mr0)rFZloggingrH collectionsr functoolsrZ ipaddressrrrZtypingrrr r r Z getLoggerr*ZLOGZMAC_REr r0r r r r!s   6