o x[hF`@s"ddlZddlZddlZddlmZmZddlmZddlmZm Z m Z ddl m Z m Z mZddlmZddlmZeeZggdd d ZGd d d e Zd dZe jdddddZddZddZ d(deeeeefffddZddZddZ dd Z!d!d"Z"d#d$Z#d)d&d'Z$dS)*N)copydeepcopy) IPv4Network)DictList TypedDict) lifecyclesubputil)net_prefix_to_ipv4_mask) SimpleTableFipv4ipv6hwaddrupc@s6eZdZUeed<eed<eeed<eeed<dS) InterfacerrrrN)__name__ __module__ __qualname__bool__annotations__strrdictrr3/usr/lib/python3/dist-packages/cloudinit/netinfo.pyr,s  rc CsJt|}i}|D]}d|vr|dng}|ddkr |dnd}|td|vo+d|vggd}|d gD]d}|d d krmd |vrPttd |d jnd}|dd||dd|ddd} |d| q7|d dkr|dd} | r|ds| d|d d} | |ddd} |d| q7|||d<q |S)a&Get network device dicts from ip route and ip link info. ipaddr_json: Output string from 'ip --json addr' command. Returns a dict of device info keyed by network device name containing device configuration values. Raises json.JSONDecodeError if json could not be decoded flags link_typeetheraddressr UPLOWER_UP)rrrr addr_infofamilyinet prefixlenz0.0.0.0/local broadcastscope)ipmaskbcastr)rinet6/@)r*scope6rifname)jsonloadsgetrrrnetmaskappend) ipaddr_json ipaddr_datadevsdevrr dev_infoaddrr+ parsed_addrr*rrr_netdev_info_iproute_json3sB       r>z22.1zqRequired by old iproute2 versions that don't support ip json output. Consider upgrading to a more recent version.)deprecated_version extra_messagec Csi}d}t|D]\}}td|}|r<|ddd}|dd}ggdtd |vo5d |vd ||<q d |vr\td |}|sPt d||q ||d | q d|vrtd|}|spt d||q | }| d}| d\} } } | sd} ||d | |dr|dndt| |ddq d|vrtd|}|st d||q |ddkr|d||d<q d||d<q q |S)z @param ipaddr_out: Output string from 'ip addr show' command. @returns: A dict of device info keyed by network device name containing device configuration values. @raise: TypeError if ipaddr_out isn't a string. Nz.^\d+:\s(?P[^:]+):\s+<(?P\S+)>\s+.*r:@rr,r r!r"rr-z?\s+inet6\s(?P\S+)(\s(peer\s\S+))?\sscope\s(?P\S+).*z*Could not parse ip addr show: (line:%d) %srr%zd\s+inet\s(?P\S+)(\smetric\s(?P\d+))?(\sbrd\s(?P\S+))?\sscope\s(?P\S+).*cidr4r.32rr,r))r*r,r+r)linkz-\s+link/(?P\S+)\s(?P\S+).*rrr) enumerate splitlinesrematchgrouplowersplitrLOGwarningr6 groupdictpop partitionr ) ipaddr_outr9dev_namenumlinemrrIrCr<_prefixrrr_netdev_info_iprouteisv     rYc Csfi}|D])}|s q|ddvr-|d}|dr#|dd}||vr-tt||<|}t|dkrIt d|drId||d<t t|D]}||d krq||dd \}}||d  |t |d qO||d kr||d||d dd<qO||dkr||d||d<qO||dkr||ddkr||d d||diqO||d d||diqO||dkr||dddd ||d}|||ddd<qO|| dr||d||ddd<qO||dkr/td||d} | r!| d||ddd<qO||d||ddd<qOq|S)Nr  :zflags=[x\d]+Trr%r.r)r*r+r(r,zaddress:rr-addr:rr*r&scope:r0scopeid .*<(\S+)>)rGrLendswithrDEFAULT_NETDEV_INFOrKstriplenrHsearchranger6r startswithlstriprIrJ) ifconfig_datar9rUcurdevtoksinetworknet_bitsaddr6resrrr_netdev_info_ifconfig_netbsdsR                $ rucCsi}|D]}}|s q|ddvr-|d}|dr#|dd}||vr-tt||<|}|ddkrBd||d<nt|dkrVt d|drVd||d<t t|D]&}||d krx||d  d ||d d iq\|| d r|| d ||d dd<q\||dkr||d||d dd<q\|| dr|| d||d dd<q\||dkr||d||d dd<q\||dks||dkr||d||d<q\||dkr||dd kr||d d ||diq\||d d ||diq\||dkr;||ddd d||d}|||ddd <q\|| drS|| d||ddd<q\||dkrtd||d}|ru|d||ddd<q\||d||ddd<q\q|S)NrrZr]r^rTr_z flags=\d+Could not print networks: missing 'ip' and 'ifconfig' commandsr r cslt|tr |}nt|ttfrt|}ntd|D]\}}||vr)|||<qt|r3||qdS)zQRecursively replace 'empty_vals' in data (dict, tuple, list) with new_valzUnexpected input to fillN) isinstanceritemstuplelistrF TypeError)datanew_val empty_valsmyiterkeyvalfill recurse_typesrrrgs       znetdev_info..fill)rN)r r|)r is_NetBSDr ruwhichr>ProcessExecutionErrorrYrvrMrNrrr)emptyr9 ifcfg_out_errrRrrr netdev_info%s0'        rcCsi}g|d<g|d<|}ddddddd}|D]}t|}|s"q|}dg}|ddkr8d|d <d|d <n/d |dvrH|dd \}} n|d}d } |d t| |d <||d <t| |d <d|d<tt|D]2} || dkr|| d|d<|dd|| dkr|| d|d<|| dkr|| d|d<qmd||d<|d|qzt j gdddgd\} } Wn t j yY|Sw| } | D]x}i}|sq|}|ddkrd|d <d|d<n|d|d <d|d<d|d<tt|D]B} || dkr|| d|d<d|d<|| dkr"|| d|d<|| dkr1|| d|d<|| dkr@|dd|d<q|d|q|S)aP Get network route dicts from ip route info. @param iproute_data: Output string from ip route command. @returns: A dict containing ipv4 and ipv6 route entries as lists. Each item in the list is a route dictionary representing destination, gateway, flags, genmask and interface information. rrr ) destinationrgatewaygenmaskifacemetricUrdefault0.0.0.0rrr.rDHrviar_Gr:rrr)r*z --onelinez-6routertableallryz::/0UG::expirese) rGrrLr6r rjrhinsertjoinr r) iproute_dataroutesentriesdefault_route_entryrUentryrorr<cidrrp iproute_data6_err6entries6rrr_netdev_route_info_iproute{s              rc Cs i}g|d<g|d<|}|D]j}|sq|}t|dks=|ddks=|ddks=|ddks=|ddks=|dd kr>qt|d krX|d |d |d |d <d |d <|d|d|d|d|d|d |d|d d}|d|qztjgdddgd\}}Wn tjyY|Sw|}|D]f}|sq|}t|d ks|ddks|ddks|ddks|ddks|ddkrq|d|d|d|d|d|d |dd}|ddkrq|ddrtdd|d|d<|d|q|S)NrrrKernel DestinationInternet Internet6Routing-r_ra)rrrrrrefuser)netstatz-Ar---route --numericryProtoActive)rrrrrrrrlorz/128z\/128$r ) rGrLrhr6r rrerHsub) route_datarrrUror route_data6rrrrr_netdev_route_info_netstats           "        rcCsji}tdrtgd\}}t|}|Stdr.tjgdddgd\}}t|}|Std|S) Nr*)r*z-orrr)rrrz--extendrr_ryz;Could not print routes: missing 'ip' and 'netstat' commands)r rrrrMrN)r iproute_outr route_outrrr route_info(s    rc Csvg}d}zt|d}Wn"ty-}z|tdjt|dddWYd}~nd}~ww|s2dSgd}t|}t| D]W\}}| d }|D]} | ||d | d | d | d ||dfqK| d} | D]} | ||d | d || d||dfql|s| s| ||d ||||dfq@| } t t| t d} tdd| } || | gd|dS)N.)rz Net device info failed ({error})error!P )DeviceUpAddressMaskScopez Hw-Addressrrr*r+r)rrr0rzNet device info+)r Exceptionr6r centerformatrr sortedrr4add_row get_stringrhmaxrGextendr)linesrnetdevrfieldstblr:r ipv4_addrsr< ipv6_addrsnetdev_smax_lenheaderrrrnetdev_pformat;sf      rc Cs,g}zt}Wn*ty1}z|tdjt|dddttd|WYd}~nd}~ww| drgd}t |}t | dD];\}}t|}z| ||d| d d |d |d |d gWqFt y}zttd|WYd}~qFd}~ww|}tt|td} tdd| } || |g| drgd} t | } t | dD]?\}}t|}|d dkrqz| ||d| d d|d |d gWqt y}zttd|WYd}~qd}~ww| }tt|td} tdd| } || |gd|dS)NzRoute info failed ({error})rrrzRoute info failed: %sr)RouterGatewayGenmaskrFlagsrrrrrrzRoute info formatting error: %srzRoute IPv4 inforr)rrrrrrrzRoute IPv6 infor)rrr6r rrrlogexcrMr4r rFrKeyErrorrrhrrGrr) rrr fields_v4tbl_v4nrroute_idroute_srr fields_v6tbl_v6rrr route_pformatrsx        r ci-info: cCszg}t}|r|D] }|d||fq n||t}|r3|D] }|d||fq&n||d|S)Nz%s%sr)rrGr6rrr)rXr netdev_linesrU route_linesrrr debug_infos     r)r )r)%r2loggingrHrr ipaddressrtypingrrr cloudinitrr r cloudinit.net.network_stater cloudinit.simpletabler getLoggerrrMrfrr>deprecate_callrYrurvrrrrrrrrrrrrs<     6 N0: VXU7I