a '¡Dg`ã@s ddlZddlZddlZddlmZmZddlmZddlmZm Z m Z ddl m Z m Z mZddlmZddlmZe e¡Zggdd d œZGd d „d e ƒZd d„Ze jddddd„ƒZdd„Zdd„Zd(eeeeeffdœdd„Zdd„Zdd„Z dd „Z!d!d"„Z"d#d$„Z#d)d&d'„Z$dS)*éN)ÚcopyÚdeepcopy)Ú IPv4Network)ÚDictÚListÚ TypedDict)Ú lifecycleÚsubpÚutil)Únet_prefix_to_ipv4_mask)Ú SimpleTableÚF©Úipv4Úipv6ÚhwaddrÚupc@s6eZdZUeed<eed<eeed<eeed<dS)Ú InterfacerrrrN)Ú__name__Ú __module__Ú __qualname__ÚboolÚ__annotations__ÚstrrÚdict©rrú5/usr/lib/python3.9/site-packages/cloudinit/netinfo.pyr,s  rc CsPt |¡}i}|D]6}d|vr(|dng}| d¡dkrB|dnd}|td|voXd|vƒggdœ}| d g¡D]Ì}| d ¡d krÜd |vr¢ttd |d ›ƒjƒnd}| dd¡|| dd¡| dd¡dœ} |d | ¡qp|d dkrp| dd¡} | r| d¡s| ›d| d d¡›} | | dd¡dœ} |d | ¡qp|||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_typeÚetherÚaddressr ÚUPÚLOWER_UP)rrrrZ addr_infoZfamilyÚinetÚ prefixlenz0.0.0.0/ÚlocalÚ broadcastÚscope)ÚipÚmaskÚbcastr'rÚinet6ú/é@)r(Úscope6rZifname)ÚjsonÚloadsÚgetrrrÚnetmaskÚappend) Z ipaddr_jsonZ ipaddr_dataÚdevsÚdevrr Zdev_infoÚaddrr)Z parsed_addrr(rrrÚ_netdev_info_iproute_json3s@  üÿý   ü   þr7z22.1zqRequired by old iproute2 versions that don't support ip json output. Consider upgrading to a more recent version.)Zdeprecated_versionZ extra_messagec Cs¬i}d}t| ¡ƒD]\}}t d|¡}|rz| d¡ ¡ d¡d}| d¡ d¡}ggdtd |vold |vƒd œ||<qd |vrºt d |¡}|s¢t  d||¡q||d  |  ¡¡qd|vrHt d|¡}|sät  d||¡q|  ¡}|  d¡}|  d¡\} } } | sd} ||d  | |dr0|dndt| ƒ|ddœ¡qd|vrt d|¡}|srt  d||¡q| d¡dkr–| d¡||d<n d||d<qqq|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+.*r5ú@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Ú splitlinesÚreÚmatchÚgroupÚlowerÚsplitrÚLOGÚwarningr3Ú groupdictÚpopÚ partitionr ) Ú ipaddr_outr4Zdev_nameZnumÚlineÚmrr@r:r6Ú_ÚprefixrrrÚ_netdev_info_iprouteisv  ü üÿ ûÿ  üÿÿÿrNc Cszi}| ¡D]f}t|ƒdkr q |ddvrb| ¡d}| d¡rN|dd…}||vrbttƒ||<| ¡ ¡ ¡}t|ƒdkršt  d|d¡ršd||d<t t|ƒƒD]Ê}||d krì||d d ¡\}}||d   |t |ƒd œ¡q¦||d kr||d||d dd<q¦||dkr<||d||d<q¦||dkrœ||ddkr|||d  d||di¡n||d  d||di¡q¦||dkrä||dddd ||d}|||ddd<q¦||  d¡r|| d¡||ddd<q¦||dkr¦t d||d¡} | rV|  d¡||ddd<q¦||d||ddd<q¦q |S)Nr©ú ú ú:éÿÿÿÿézflags=[x\d]+Trr#r,r)r(r)r&r*zaddress:rr+úaddr:rr(ér$úscope:r.Úscopeidú .*<(\S+)>)r>ÚlenrCÚendswithrÚDEFAULT_NETDEV_INFOrBÚstripr?ÚsearchÚranger3r Ú startswithÚlstripr@rA) Ú ifconfig_datar4rJÚcurdevÚtoksÚiÚnetworkZnet_bitsÚaddr6ÚresrrrÚ_netdev_info_ifconfig_netbsd¼sN           ÿ  $   ricCs i}| ¡D] }t|ƒdkr q |ddvrb| ¡d}| d¡rN|dd…}||vrbttƒ||<| ¡ ¡ ¡}|ddkrŒd||d<n(t|ƒdkr´t  d|d¡r´d||d<t t|ƒƒD]V}||d krø||d   d ||d  d ¡i¡qÀ||  d ¡r(||  d ¡||d dd<qÀ||dkrT||d||d dd<qÀ||  d¡r„||  d¡||d dd<qÀ||dkr°||d||d dd<qÀ||dksÌ||dkrâ||d||d<qÀ||dkrB||dd kr"||d  d ||di¡n||d  d ||di¡qÀ||dkrŠ||ddd d||d}|||ddd <qÀ||  d¡rº||  d¡||ddd<qÀ||dkrÀt d||d¡}|rü| d¡||ddd<qÀ||d||ddd<qÀq |S)NrrOrRrSrTrTz flags=\d+rZrCr[rr\rBr]r?r^r_r3rar`r@rA)rbr4rJrcrdrergrhrrrÚ_netdev_info_ifconfigìs\           ÿ    $   rj)Úreturncsøi}t ¡r0tjddgddgd\}}t|ƒ}n’t d¡rŠzt gd¢¡\}}t|ƒ}WqÂtjy†t gd¢¡\}}t|ƒ}YqÂ0n8t d¡r¸tjddgddgd\}}t|ƒ}n t   d ¡|d krÎ|St t t f‰d‡‡fd d „ ‰ˆ||d|S)afreturn the instance's interfaces and interface data includes, interface name, link state, hardware address, and lists of ipv4 and ipv6 addresses example output: { 'lo': { 'up': True, 'hwaddr': '', 'ipv4': [ { 'bcast': '', 'ip': '127.0.0.1', 'mask': '255.0.0.0', 'scope': 'host', }], 'ipv6': [{'ip': '::1/128', 'scope6': 'host'}], }, 'lxdbr0': { 'up': True 'hwaddr': '00:16:3e:fa:84:30', 'ipv4': [{ 'bcast': '', 'ip': '10.161.80.1', 'mask': '255.255.255.0', 'scope': 'global', }], 'ipv6': [ {'ip': 'fd42:80e2:4695:1e96::1/64', 'scope6': 'global'}, {'ip': 'fe80::216:3eff:fefa:8430/64', 'scope6': 'link'}, ] }, } Zifconfigz-arrT©Zrcsr()r(z--jsonr6)r(r6Zshowz>Could not print networks: missing 'ip' and 'ifconfig' commandsr ©r ócslt|tƒr| ¡}n t|ttfƒr,t|ƒ}ntdƒ‚|D].\}}||vrR|||<q8t|ˆƒr8ˆ||ƒq8dS)zQRecursively replace 'empty_vals' in data (dict, tuple, list) with new_valzUnexpected input to fillN)Ú isinstancerÚitemsÚtupleÚlistr=Ú TypeError)ÚdataÚnew_valZ empty_valsZmyiterÚkeyÚval©ÚfillZ recurse_typesrrrygs      znetdev_info..fill)ru)r rm)r Z is_NetBSDr riÚwhichr7ÚProcessExecutionErrorrNrjrDrErrqrr)Úemptyr4Z ifcfg_outÚ_errrIrrxrÚ netdev_info%s.'     ÿ  r~cCs¨i}g|d<g|d<| ¡}dddddddœ}|D].}t|ƒ}|sFq2| ¡}dg}|ddkrrd|d <d|d <n^d |dvr’|d d ¡\}} n"|d}d } | d ¡t| ƒ|d <||d <t| ƒ|d <d|d<tt|ƒƒD]h} || dkr || d|d<| dd¡|| dkr(|| d|d<|| dkrÜ|| d|d<qÜd |¡|d<|d |¡q2zt j gd¢ddgd\} } Wnt j yšYn 0|  ¡} | D]ú}i}|sºq¨| ¡}|ddkrâd|d <d|d<n|d|d <d|d<d|d<tt|ƒƒD]†} || dkr4|| d|d<d|d<|| dkrR|| d|d<|| dkrp|| 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 )Ú destinationrÚgatewayÚgenmaskÚifaceÚmetricÚUrÚdefaultú0.0.0.0rrr,r;ÚHr€ZviarTÚGr5r‚rƒr)r(z --onelinez-6ÚrouterrÚtableÚallrlz::/0ZUGú::ZexpiresÚe) r>rrCr3r r_rZÚinsertÚjoinr r{)Z iproute_dataÚroutesÚentriesZdefault_route_entryrJÚentryrdrr6ZcidrreZ iproute_data6Ú_err6Úentries6rrrÚ_netdev_route_info_iproute{sŒ ú         þ  r•c Cs$i}g|d<g|d<| ¡}|D]Ô}|s*q | ¡}t|ƒdks |ddks |ddks |ddks |ddks |dd kr|q t|ƒd kr°| d ¡| d ¡|d |d <d |d <|d|d|d|d|d|d |d|d dœ}|d |¡q ztjgd¢ddgd\}}Wntjy*Ynö0| ¡}|D]æ}|sFq8| ¡}t|ƒd ks8|ddks8|ddks8|ddks8|ddks8|ddkr¦q8|d|d|d|d|d|d |ddœ}|ddkrèq8|d d¡rt dd|d¡|d<|d |¡q8|S)NrrérZKernelÚ DestinationZInternetZ Internet6ZRoutingéú-éérTrVéé)rr€rrrƒÚrefÚuser‚)Únetstatz-Ar+ú--routeú --numericrlZProtoZActive)rr€rrƒržrŸr‚r‚Úlorz/128z\/128$r ) r>rCrZr3r r{r[r?Úsub) Z route_datarr‘rJrdr’Z route_data6r“r”rrrÚ_netdev_route_info_netstatÓs˜ ÿ þ ý ü û ú    ø  ÿ ÿ þ ý ü û úù  ÿr¥cCsfi}t d¡r*t gd¢¡\}}t|ƒ}n8t d¡rXtjgd¢ddgd\}}t|ƒ}n t d¡|S) Nr()r(z-or‰rrr )r r¡r¢z--extendrrTrlz;Could not print routes: missing 'ip' and 'netstat' commands)r rzr•r¥rDrE)rZ iproute_outr}Z route_outrrrÚ route_info(s    ÿ  ÿr¦c Csˆg}d}zt|d}WnFty\}z.| t djt|ƒddd¡¡WYd}~n&d}~00|sfdSgd¢}t|ƒ}t|  ¡ƒD]¾\}}|  d ¡D]2}|  ||d |d |d |  d |¡|df¡q”|  d¡D].}|  ||d |d ||  d|¡|df¡qÒt |  d¡ƒt |  d ¡ƒdkr‚|  ||d ||||df¡q‚|  ¡} t t|  ¡t dƒ} t dd| ¡} | | | g¡d |¡dS)NÚ.)r|z Net device info failed ({error})©Úerrorú!éPÚ )ZDeviceZUpZAddressZMaskZScopez Hw-Addressrrr(r)r'rrr.r©rvzNet device infoú+)r~Ú Exceptionr3r ÚcenterÚformatrr Úsortedrpr1Úadd_rowrZÚ get_stringÚmaxr>Úextendr) Úlinesr|ZnetdevrÚfieldsZtblr5rtr6Znetdev_sÚmax_lenÚheaderrrrÚnetdev_pformat;s\ýÿ úÿ  úÿ ÿr»c Cs>g}z tƒ}WnVtyd}z>| t djt|ƒddd¡¡t td|¡WYd}~nÔd}~00|  d¡rDgd¢}t |ƒ}t |  d¡ƒD]z\}}t|ƒ}z2|  ||d|  d d ¡|d |d |d g¡Wqt y}zt td|¡WYd}~qd}~00q| ¡}tt| ¡tdƒ} t dd| ¡} | | |g¡|  d¡r0gd¢} t | ƒ} t |  d¡ƒD]ˆ\}}t|ƒ}|d dkrqnz,|   ||d|  d d¡|d |d g¡Wn6t yò}zt td|¡WYd}~n d}~00qn|  ¡}tt| ¡tdƒ} t dd| ¡} | | |g¡d |¡dS)NzRoute info failed ({error})r¨rªr«zRoute info failed: %sr)ÚRouter—ÚGatewayZGenmaskrÚFlagsrr€r†rr‚rzRoute info formatting error: %sr­zRoute IPv4 infor®r)r¼r—r½rr¾r£rŒzRoute IPv6 infor¬)r¦r¯r3r r°r±rZlogexcrDr1r r=r³ÚKeyErrorr´rZrµr>r¶r) r·rrZ fields_v4Ztbl_v4ÚnÚrZroute_idZroute_sr¹rºZ fields_v6Ztbl_v6rrrÚ route_pformatosl ÿÿ(  úÿ (  ûÿ *rÂú ci-info: cCszg}tƒ ¡}|r0|D]}| d||f¡qn | |¡tƒ ¡}|rf|D]}| d||f¡qLn | |¡d |¡S)Nz%s%sr¬)r»r>r3r¶rÂr)rMr·Z netdev_linesrJZ route_linesrrrÚ debug_info¸s    rÄ)r )rÃ)%r/Zloggingr?rrÚ ipaddressrÚtypingrrrZ cloudinitrr r Zcloudinit.net.network_stater Zcloudinit.simpletabler Z getLoggerrrDr\rr7Zdeprecate_callrNrirjrr~r•r¥r¦r»rÂrÄrrrrÚ s:    6þ N0:ÿþ VXU4I