ó
    x[hF`  ã                   óP  • S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJrJ	r	J
r
  S SKJrJrJr  S SKJr  S SKJr  \R&                  " \5      r/ / SS	S
.r " S S\
5      rS r\R2                  " SSS9S 5       rS rS r SS\\\\\4   4   4S jjrS rS r S r!S r"S r#SS jr$g)é    N)ÚcopyÚdeepcopy)ÚIPv4Network)ÚDictÚListÚ	TypedDict)Ú	lifecycleÚsubpÚutil)Únet_prefix_to_ipv4_mask)ÚSimpleTableÚ F©Úipv4Úipv6ÚhwaddrÚupc                   óJ   • \ rS rSr% \\S'   \\S'   \\   \S'   \\   \S'   Sr	g)Ú	Interfaceé,   r   r   r   r   © N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚboolÚ__annotations__Ústrr   ÚdictÚ__static_attributes__r   ó    Ú3/usr/lib/python3/dist-packages/cloudinit/netinfo.pyr   r   ,   s    ‡ ØƒHØƒKØ
ˆt‰*ÓØ
ˆt‰*Ör!   r   c           	      ó0  • [         R                  " U 5      n0 nU GHv  nSU;   a  US   O/ nUR                  S5      S:X  a  US   OSnU[        SU;   =(       a    SU;   5      / / S.nUR                  S	/ 5       GH  nUR                  S
5      S:X  ay  SU;   a$  [	        [        SUS    35      R                  5      OSnUR                  SS5      UUR                  SS5      UR                  SS5      S.n	US   R                  U	5        M’  US
   S:X  d  M�  UR                  SS5      n
U
(       a-  UR                  S5      (       d  U
 SUR                  SS5       3n
U
UR                  SS5      S.n	US   R                  U	5        GM     XbUS   '   GMy     U$ )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)r   r   r   r   Ú	addr_infoÚfamilyÚinetÚ	prefixlenz0.0.0.0/ÚlocalÚ	broadcastÚscope)ÚipÚmaskÚbcastr0   r   Úinet6Ú/é@   )r1   Úscope6r   Úifname)ÚjsonÚloadsÚgetr   r   r   ÚnetmaskÚappend)Úipaddr_jsonÚipaddr_dataÚdevsÚdevr$   r'   Údev_infoÚaddrr2   Úparsed_addrr1   s              r"   Ú_netdev_info_iproute_jsonrE   3   s©  € ô —*’*˜[Ó)€KØ€DäˆØ '¨3£��G’°BˆØ$'§G¡G¨KÓ$8¸GÓ$C�#�i’.ÈˆàÜ�t˜u‘}×<¨°uÑ)<Ó=ØØñ	
ˆð —G‘G˜K¨×,ˆDØ�x‰x˜Ó! VÓ+ð # dÓ*ô œ h¨t°KÑ/@Ð.AÐ$BÓC×KÑKÔLàð ð Ÿ(™( 7¨BÓ/Ø Ø!ŸX™X k°2Ó6Ø!ŸX™X g¨rÓ2ñ	�ð ˜Ñ ×'Ñ'¨Ö4Ø�h‘ 7Õ*Ø—X‘X˜g rÓ*�ö ˜dŸh™h y×1Ñ1Ø˜4˜q §¡¨+°rÓ!:Ð ;Ð<�BàØ"Ÿh™h w°Ó3ñ�ð ˜Ñ ×'Ñ'¨×4ñ7 -ð8 'ˆS�‰]ÔñK ðL €Kr!   z22.1zqRequired by old iproute2 versions that don't support ip json output. Consider upgrading to a more recent version.)Údeprecated_versionÚextra_messagec                 ó�  • 0 nSn[        U R                  5       5       GH#  u  p4[        R                  " SU5      nU(       at  UR	                  S5      R                  5       R                  S5      S   nUR	                  S5      R                  S5      n/ / S[        S	U;   =(       a    S
U;   5      S.X'   M˜  SU;   a\  [        R                  " SU5      nU(       d  [        R                  SX45        MÔ  X   S   R                  UR                  5       5        Mú  SU;   a®  [        R                  " SU5      nU(       d  [        R                  SX45        GM7  UR                  5       nUR                  S5      nUR                  S5      u  pšnU(       d  SnX   S   R                  U	US   (       a  US   OS[        U5      US   S.5        GM®  SU;   ao  [        R                  " SU5      nU(       d  [        R                  SX45        GMë  UR	                  S5      S:X  a  UR	                  S5      X   S'   GM  SX   S'   GM#  GM&     U$ )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<dev>[^:]+):\s+<(?P<flags>\S+)>\s+.*rA   Ú@r   r$   Ú,r   r(   r)   r   r4   z?\s+inet6\s(?P<ip>\S+)(\s(peer\s\S+))?\sscope\s(?P<scope6>\S+).*z*Could not parse ip addr show: (line:%d) %sr   r,   zd\s+inet\s(?P<cidr4>\S+)(\smetric\s(?P<metric>\d+))?(\sbrd\s(?P<bcast>\S+))?\sscope\s(?P<scope>\S+).*Úcidr4r5   Ú32r   r3   r0   )r1   r3   r2   r0   Úlinkz-\s+link/(?P<link_type>\S+)\s(?P<hwaddr>\S+).*r%   r&   r   )Ú	enumerateÚ
splitlinesÚreÚmatchÚgroupÚlowerÚsplitr   ÚLOGÚwarningr=   Ú	groupdictÚpopÚ	partitionr   )Ú
ipaddr_outr@   Údev_nameÚnumÚlineÚmr$   rQ   rK   rC   Ú_Úprefixs               r"   Ú_netdev_info_iproutera   i   s  € ð €DØ€HÜ˜z×4Ñ4Ó6×7‰	ˆÜ�HŠHÐFÈÓMˆÞØ—w‘w˜u“~×+Ñ+Ó-×3Ñ3°CÓ8¸Ñ;ˆHØ—G‘G˜GÓ$×*Ñ*¨3Ó/ˆEàØØÜ˜4 5™=×@¨Z¸5Ñ-@ÓAñ	ˆD‹Nð ˜‹_Ü—’ð.ð ó	ˆAö Ü—‘Ø@À#ôñ Ø‰N˜6Ñ"×)Ñ)¨!¯+©+«-Ö8Ø�t‹^Ü—’ð-ð óˆAö Ü—‘Ø@À#ôò Ø—K‘K“MˆEØ—I‘I˜gÓ&ˆEØ#Ÿo™o¨cÓ2‰OˆD�VÞØ�Ø‰N˜6Ñ"×)Ñ)àØ/4°W¯~˜U 7š^À2Ü3°FÓ;Ø" 7™^ñ	÷ð �t‹^Ü—’Ø@À$óˆAö Ü—‘Ø@À#ôò Ø�w‰w�{Ó# wÓ.Ø+,¯7©7°8Ó+<�‘˜xÔ(à+-�‘˜xÔ(âñA 8ðB €Kr!   c                 ó  • 0 nU R                  5        GHq  nU(       d  M  US   S;  aD  UR                  5       S   nUR                  S5      (       a  US S nX1;  a  [        [        5      X'   UR                  5       R                  5       R                  5       n[        U5      S:”  a'  [        R                  " SUS   5      (       a  SUW   S'   [        [        U5      5       GHœ  nXE   S	:X  a=  XES-      R                  S
5      u  pgUW   S   R                  U[        U5      S.5        MI  XE   S:X  a  XES-      UW   S   S   S'   Mf  XE   S:X  a  XES-      UW   S'   M}  XE   S:X  aK  XES-      S:X  a   UW   S   R                  SXES-      05        M°  UW   S   R                  SXES-      05        MÐ  XE   S:X  a)  UW   S   S   S   S
-   XES-      -   nX�U   S   S   S'   GM  XE   R                  S5      (       a"  XE   R                  S5      UW   S   S   S'   GM;  XE   S:X  d  GMF  [        R                  " SXES-      5      n	U	(       a   U	R!                  S5      UW   S   S   S'   GM‰  XES-      UW   S   S   S'   GMŸ     GMt     U$ )Nr   ©Ú	Ú Ú:éÿÿÿÿé   zflags=[x\d]+<up.*>Tr   r,   r5   r   )r1   r2   r/   r3   zaddress:r   r4   úaddr:r   r1   é   r-   úscope:r7   Úscopeidú	.*<(\S+)>)rO   rT   Úendswithr   ÚDEFAULT_NETDEV_INFOrS   ÚstripÚlenrP   ÚsearchÚranger=   r   Ú
startswithÚlstriprQ   rR   )
Úifconfig_datar@   r]   ÚcurdevÚtoksÚiÚnetworkÚnet_bitsÚaddr6Úress
             r"   Ú_netdev_info_ifconfig_netbsdr~   ¼   sš  € à€DØ×(Ñ(×*ˆÞÙØ�‰7˜+Ó%Ø—Z‘Z“\ !‘_ˆFà�‰˜s×#Ñ#Ø  ˜�ØÓ!Ü'Ô(;Ó<�‘Ø�z‰z‹|×!Ñ!Ó#×)Ñ)Ó+ˆÜˆt‹9�q‹=Ü�yŠyÐ.°°Q±×8Ñ8Ø%)��V‘˜TÑ"ä”s˜4“y×!ˆAØ‰w˜&Ó Ø$(¨Q©¡K×$5Ñ$5°cÓ$:Ñ!�Ø�V‘˜VÑ$×+Ñ+Ø"Ô,CÀHÓ,MÑNöð ‘˜KÓ'Ø48¸Q¹±K��V‘˜VÑ$ RÑ(¨Ó1Ø‘˜JÓ&Ø)-°!©e©��V‘˜XÓ&Ø‘˜GÓ#Ø˜A™‘; 'Ó)Ø˜‘L Ñ(×/Ñ/°°tÀ¹E±{Ð0CÖDà˜‘L Ñ(×/Ñ/°°tÀ¹E±{Ð0CÖDØ‘˜KÓ'Ø˜V™ VÑ,¨RÑ0°Ñ6¸Ñ<¸tÈÁE¹{ÑJ�Ø16�V‘˜VÑ$ RÑ(¨Ô.Ø‘×#Ñ# H×-Ñ-Ø59±W·^±^ÀHÓ5M��V‘˜VÑ$ RÑ(¨Ô2Ø‘˜IÖ%Ü—h’h˜|¨T°a±%©[Ó9�ÞØ9<¿¹À1»�D˜‘L Ñ(¨Ñ,¨XÔ6à9=À!¹e¹�D˜‘L Ñ(¨Ñ,¨XÔ6ô3 "ñ +ðT €Kr!   c                 óR  • 0 nU R                  5        GH  nU(       d  M  US   S;  aD  UR                  5       S   nUR                  S5      (       a  US S nX1;  a  [        [        5      X'   UR                  5       R                  5       R                  5       nUS   S:X  a	  SUW   S'   O6[        U5      S:”  a'  [        R                  " SUS   5      (       a  SUW   S'   [        [        U5      5       GH(  nXE   S	:X  a/  UW   S
   R                  SXES-      R                  S5      05        M;  XE   R                  S5      (       a!  XE   R                  S5      UW   S
   S   S'   Mt  XE   S:X  a  XES-      UW   S
   S   S'   M‘  XE   R                  S5      (       a!  XE   R                  S5      UW   S
   S   S'   MÊ  XE   S:X  a  XES-      UW   S
   S   S'   Mç  XE   S:X  d  XE   S:X  a  XES-      UW   S'   GM  XE   S:X  aM  XES-      S:X  a!  UW   S   R                  SXES-      05        GM;  UW   S   R                  SXES-      05        GM\  XE   S:X  a)  UW   S   S   S   S-   XES-      -   nXaU   S   S   S'   GM�  XE   R                  S5      (       a"  XE   R                  S5      UW   S   S   S'   GMÇ  XE   S:X  d  GMÒ  [        R                  " SXES-      5      nU(       a   UR                  S5      UW   S   S   S'   GM  XES-      UW   S   S   S'   GM+     GM     U$ )Nr   rc   rf   rg   r   Trh   zflags=\d+<up,r,   r   r1   ri   zbcast:r3   r/   zmask:r2   r<   r   r&   r4   r   rj   r-   r5   rk   r7   rl   rm   )rO   rT   rn   r   ro   rS   rp   rq   rP   rr   rs   r=   ru   rt   rQ   rR   )rv   r@   r]   rw   rx   ry   r|   r}   s           r"   Ú_netdev_info_ifconfigr€   ì   sD  € à€DØ×(Ñ(×*ˆÞÙØ�‰7˜+Ó%Ø—Z‘Z“\ !‘_ˆFà�‰˜s×#Ñ#Ø  ˜�ØÓ!Ü'Ô(;Ó<�‘Ø�z‰z‹|×!Ñ!Ó#×)Ñ)Ó+ˆØ�‰7�d‹?Ø!%ˆD�‰L˜Òô �‹Y˜‹]Ü�yŠyÐ)¨4°©7×3Ñ3Ø%)��V‘˜TÑ"ä”s˜4“y×!ˆAØ‰w˜&Ó Ø�V‘˜VÑ$×+Ñ+Ø˜4 A¡™;×-Ñ-¨gÓ6Ð7öð ‘×#Ñ# H×-Ñ-Ø48±G·N±NÀ8Ó4L��V‘˜VÑ$ RÑ(¨Ó1Ø‘˜KÓ'Ø48¸Q¹±K��V‘˜VÑ$ RÑ(¨Ó1Ø‘×#Ñ# G×,Ñ,Ø37±7·>±>À'Ó3J��V‘˜VÑ$ RÑ(¨Ó0Ø‘˜IÓ%Ø37¸A¹±;��V‘˜VÑ$ RÑ(¨Ó0Ø‘˜HÓ$¨©°7Ó(:Ø)-°!©e©��V‘˜XÔ&Ø‘˜GÓ#Ø˜A™‘; 'Ó)Ø˜‘L Ñ(×/Ñ/°°tÀ¹E±{Ð0C×Dà˜‘L Ñ(×/Ñ/°°tÀ¹E±{Ð0C×DØ‘˜KÓ'Ø˜V™ VÑ,¨RÑ0°Ñ6¸Ñ<¸tÈÁE¹{ÑJ�Ø16�V‘˜VÑ$ RÑ(¨Ô.Ø‘×#Ñ# H×-Ñ-Ø59±W·^±^ÀHÓ5M��V‘˜VÑ$ RÑ(¨Ô2Ø‘˜IÖ%Ü—h’h˜|¨T°a±%©[Ó9�ÞØ9<¿¹À1»�D˜‘L Ñ(¨Ñ,¨XÔ6à9=À!¹e¹�D˜‘L Ñ(¨Ñ,¨XÔ6ô= "ñ' +ðf €Kr!   Úreturnc                 ó�  ^^• 0 n[         R                  " 5       (       a'  [        R                  " SS/SS/S9u  p#[        U5      nO™[        R                  " S5      (       a'   [        R                  " / SQ5      u  pC[        U5      nOW[        R                  " S5      (       a'  [        R                  " SS/SS/S9u  p#[        U5      nO[        R                  S	5        U S
:X  a  U$ [        [        [        4mSUU4S jjmT" XS9  U$ ! [        R                   a(    [        R                  " / SQ5      u  pC[        U5      n Nef = f)aæ  return 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'},
    ]
},
}

Úifconfigz-ar   rh   ©Úrcsr1   )r1   z--jsonrC   )r1   rC   Úshowz>Could not print networks: missing 'ip' and 'ifconfig' commandsr   c                 ó  >• [        U [        5      (       a  U R                  5       nO2[        U [        [        45      (       a  [        U 5      nO[        S5      eU H+  u  pEXR;   a  XU'   M  [        UT5      (       d  M#  T" XQ5        M-     g)zIRecursively replace 'empty_vals' in data (dict, tuple, list)
with new_valzUnexpected input to fillN)Ú
isinstancer   ÚitemsÚtupleÚlistrN   Ú	TypeError)ÚdataÚnew_valÚ
empty_valsÚmyiterÚkeyÚvalÚfillÚrecurse_typess         €€r"   r“   Únetdev_info.<locals>.fillg  sq   ø€ ô �dœD×!Ñ!Ø—Z‘Z“\‰FÜ˜œu¤d˜m×,Ñ,Ü˜t“_‰FäÐ6Ó7Ð7ã‰HˆCØÓ Ø#�S“	Ü˜C ×/Ó/Ù�SÖ"ò	 r!   )rŽ   )r   )r   r!   )r   Ú	is_NetBSDr
   r~   ÚwhichrE   ÚProcessExecutionErrorra   r€   rU   rV   r   rŠ   r‹   )Úemptyr@   Ú	ifcfg_outÚ_errrZ   r“   r”   s        @@r"   Únetdev_inforœ   %  s  ù€ ðN €DÜ‡~‚~×ÑÜ ŸIšI z°4Ð&8¸qÀ!¸fÑEÑˆÜ+¨IÓ6‰Ü	�Š�D×	Ñ	ð	4Ü!%§¢Ò+CÓ!DÑˆZÜ,¨ZÓ8‰Dô
 
�Š�J×	Ñ	ä ŸIšI z°4Ð&8¸qÀ!¸fÑEÑˆÜ$ YÓ/‰ä�‰ØLô	
ð �ƒ{Øˆäœ5¤$Ð'€M÷#ð #ñ  	ˆÒØ€KøôG ×)Ñ)ó 	4ä!%§¢Ò+AÓ!BÑˆZÜ'¨
Ó3ŠDð	4ús   Á"%D	 Ä	9EÅEc                 óÐ  • 0 n/ US'   / US'   U R                  5       nSSSSSSS.nU GH)  n[        U5      nU(       d  M  UR                  5       nS/nUS   S:X  a  SUS	'   SUS
'   O]SUS   ;   a  US   R                  S5      u  p‰O&US   nSn	UR                  S5        [	        U	5      US
'   X…S	'   [	        U	5      US
'   SUS'   [        [        U5      5       HM  n
Xj   S:X  a  XjS-      US'   UR                  SS5        Xj   S:X  a
  XjS-      US'   Xj   S:X  d  MC  XjS-      US'   MO     SR                  U5      US'   US   R                  U5        GM,      [        R                  " / SQSS/S9u  p¼UR                  5       nU HÃ  n0 nU(       d  M  UR                  5       nUS   S:X  a  SUS	'   SUS'   OUS   US	'   SUS'   SUS'   [        [        U5      5       HS  n
Xj   S:X  a  XjS-      US'   SUS'   Xj   S:X  a
  XjS-      US'   Xj   S:X  a
  XjS-      US'   Xj   S:X  d  MH  US   S-   US'   MU     US   R                  U5        MÅ     U$ ! [        R                   a     U$ f = f)a8  
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.
r   r   r   )Údestinationr$   ÚgatewayÚgenmaskÚifaceÚmetricÚUr   Údefaultú0.0.0.0rž   r    r5   rL   ÚHrŸ   Úviarh   ÚGrA   r¡   r¢   r$   )r1   z	--onelinez-6Úrouter‹   ÚtableÚallr„   z::/0ÚUGú::ÚexpiresÚe)rO   r   rT   r=   r   rs   rq   ÚinsertÚjoinr
   r˜   )Úiproute_dataÚroutesÚentriesÚdefault_route_entryr]   Úentryrx   r$   rC   Úcidrry   Úiproute_data6Ú_err6Úentries6s                 r"   Ú_netdev_route_info_iprouter»   {  sß  € ð €FØ€Fˆ6�NØ€Fˆ6�NØ×%Ñ%Ó'€GàØØØØØñÐô ˆÜÐ(Ó)ˆÞÙØ�z‰z‹|ˆØ�ˆØ�‰7�iÓØ#,ˆE�-Ñ Ø(ˆE�)Òà�d˜1‘g‹~Ø# A™wŸ}™}¨SÓ1‘��tà˜A‘w�Ø�Ø—‘˜SÔ!Ü#:¸4Ó#@��iÑ Ø#'�-Ñ Ü6°tÓ<ˆE�)ÑØ(ˆE�)ÑÜ”s˜4“yÖ!ˆAØ‰w˜%ÓØ#'¨A©¡;��iÑ Ø—‘˜Q Ô$Ø‰w˜%ÓØ!%¨!¡e¡��g‘Ø‰w˜(Õ"Ø"&¨1¡u¡+��h“ñ "ð Ÿ™ ›ˆˆg‰Øˆv‰×Ñ˜e×$ñ; ð<)Ü!%§¢ÚFØ�A�ñ"
Ñˆð !×+Ñ+Ó-ˆÛˆDØˆEÞÙØ—:‘:“<ˆDØ�A‰w˜)Ó#Ø'-��mÑ$Ø!%��g’à'+¨A¡w��mÑ$Ø#'��iÑ Ø!$��g‘Üœ3˜t›9Ö%�Ø‘7˜eÓ#Ø'+°©E¡{�E˜)Ñ$Ø%)�E˜'‘NØ‘7˜eÓ#Ø%)¨a©%¡[�E˜'‘NØ‘7˜hÓ&Ø&*¨q©5¡k�E˜(‘OØ‘7˜iÕ'Ø%*¨7¡^°cÑ%9�E˜'“Nñ &ð �6‰N×!Ñ! %Ö(ñ- ð. €Møô7 ×%Ñ%ó Øð4 €Mð7ús   ÅI ÉI%É$I%c           
      ó   • 0 n/ US'   / US'   U R                  5       nU HÏ  nU(       d  M  UR                  5       n[        U5      S:  d-  US   S:X  d$  US   S:X  d  US   S:X  d  US   S:X  d	  US   S	:X  a  MZ  [        U5      S
:  a/  UR                  S5        UR                  S5        US   US'   SUS'   US   US   US   US   US   US   US   US   S.nUS   R                  U5        MÑ      [        R                  " / SQSS/S9u  pgUR                  5       nU HÏ  nU(       d  M  UR                  5       n[        U5      S:  d-  US   S:X  d$  US   S:X  d  US   S:X  d  US   S:X  d	  US   S:X  a  MZ  US   US   US   US   US   US   US   S.nUS   S:X  a  M„  US   R                  S5      (       a  [        R                  " SSUS   5      US'   US   R                  U5        MÑ     U$ ! [        R                   a     U$ f = f)Nr   r   é   r   ÚKernelÚDestinationÚInternetÚ	Internet6ÚRoutingé   Ú-é   é   rh   rj   é   é   )rž   rŸ   r    r$   r¢   ÚrefÚuser¡   )Únetstatz-Ar4   ú--routeú	--numericr„   ÚProtoÚActive)rž   rŸ   r$   r¢   rÉ   rÊ   r¡   r¡   Úlorž   z/128z\/128$r   )	rO   rT   rq   r=   r
   rn   rP   Úsubr˜   )	Ú
route_datar³   r´   r]   rx   r¶   Úroute_data6r¹   rº   s	            r"   Ú_netdev_route_info_netstatrÔ   Ó  sm  € Ø€FØ€Fˆ6�NØ€Fˆ6�Nà×#Ñ#Ó%€GÛˆÞÙØ�z‰z‹|ˆô �‹I˜‹MØ�A‰w˜(Ó"Ø�A‰w˜-Ó'Ø�A‰w˜*Ó$Ø�A‰w˜+Ó%Ø�A‰w˜)Ó#áÜˆt‹9�q‹=Ø�K‰K˜ÔØ�K‰K˜ÔØ˜1‘gˆD�‰GØˆD�‰Gà ™7Ø˜A‘wØ˜A‘wØ˜!‘WØ˜1‘gØ˜‘7Ø˜‘7Ø˜!‘Wñ	
ˆð 	ˆv‰×Ñ˜eÖ$ñG ðJ&)Ü#ŸyšyÚ>ÀQÈÀFñ 
Ñˆð ×)Ñ)Ó+ˆÛˆDÞÙØ—:‘:“<ˆDä�D“	˜A“Ø˜‘7˜hÓ&Ø˜‘7˜mÓ+Ø˜‘7˜jÓ(Ø˜‘7˜gÓ%Ø˜‘7˜hÓ&áà# A™wØ ™7Ø˜a™Ø˜q™'Ø˜A‘wØ˜A‘wØ˜a™ñˆEð �W‰~ Ó%Ùà�]Ñ#×,Ñ,¨V×4Ñ4Ü')§v¢vØ˜r 5¨Ñ#7ó(��mÑ$ð �6‰N×!Ñ! %Ö(ñ= ð> €MøôG ×%Ñ%ó ØðD €MðGús   Ã3G5 Ç5HÈHc                  ó>  • 0 n [         R                  " S5      (       a'  [         R                   " / SQ5      u  p[        U5      n U $ [         R                  " S5      (       a(  [         R                   " / SQSS/S9u  p2[        U5      n U $ [        R                  S5        U $ )	Nr1   )r1   z-or©   r‹   rË   )rË   rÌ   rÍ   z--extendr   rh   r„   z;Could not print routes: missing 'ip' and 'netstat' commands)r
   r—   r»   rÔ   rU   rV   )r³   Úiproute_outr›   Ú	route_outs       r"   Ú
route_inforØ   (  s�   € Ø€FÜ‡z‚z�$×Ñä"ŸišiÒ(EÓFÑˆÜ+¨KÓ8ˆð €Mô 
�Š�I×	Ñ	ä ŸIšIÚ;À!ÀQÀñ
Ñˆô ,¨IÓ6ˆð
 €Mô 	�‰ØIô	
ð €Mr!   c                  ó¤  • / n Sn [        US9nU(       d  g/ SQn[        U5      n[        UR                  5       5       HÈ  u  pVUR	                  S5      nU H6  nUR                  UUS   US   US   UR	                  S	U5      US
   45        M8     UR	                  S5      n	U	 H3  nUR                  UUS   US   UUR	                  SU5      US
   45        M5     U(       a  M¥  U	(       a  M®  UR                  XVS   XXS
   45        MÊ     UR                  5       n
[        [        U
R                  5       [        S95      n[        R                  " SSU5      nU R                  XÊ/5        SR#                  U 5      S-   $ ! [         aG  nU R                  [        R                  " SR                  [!        U5      S9SS5      5         S nAN`S nAff = f)NÚ.)r™   Ú
)ÚDeviceÚUpÚAddressÚMaskÚScopez
Hw-Addressr   r   r1   r2   r0   r   r   r7   ©r‘   zNet device infoÚ+z Net device info failed ({error})©ÚerrorÚ!éP   )rœ   r   Úsortedr‰   r;   Úadd_rowÚ
get_stringrq   ÚmaxrO   r   ÚcenterÚextendÚ	Exceptionr=   Úformatr   r±   )Úlinesr™   ÚnetdevÚfieldsÚtblrA   r�   Ú
ipv4_addrsrC   Ú
ipv6_addrsÚnetdev_sÚmax_lenÚheaderr¯   s                 r"   Únetdev_pformatrø   ;  sÅ  € Ø€EØ€Eð0)Ü 5Ñ)ˆö ØÚKˆÜ˜&Ó!ˆÜ §¡£Ö/‰IˆCØŸ™ &Ó)ˆJÛ"�Ø—‘àØ˜T™
Ø˜T™
Ø˜V™ØŸ™ ¨%Ó0Ø˜X™ðö	ñ #ð Ÿ™ &Ó)ˆJÛ"�Ø—‘àØ˜T™
Ø˜T™
ØØŸ™ ¨5Ó1Ø˜X™ðö	ñ #÷ �J¯¨Ø—‘Ø˜t™* e°EÀ¹>ÐJöñ7 0ð< —>‘>Ó#ˆÜ”c˜(×-Ñ-Ó/´SÑ9Ó:ˆÜ—’Ð.°°WÓ=ˆØ�‰�fÐ'Ô(Ø�9‰9�UÓ˜dÑ"Ð"øô_ ó 
Ø�‰Ü�KŠKØ2×9Ñ9ÄÀAÃÐ9ÐGØØó÷	
ñ 	
ûð
ús   †	E> Å>
GÆ=G
Ç
Gc            
      óª  • / n  [        5       nUR                  S5      (       aÐ  / SQn[        U5      n[        UR                  S5      5       HD  u  pE[	        U5      n UR                  UUS   UR                  SS5      US   US   US   /5        MF     UR                  5       n[        [        UR                  5       [        S
95      n	[        R                  " SSU	5      n
U R                  X¨/5        UR                  S5      (       a×  / SQn[        U5      n[        UR                  S5      5       HK  u  pE[	        U5      nUS   S:X  a  M   UR                  UUS   UR                  SS5      US   US   /5        MM     UR                  5       n[        [        UR                  5       [        S
95      n	[        R                  " SSU	5      n
U R                  X¨/5        SR'                  U 5      S-   $ ! [         a*  n[        R                  " [        S	U-  5         S nAGM×  S nAff = f! [         a*  n[        R                  " [        S	U-  5         S nAGM(  S nAff = f! [          ae  nU R#                  [        R                  " SR%                  [	        U5      S9SS5      5        [        R                  " [        SU-  5         S nANìS nAff = f)Nr   )ÚRouter¿   ÚGatewayÚGenmaskr   ÚFlagsrž   rŸ   r¥   r    r¡   r$   zRoute info formatting error: %srá   zRoute IPv4 inforâ   r   )rú   r¿   rû   r   rý   rÐ   r­   zRoute IPv6 infozRoute info failed ({error})rã   rå   ræ   zRoute info failed: %srÛ   )rØ   r;   r   rN   r   rè   ÚKeyErrorr   ÚlogexcrU   ré   rq   rê   rO   rë   rì   rí   r=   rî   r±   )rï   r³   Ú	fields_v4Útbl_v4ÚnÚrÚroute_idr¯   Úroute_srö   r÷   Ú	fields_v6Útbl_v6s                r"   Úroute_pformatr  r  s�  € Ø€EðC,Ü“ˆð �:‰:�f×ÑòˆIô ! Ó+ˆFÜ! &§*¡*¨VÓ"4Ö5‘�Ü˜q›6�ðLØ—N‘Nà$Ø˜mÑ,ØŸE™E )¨YÓ7Ø˜i™LØ˜g™JØ˜g™Jðö	ñ 6ð ×'Ñ'Ó)ˆGÜœ#˜g×0Ñ0Ó2¼Ñ<Ó=ˆGÜ—[’[Ð!2°C¸ÓAˆFØ�L‰L˜&Ð*Ô+Ø�:‰:�f×ÑòˆIô ! Ó+ˆFÜ! &§*¡*¨VÓ"4Ö5‘�Ü˜q›6�Ø�W‘: Ó%ÙðLØ—N‘Nà$Ø˜mÑ,ØŸE™E )¨TÓ2Ø˜g™JØ˜g™Jðöñ 6ð  ×'Ñ'Ó)ˆGÜœ#˜g×0Ñ0Ó2¼Ñ<Ó=ˆGÜ—[’[Ð!2°C¸ÓAˆFØ�L‰L˜&Ð*Ô+Ø�9‰9�UÓ˜dÑ"Ð"øôG  ó LÜ—K’K¤Ð%FÈÑ%J×KÓKûðLûô:  ó LÜ—K’K¤Ð%FÈÑ%J×KÓKûðLûôy ó 6Ø�‰Ü�KŠKØ-×4Ñ4¼3¸q»6Ð4ÐBÀCÈóô	
ô
 	�Š”CÐ0°1Ñ4×5Ñ5ûð6úsH   „
I# Á3G5Å/H,Ç5
H)Ç?H$È$H)È,
I È6IÉI É#
KÉ-AKËKc                 ól  • / n[        5       R                  5       nU (       a!  U H  nUR                  U < U< 35        M     OUR                  U5        [	        5       R                  5       nU (       a!  U H  nUR                  U < U< 35        M     OUR                  U5        SR                  U5      $ )NrÛ   )rø   rO   r=   rì   r  r±   )r`   rï   Únetdev_linesr]   Úroute_liness        r"   Ú
debug_infor  »  s�   € Ø€EÜ!Ó#×.Ñ.Ó0€LÞÛ ˆDØ�L‰L¢6ª4Ð0Ö1ò !ð 	�‰�\Ô"Ü“/×,Ñ,Ó.€KÞÛˆDØ�L‰L¢6ª4Ð0Ö1ò  ð 	�‰�[Ô!Ø�9‰9�UÓÐr!   )r   )z	ci-info: )%r9   ÚloggingrP   r   r   Ú	ipaddressr   Útypingr   r   r   Ú	cloudinitr	   r
   r   Úcloudinit.net.network_stater   Úcloudinit.simpletabler   Ú	getLoggerr   rU   ro   r   rE   Údeprecate_callra   r~   r€   r   rœ   r»   rÔ   rØ   rø   r  r  r   r!   r"   Ú<module>r     sß   ðó Û Û 	ß Ý !ß (Ñ (ç +Ñ +Ý ?Ý -à×Ò˜Ó!€ð&  "¨2¸À5ÑIÐ ô�	ô ò3ðl ×ÒØðKññ
Kóð
Kò\-ò`6ðt ñSà	ˆ#ˆt�C˜�NÑ#Ð
#Ñ$õSòlUòpRòjò&4#ònF#õRr!   