Ë
    x[hF`  ã                   óP  — d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZ  ej&                  e«      Zg g dd	d
œZ G d„ de
«      Zd„ Z ej2                  dd¬«      d„ «       Zd„ Zd„ Z	 ddeeeeef   f   fd„Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#dd„Z$y)é    N)ÚcopyÚdeepcopy)ÚIPv4Network)ÚDictÚListÚ	TypedDict)Ú	lifecycleÚsubpÚutil)Únet_prefix_to_ipv4_mask)ÚSimpleTableÚ F©Úipv4Úipv6ÚhwaddrÚupc                   óB   — e Zd ZU eed<   eed<   ee   ed<   ee   ed<   y)Ú	Interfacer   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__ÚboolÚ__annotations__Ústrr   Údict© ó    ú3/usr/lib/python3/dist-packages/cloudinit/netinfo.pyr   r   ,   s    … ØƒHØƒKØ
ˆt‰*ÓØ
ˆt‰*Ôr   r   c           	      óð  — t        j                  | «      }i }|D �]X  }d|v r|d   ng }|j                  d«      dk(  r|d   nd}|t        d|v xr d|v «      g g dœ}|j                  d	g «      D ]ú  }|j                  d
«      dk(  rvd|v r$t	        t        d|d   › �«      j                  «      nd}|j                  dd«      ||j                  dd«      |j                  dd«      dœ}	|d   j                  |	«       Œ�|d
   dk(  sŒ–|j                  dd«      }
|
r(|j                  d«      s|
› d|j                  dd«      › �}
|
|j                  dd«      dœ}	|d   j                  |	«       Œü |||d   <   �Œ[ |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)r   r   r   r   Ú	addr_infoÚfamilyÚinetÚ	prefixlenz0.0.0.0/ÚlocalÚ	broadcastÚscope)ÚipÚmaskÚbcastr-   r   Úinet6ú/é@   )r.   Úscope6r   Úifname)ÚjsonÚloadsÚgetr   r   r   ÚnetmaskÚappend)Úipaddr_jsonÚipaddr_dataÚdevsÚdevr!   r$   Údev_infoÚaddrr/   Úparsed_addrr.   s              r   Ú_netdev_info_iproute_jsonrB   3   s²  € ô —*‘*˜[Ó)€KØ€Dàó %'ˆØ '¨3¡��G’°BˆØ$'§G¡G¨KÓ$8¸GÒ$C�#�i’.ÈˆàÜ�t˜u�}Ò<¨°uÐ)<Ó=ØØñ	
ˆð —G‘G˜K¨Ó,ò 	5ˆ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Ø˜4˜q §¡¨+°rÓ!:Ð ;Ð<�BàØ"Ÿh™h w°Ó3ñ�ð ˜Ñ ×'Ñ'¨Õ4ð7	5ð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  — i }d}t        | j                  «       «      D �]ô  \  }}t        j                  d|«      }|rm|j	                  d«      j                  «       j                  d«      d   }|j	                  d«      j                  d«      }g g dt        d	|v xr d
|v «      dœ||<   ŒŒd|v rVt        j                  d|«      }|st        j                  d||«       ŒÀ||   d   j                  |j                  «       «       Œæd|v rŸt        j                  d|«      }|st        j                  d||«       �Œ|j                  «       }|j                  d«      }|j                  d«      \  }	}
}|sd}||   d   j                  |	|d   r|d   ndt        |«      |d   dœ«       �Œ‰d|v rht        j                  d|«      }|st        j                  d||«       �Œ¾|j	                  d«      dk(  r|j	                  d«      ||   d<   �Œëd||   d<   �Œõ�Œ÷ |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<dev>[^:]+):\s+<(?P<flags>\S+)>\s+.*r>   ú@r   r!   ú,r   r%   r&   r   r1   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+).*Úcidr4r2   Ú32r   r0   r-   )r.   r0   r/   r-   Ú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!   rN   rH   r@   Ú_Úprefixs               r   Ú_netdev_info_iprouter^   i   s2  € ð €DØ€HÜ˜z×4Ñ4Ó6Ó7ó @‰	ˆˆTÜ�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ñ Ü—‘Ø@À#Àtôð Ø�‰N˜6Ñ"×)Ñ)¨!¯+©+«-Õ8Ø�t‰^Ü—‘ð-ð óˆAñ Ü—‘Ø@À#Àtôñ Ø—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ñ Ü—‘Ø@À#Àtôñ Ø�w‰w�{Ó# wÒ.Ø+,¯7©7°8Ó+<��X‘˜xÓ(à+-��X‘˜xÓ(áðA@ðB €Kr   c                 óÖ  — i }| j                  «       D �]R  }|sŒ|d   dvr?|j                  «       d   }|j                  d«      r|d d }||vrt        t        «      ||<   |j                  «       j                  «       j                  «       }t        |«      dkD  r!t        j                  d|d   «      rd|   d<   t        t        |«      «      D �]“  }||   d	k(  r>||dz      j                  d
«      \  }}|   d   j                  |t        |«      dœ«       ŒJ||   dk(  r||dz      |   d   d   d<   Œg||   dk(  r||dz      |   d<   Œ~||   dk(  rK||dz      dk(  r |   d   j                  d||dz      i«       Œ±|   d   j                  d||dz      i«       ŒÑ||   dk(  r*|   d   d   d   d
z   ||dz      z   }|||   d   d   d<   �Œ||   j                  d«      r"||   j                  d«      |   d   d   d<   �Œ9||   dk(  s�ŒCt        j                  d||dz      «      }	|	r|	j!                  d«      |   d   d   d<   �Œ€||dz      |   d   d   d<   �Œ– �ŒU |S )Nr   ©ú	ú ú:éÿÿÿÿé   zflags=[x\d]+<up.*>Tr   r)   r2   r   )r.   r/   r,   r0   zaddress:r   r1   úaddr:r   r.   é   r*   úscope:r4   Úscopeidú	.*<(\S+)>)rL   rQ   Úendswithr   ÚDEFAULT_NETDEV_INFOrP   ÚstripÚlenrM   ÚsearchÚranger:   r   Ú
startswithÚlstriprN   rO   )
Úifconfig_datar=   rZ   ÚcurdevÚtoksÚiÚnetworkÚnet_bitsÚaddr6Úress
             r   Ú_netdev_info_ifconfig_netbsdr{   ¼   sÉ  € à€DØ×(Ñ(Ó*ó (EˆÙØØ�‰7˜+Ñ%Ø—Z‘Z“\ !‘_ˆFà�‰˜sÔ#Ø  ˜�Ø˜TÑ!Ü'Ô(;Ó<��V‘Ø�z‰z‹|×!Ñ!Ó#×)Ñ)Ó+ˆÜˆt‹9�qŠ=Ü�y‰yÐ.°°Q±Ô8Ø%)��V‘˜TÑ"ä”s˜4“yÓ!ó 	EˆAØ�A‰w˜&Ò Ø$(¨¨Q©¡K×$5Ñ$5°cÓ$:Ñ!�˜Ø�V‘˜VÑ$×+Ñ+Ø"Ô,CÀHÓ,MÑNõð �a‘˜KÒ'Ø48¸¸Q¹±K��V‘˜VÑ$ RÑ(¨Ò1Ø�a‘˜JÒ&Ø)-¨a°!©e©��V‘˜XÒ&Ø�a‘˜GÒ#Ø˜˜A™‘; 'Ò)Ø˜‘L Ñ(×/Ñ/°°t¸AÀ¹E±{Ð0CÕDà˜‘L Ñ(×/Ñ/°°t¸AÀ¹E±{Ð0CÕDØ�a‘˜KÒ'Ø˜V™ VÑ,¨RÑ0°Ñ6¸Ñ<¸tÀAÈÁE¹{ÑJ�Ø16��V‘˜VÑ$ RÑ(¨Ó.Ø�a‘×#Ñ# HÔ-Ø59¸!±W·^±^ÀHÓ5M��V‘˜VÑ$ RÑ(¨Ó2Ø�a‘˜IÔ%Ü—h‘h˜|¨T°!°a±%©[Ó9�ÙØ9<¿¹À1»�D˜‘L Ñ(¨Ñ,¨XÓ6à9=¸aÀ!¹e¹�D˜‘L Ñ(¨Ñ,¨XÓ6ò3	Eð(EðT €Kr   c                 óü  — i }| j                  «       D �]å  }|sŒ|d   dvr?|j                  «       d   }|j                  d«      r|d d }||vrt        t        «      ||<   |j                  «       j                  «       j                  «       }|d   dk(  r	d|   d<   n/t        |«      dkD  r!t        j                  d|d   «      rd|   d<   t        t        |«      «      D �]  }||   d	k(  r/|   d
   j                  d||dz      j                  d«      i«       Œ;||   j                  d«      r!||   j                  d«      |   d
   d   d<   Œp||   dk(  r||dz      |   d
   d   d<   Œ�||   j                  d«      r!||   j                  d«      |   d
   d   d<   ŒÂ||   dk(  r||dz      |   d
   d   d<   Œß||   dk(  s||   dk(  r||dz      |   d<   Œþ||   dk(  rM||dz      dk(  r!|   d   j                  d||dz      i«       �Œ2|   d   j                  d||dz      i«       �ŒS||   dk(  r*|   d   d   d   dz   ||dz      z   }|||   d   d   d<   �Œ…||   j                  d«      r"||   j                  d«      |   d   d   d<   �Œ»||   dk(  s�ŒÅt        j                  d||dz      «      }|r|j                  d«      |   d   d   d<   �Œ||dz      |   d   d   d<   �Œ �Œè |S )Nr   r`   rc   rd   r   Tre   zflags=\d+<up,r)   r   r.   rf   zbcast:r0   r,   zmask:r/   r9   r   r#   r1   r   rg   r*   r2   rh   r4   ri   rj   )rL   rQ   rk   r   rl   rP   rm   rn   rM   ro   rp   r:   rr   rq   rN   rO   )rs   r=   rZ   rt   ru   rv   ry   rz   s           r   Ú_netdev_info_ifconfigr}   ì   sy  € à€DØ×(Ñ(Ó*ó 1EˆÙØØ�‰7˜+Ñ%Ø—Z‘Z“\ !‘_ˆFà�‰˜sÔ#Ø  ˜�Ø˜TÑ!Ü'Ô(;Ó<��V‘Ø�z‰z‹|×!Ñ!Ó#×)Ñ)Ó+ˆØ�‰7�dŠ?Ø!%ˆD�‰L˜Òô �‹Y˜Š]Ü�y‰yÐ)¨4°©7Ô3Ø%)��V‘˜TÑ"ä”s˜4“yÓ!ó 	EˆAØ�A‰w˜&Ò Ø�V‘˜VÑ$×+Ñ+Ø˜4  A¡™;×-Ñ-¨gÓ6Ð7õð �a‘×#Ñ# HÔ-Ø48¸±G·N±NÀ8Ó4L��V‘˜VÑ$ RÑ(¨Ò1Ø�a‘˜KÒ'Ø48¸¸Q¹±K��V‘˜VÑ$ RÑ(¨Ò1Ø�a‘×#Ñ# GÔ,Ø37¸±7·>±>À'Ó3J��V‘˜VÑ$ RÑ(¨Ò0Ø�a‘˜IÒ%Ø37¸¸A¹±;��V‘˜VÑ$ RÑ(¨Ò0Ø�a‘˜HÒ$¨¨Q©°7Ò(:Ø)-¨a°!©e©��V‘˜XÒ&Ø�a‘˜GÒ#Ø˜˜A™‘; 'Ò)Ø˜‘L Ñ(×/Ñ/°°t¸AÀ¹E±{Ð0CÖDà˜‘L Ñ(×/Ñ/°°t¸AÀ¹E±{Ð0CÖDØ�a‘˜KÒ'Ø˜V™ VÑ,¨RÑ0°Ñ6¸Ñ<¸tÀAÈÁE¹{ÑJ�Ø16��V‘˜VÑ$ RÑ(¨Ó.Ø�a‘×#Ñ# HÔ-Ø59¸!±W·^±^ÀHÓ5M��V‘˜VÑ$ RÑ(¨Ó2Ø�a‘˜IÔ%Ü—h‘h˜|¨T°!°a±%©[Ó9�ÙØ9<¿¹À1»�D˜‘L Ñ(¨Ñ,¨XÓ6à9=¸aÀ!¹e¹�D˜‘L Ñ(¨Ñ,¨XÓ6ò=	Eð'1Eðf €Kr   Úreturnc                 óx  ‡‡— i }t        j                  «       r*t        j                  ddgddg¬«      \  }}t        |«      }n�t        j                  d«      r'	 t        j                  g d¢«      \  }}t        |«      }nTt        j                  d«      r*t        j                  ddgddg¬«      \  }}t        |«      }nt        j                  d	«       | d
k(  r|S t        t        t        fŠdˆˆfd„	Š ‰|| ¬«       |S # t        j                  $ r( t        j                  g d¢«      \  }}t        |«      }Y Œew xY w)af  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   re   ©Úrcsr.   )r.   z--jsonr@   )r.   r@   Úshowz>Could not print networks: missing 'ip' and 'ifconfig' commandsr   c                 óö   •— t        | t        «      r| j                  «       }n-t        | t        t        f«      rt        | «      }nt        d«      ‚|D ]%  \  }}||v r|| |<   Œt        |‰«      sŒ ‰||«       Œ' y)zQRecursively replace 'empty_vals' in data (dict, tuple, list)
        with new_valzUnexpected input to fillN)Ú
isinstancer   ÚitemsÚtupleÚlistrK   Ú	TypeError)ÚdataÚnew_valÚ
empty_valsÚmyiterÚkeyÚvalÚfillÚrecurse_typess         €€r   r�   znetdev_info.<locals>.fillg  su   ø€ ô �dœDÔ!Ø—Z‘Z“\‰FÜ˜œu¤d˜mÔ,Ü˜t“_‰FäÐ6Ó7Ð7àò 	#‰HˆC�Ø�jÑ Ø#��S’	Ü˜C Õ/Ù�S˜'Õ"ñ		#r   )r‹   )r   )r   r   )r   Ú	is_NetBSDr
   r{   ÚwhichrB   ÚProcessExecutionErrorr^   r}   rR   rS   r   r‡   rˆ   )Úemptyr=   Ú	ifcfg_outÚ_errrW   r�   r‘   s        @@r   Únetdev_infor˜   %  s  ù€ ðN €DÜ‡~�~ÔÜ ŸI™I z°4Ð&8¸qÀ!¸fÔEÑˆ�DÜ+¨IÓ6‰Ü	�‰�DÔ	ð	4Ü!%§¡Ò+CÓ!DÑˆZ˜Ü,¨ZÓ8‰Dô
 
�‰�JÔ	ä ŸI™I z°4Ð&8¸qÀ!¸fÔEÑˆ�DÜ$ YÓ/‰ä�‰ØLô	
ð �‚{Øˆäœ5¤$Ð'€Mö#ñ  	ˆ�uÕØ€KøôG ×)Ñ)ò 	4ä!%§¡Ò+AÓ!BÑˆZ˜Ü'¨
Ó3ŠDð	4ús   Á%C> Ã>8D9Ä8D9c                 ó°  — i }g |d<   g |d<   | j                  «       }dddddddœ}|D �]!  }t        |«      }|sŒ|j                  «       }dg}|d   dk(  rd|d	<   d|d
<   n]d|d   v r|d   j                  d«      \  }}	n&|d   }d}	|j                  d«       t	        |	«      |d
<   ||d	<   t	        |	«      |d
<   d|d<   t        t        |«      «      D ]N  }
||
   dk(  r||
dz      |d<   |j                  dd«       ||
   dk(  r||
dz      |d<   ||
   dk(  sŒD||
dz      |d<   ŒP dj                  |«      |d<   |d   j                  |«       �Œ$ 	 t        j                  g d¢ddg¬«      \  }}|j                  «       }|D ]»  }i }|sŒ|j                  «       }|d   dk(  rd|d	<   d|d<   n|d   |d	<   d|d<   d|d<   t        t        |«      «      D ]T  }
||
   dk(  r||
dz      |d<   d|d<   ||
   dk(  r||
dz      |d<   ||
   dk(  r||
dz      |d<   ||
   dk(  sŒJ|d   dz   |d<   ŒV |d   j                  |«       Œ½ |S # t        j                  $ r Y |S w xY w)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.
    r   r   r   )Údestinationr!   ÚgatewayÚgenmaskÚifaceÚmetricÚUr   Údefaultú0.0.0.0rš   rœ   r2   rI   ÚHr›   Úviare   ÚGr>   r�   rž   r!   )r.   z	--onelinez-6Úrouterˆ   ÚtableÚallr�   z::/0ÚUGú::ÚexpiresÚe)rL   r   rQ   r:   r   rp   rn   ÚinsertÚjoinr
   r”   )Úiproute_dataÚroutesÚentriesÚdefault_route_entryrZ   Úentryru   r!   r@   Úcidrrv   Ú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Ñ Ø#'ˆE�-Ñ Ü6°tÓ<ˆE�)ÑØ(ˆE�)ÑÜ”s˜4“yÓ!ò 	.ˆAØ�A‰w˜%ÒØ#'¨¨A©¡;��iÑ Ø—‘˜Q Ô$Ø�A‰w˜%ÒØ!% a¨!¡e¡��g‘Ø�A‰w˜(Ó"Ø"& q¨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Ò#Ø'+¨A°©E¡{�E˜)Ñ$Ø%)�E˜'‘NØ˜‘7˜eÒ#Ø%)¨!¨a©%¡[�E˜'‘NØ˜‘7˜hÒ&Ø&*¨1¨q©5¡k�E˜(‘OØ˜‘7˜iÓ'Ø%*¨7¡^°cÑ%9�E˜'’Nð	:ð �6‰N×!Ñ! %Õ(ð-	)ð. €Møô7 ×%Ñ%ò Øð4 €Mð7ús   ÅH> È>IÉIc           
      óÖ  — i }g |d<   g |d<   | j                  «       }|D ]À  }|sŒ|j                  «       }t        |«      dk  s(|d   dk(  s |d   dk(  s|d   dk(  s|d   dk(  s|d   d	k(  rŒMt        |«      d
k  r/|j                  d«       |j                  d«       |d   |d<   d|d<   |d   |d   |d   |d   |d   |d   |d   |d   dœ}|d   j                  |«       ŒÂ 	 t	        j                  g d¢ddg¬«      \  }}|j                  «       }|D ]¹  }|sŒ|j                  «       }t        |«      dk  s(|d   dk(  s |d   dk(  s|d   dk(  s|d   dk(  s|d   dk(  rŒM|d   |d   |d   |d   |d   |d   |d   dœ}|d   dk(  rŒu|d   j                  d«      rt        j                  dd|d   «      |d<   |d   j                  |«       Œ» |S # t        j                  $ r Y |S w xY w)Nr   r   é   r   ÚKernelÚDestinationÚInternetÚ	Internet6ÚRoutingé   ú-é   é   re   rg   é   é   )rš   r›   rœ   r!   rž   ÚrefÚuser�   )Únetstatz-Ar1   ú--routeú	--numericr�   ÚProtoÚActive)rš   r›   r!   rž   rÅ   rÆ   r�   r�   Úlorš   z/128z\/128$r   )	rL   rQ   rn   r:   r
   rk   rM   Úsubr”   )	Ú
route_datar¯   r°   rZ   ru   r²   Úroute_data6rµ   r¶   s	            r   Ú_netdev_route_info_netstatrÐ   Ó  sv  € Ø€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ô 
Ñˆ�eð ×)Ñ)Ó+ˆØò 	)ˆ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Ü')§v¡vØ˜r 5¨Ñ#7ó(��mÑ$ð �6‰N×!Ñ! %Õ(ð=	)ð> €MøôG ×%Ñ%ò ØðD €MðGús   Ã#G ÇG(Ç'G(c                  ó,  — i } t        j                  d«      r't        j                   g d¢«      \  }}t        |«      } | S t        j                  d«      r+t        j                   g d¢ddg¬«      \  }}t        |«      } | S t        j                  d«       | S )	Nr.   )r.   z-or¥   rˆ   rÇ   )rÇ   rÈ   rÉ   z--extendr   re   r�   z;Could not print routes: missing 'ip' and 'netstat' commands)r
   r“   r·   rÐ   rR   rS   )r¯   Úiproute_outr—   Ú	route_outs       r   Ú
route_inforÔ   (  s�   € Ø€FÜ‡z�z�$Ôä"Ÿi™iÒ(EÓFÑˆ�dÜ+¨KÓ8ˆð €Mô 
�‰�IÔ	ä ŸI™IÚ;À!ÀQÀô
Ñˆ�Dô ,¨IÓ6ˆð
 €Mô 	�‰ØIô	
ð €Mr   c                  óŒ  — g } d}	 t        |¬«      }|syg d¢}t        |«      }t        |j                  «       «      D ]»  \  }}|j	                  d«      }|D ]5  }|j                  ||d   |d   |d   |j	                  d	|«      |d
   f«       Œ7 |j	                  d«      }	|	D ]2  }|j                  ||d   |d   ||j	                  d|«      |d
   f«       Œ4 |rŒœ|	rŒŸ|j                  ||d   ||||d
   f«       Œ½ |j                  «       }
t        t        |
j                  «       t        ¬«      «      }t        j                  dd|«      }| j                  ||
g«       dj#                  | «      dz   S # t        $ rI}| j                  t        j                  dj                  t!        |«      ¬«      dd«      «       Y d }~Œad }~ww xY w)Nú.)r•   ú
)ÚDeviceÚUpÚAddressÚMaskÚScopez
Hw-Addressr   r   r.   r/   r-   r   r   r4   ©rŽ   zNet device infoú+z Net device info failed ({error})©Úerrorú!éP   )r˜   r   Úsortedr†   r8   Úadd_rowÚ
get_stringrn   ÚmaxrL   r   ÚcenterÚextendÚ	Exceptionr:   Úformatr   r­   )Úlinesr•   ÚnetdevÚfieldsÚtblr>   rŠ   Ú
ipv4_addrsr@   Ú
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™ðõ	ð
ò ªØ—‘Ø˜$˜t™* e¨U°E¸4À¹>ÐJõð7	ð< —>‘>Ó#ˆÜ”c˜(×-Ñ-Ó/´SÔ9Ó:ˆÜ—‘Ð.°°WÓ=ˆØ�‰�f˜hÐ'Ô(Ø�9‰9�UÓ˜dÑ"Ð"øô_ ò 
Ø�‰Ü�K‰KØ2×9Ñ9ÄÀAÃÐ9ÓGØØó÷	
ñ 	
ûð
ús   †E1 Å1	GÅ:?F>Æ>Gc            
      ó�  — g } 	 t        «       }|j                  d«      rÒg d¢}t        |«      }t        |j                  d«      «      D ]D  \  }}t	        |«      }	 |j                  ||d   |j                  dd«      |d   |d   |d   g«       ŒF |j                  «       }t        t        |j                  «       t        ¬
«      «      }	t        j                  dd|	«      }
| j                  |
|g«       |j                  d«      rØg d¢}t        |«      }t        |j                  d«      «      D ]I  \  }}t	        |«      }|d   dk(  rŒ	 |j                  ||d   |j                  dd«      |d   |d   g«       ŒK |j                  «       }t        t        |j                  «       t        ¬
«      «      }	t        j                  dd|	«      }
| j                  |
|g«       	 dj'                  | «      dz   S # t        $ r(}t        j                  t        d	|z  «       Y d }~�ŒÒd }~ww xY w# t        $ r(}t        j                  t        d	|z  «       Y d }~�Œ#d }~ww xY w# t         $ rf}| j#                  t        j                  dj%                  t	        |«      ¬«      dd«      «       t        j                  t        d|z  «       Y d }~Œæd }~ww xY w)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Ô   r8   r   rK   r   rä   ÚKeyErrorr   ÚlogexcrR   rå   rn   ræ   rL   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ò L‘��1Ü˜q›6�ðLØ—N‘Nà$Ø˜mÑ,ØŸE™E )¨YÓ7Ø˜i™LØ˜g™JØ˜g™Jðõ	ðLð ×'Ñ'Ó)ˆGÜœ#˜g×0Ñ0Ó2¼Ô<Ó=ˆGÜ—[‘[Ð!2°C¸ÓAˆFØ�L‰L˜& 'Ð*Ô+Ø�:‰:�fÔòˆIô ! Ó+ˆFÜ! &§*¡*¨VÓ"4Ó5ò L‘��1Ü˜q›6�Ø�W‘: Ò%ØðLØ—N‘Nà$Ø˜mÑ,ØŸE™E )¨TÓ2Ø˜g™JØ˜g™JðõðLð  ×'Ñ'Ó)ˆ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 Á3G.Å/H"Ç.	HÇ7HÈHÈ"	IÈ+IÉIÉ	KÉAK Ë Kc                 óH  — g }t        «       j                  «       }| r|D ]  }|j                  | ›|›�«       Œ n|j                  |«       t	        «       j                  «       }| r|D ]  }|j                  | ›|›�«       Œ n|j                  |«       dj                  |«      S )Nr×   )rô   rL   r:   rè   r  r­   )r]   rë   Únetdev_linesrZ   Úroute_liness        r   Ú
debug_infor  »  s™   € Ø€EÜ!Ó#×.Ñ.Ó0€LÙØ ò 	2ˆDØ�L‰L¡6©4Ð0Õ1ñ	2ð 	�‰�\Ô"Ü“/×,Ñ,Ó.€KÙØò 	2ˆDØ�L‰L¡6©4Ð0Õ1ñ	2ð 	�‰�[Ô!Ø�9‰9�UÓÐr   )r   )z	ci-info: )%r6   ÚloggingrM   r   r   Ú	ipaddressr   Útypingr   r   r   Ú	cloudinitr	   r
   r   Úcloudinit.net.network_stater   Úcloudinit.simpletabler   Ú	getLoggerr   rR   rl   r   rB   Údeprecate_callr^   r{   r}   r   r˜   r·   rÐ   rÔ   rô   r  r  r   r   r   ú<module>r     sã   ðó Û Û 	ß Ý !ß (Ñ (ç +Ñ +Ý ?Ý -à€g×Ñ˜Ó!€ð&  "¨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   