a '¡Dg`ã@s ddlZddlZddlZddlmZmZddlmZddlmZm Z m Z ddl m Z m Z mZddlmZddlmZe e¡Zggdd d œZGd d „d e ƒZd d„Ze jddd�dd„ƒ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|v�rHt d|¡}|sät  d||¡q|  ¡}|  d¡}|  d¡\} } } | �sd} ||d  | |d�r0|dndt| ƒ|ddœ¡qd|vrt d|¡}|�srt  d||¡q| d¡dk�r–| 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 k�r||d||d dd<q¦||dk�r<||d||d<q¦||dk�rœ||ddk�r|||d  d||di¡n||d  d||di¡q¦||dk�rä||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À||dk�rT||d||d dd<qÀ||  d¡�r„||  d¡||d dd<qÀ||dk�r°||d||d dd<qÀ||dk�sÌ||dk�râ||d||d<qÀ||dk�rB||dd k�r"||d  d ||di¡n||d  d ||di¡qÀ||dk�rŠ||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} || dk�r || d|d<| dd¡|| dk�r(|| d|d<|| dkrÜ|| d|d<qÜd |¡|d<|d |¡q2zt j gd¢ddgd�\} } Wnt j �yšY�n 0|  ¡} | D]ú}i}|�sº�q¨| ¡}|ddk�râd|d <d|d<n|d|d <d|d<d|d<tt|ƒƒD]†} || dk�r4|| d|d<d|d<|| dk�rR|| d|d<|| dk�rp|| d|d<|| dk�r |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.0rr�r,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�\}}Wntj�y*Ynö0| ¡}|D]æ}|�sF�q8| ¡}t|ƒd k�s8|ddk�s8|ddk�s8|ddk�s8|ddk�s8|ddk�r¦�q8|d|d|d|d|d|d |ddœ}|ddk�rè�q8|d d¡�rt dd|d¡|d<|d |¡�q8|S)NrrérZKernelÚ DestinationZInternetZ Internet6ZRoutingéú-éérTrVéé)rr€r�rrƒÚrefÚuser‚)Únetstatz-Ar+ú--routeú --numericrlZProtoZActive)rr€rrƒržrŸr‚r‚Úlorz/128z\/128$r ) r>rCrZr3r r{r[r?Úsub) Z route_datar�r‘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)r�Z iproute_outr}Z route_outrrrÚ route_info(s    ÿ  ÿr¦c Csˆg}d}zt|d�}WnFty\}z.| t djt|ƒd�dd¡¡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|ƒd�dd¡¡t td|¡WYd}~�nÔd}~00|  d¡�rDgd¢}t |ƒ}t |  d¡ƒD]z\}}t|ƒ}z2|  ||d|  d d ¡|d |d |d g¡Wq�t �y}zt td|¡WYd}~q�d}~00q�| ¡}tt| ¡td�ƒ} t dd| ¡} | | |g¡|  d¡�r0gd¢} t | ƒ} t |  d¡ƒD]ˆ\}}t|ƒ}|d dk�r��qnz,|   ||d|  d d¡|d |d g¡Wn6t �yò}zt td|¡WYd}~n d}~00�qn|  ¡}tt| ¡td�ƒ} t dd| ¡} | | |g¡d |¡dS)NzRoute info failed ({error})r¨rªr«zRoute info failed: %sr)ÚRouter—ÚGatewayZGenmaskrÚFlagsrr€r†r�r‚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·r�r�Z 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