
    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$'GGK$8G$C#i.tu}<u)<=	
 GGK,Dxx!V+ #d* htK/@.A$BCKKL  ((7B/ !XXk26!XXgr2	  ''4h7*XXgr* dhhy114q+r!: ;<B"hhw3  ''47 -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  pn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	HHFMwwu~++-33C8;HGGG$**3/E45=@Z5-@A	DN _. 	A @# N6"))!++-8t^- A @# KKMEIIg&E#ooc2ODVN6"))/4W~U7^23F;"7^	 t^@$A @# ww{#w.+,778+<x(+-x(A 8B 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XU   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+%ZZ\!_Fs##!'(;<zz|!!#))+t9q=yy.Q88%)VT"s4y!Aw& $(QK$5$5c$:!VV$++",CH,MN K'48Q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16VV$R(.##H--59W^^H5MVV$R(2I%hh|Ta%[99<1DL(,X69=!eDL(,X63 " +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+%ZZ\!_Fs##!'(;<zz|!!#))+7d?!%DL Y]yy)4733%)VT"s4y!Aw& VV$++4A;--g67 ##H--48GNN84LVV$R(1K'48QKVV$R(1##G,,377>>'3JVV$R(0I%37A;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16VV$R(.##H--59W^^H5MVV$R(2I%hh|Ta%[99<1DL(,X69=!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     dD!!ZZ\Fudm,,t_F677HC #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~~ IIz4&8q!fE+I6	D			4!%+C!DZ,Z8D
 
J		 IIz4&8q!fE$Y/L	
 {5$'M# #  	KG )) 	4!%+A!BZ'
3D	4s   "%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  pO&US   nSn	UR                  S5        [	        U	5      US
'   XS	'   [	        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  pU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F6NF6N%%'G ()zz|7i#,E- (E)d1g~#Aw}}S1tAwS!#:4#@i #'- 6t<E)(E)s4y!Aw%#'A;i Q$w%!%!egw(""&1u+h " gve$; <)!%FA"
 !++-DE::<DAw)#'-m$!%g'+Awm$#'i !$g3t9%7e#'+E{E)$%)E'N7e#%)a%[E'N7h&&*q5kE(O7i'%*7^c%9E'N & 6N!!%(- . M7 %% 4 M7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F6NF6N##%Gzz| IMAw("Aw-'Aw*$Aw+%Aw)#t9q=KKKK1gDGDG7AwAw!W1g77!W	
 	ve$G J&)#yy>QF 
 ))+D::<DD	A7h&7m+7j(7g%7h&#Aw7aq'AwAwaE W~%]#,,V44')vvr5#7(m$ 6N!!%(= > MG %% D MG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zz$"ii(EF+K8 M 
I		 II;!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&!/IC&)J"T
T
V%0X	 # &)J"T
T
51X	 # Jt*eE>J7 0< >>#c(--/S9:.W=f'(99Ud""_  
KK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NS 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q6LNN$m,EE)Y7iLgJgJ	 6 '')G#g002<=G[[!2CAFLL&*+::fI !+F!&**V"45q6W:%LNN$m,EE)T2gJgJ 6  '')G#g002<=G[[!2CAFLL&*+99Ud""G   LKK%F%JKKL:   LKK%F%JKKLy  6KK-443q64BC	

 	C014556sH   
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!#..0L DLL6401 ! 	\"/,,.KDLL6401   	[!99U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	#tCN#
#$SlUpRj&4#nF#Rr!   