+
    iF`                     F   ^ RI t ^ RIt^ RIt^ RIHtHt ^ RIHt ^ RIHtH	t	H
t
 ^ RIHtHtHt ^ RIHt ^ RIHt ]P&                  ! ]4      tR. R	. R
RRR/t ! R R]
4      tR t]P2                  ! RRR7      R 4       tR tR tRR R lltR tR tR t R t!R t"R R lt#R# )!    N)copydeepcopy)IPv4Network)DictList	TypedDict)	lifecyclesubputil)net_prefix_to_ipv4_mask)SimpleTableipv4ipv6hwaddr upFc                   ,   a  ] tR t^,t o V 3R ltRtV tR# )	Interfacec                j   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[S[,          ;R&   S[S[,          ;R&   # )   r   r   r   r   )boolstrr   dict)format__classdict__s   "3/usr/lib/python3/dist-packages/cloudinit/netinfo.py__annotate__Interface.__annotate__,   s;     H K  t*  t*	      N)__name__
__module____qualname____firstlineno____annotate_func____static_attributes____classdictcell__)r   s   @r   r   r   ,   s      r   r   c                   \         P                  ! V 4      p/ pV EF  pRV9   d
   VR,          M. pVP                  R4      R8X  d
   VR,          MRpRTR\        RV9   ;'       d    R	V9   4      R
. R. /pVP                  R. 4       EF%  pVP                  R4      R8X  d   RV9   d)   \	        \        RVR,           24      P                  4      MRpRVP                  RR4      RVRVP                  RR4      RVP                  RR4      /p	VR
,          P                  V	4       K  VR,          R8X  g   K  VP                  RR4      p
V
'       d/   VP                  R4      '       g   V
 RVP                  R^@4       2p
RV
RVP                  RR4      /p	VR,          P                  V	4       EK(  	  WbVR,          &   EK  	  V# )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   r   r   UPLOWER_UPr   r   	addr_infofamilyinet	prefixlenz0.0.0.0/iplocalmaskbcast	broadcastscopeinet6/scope6ifname)jsonloadsgetr   r   r   netmaskappend)ipaddr_jsonipaddr_datadevsdevr)   r,   dev_infoaddrr5   parsed_addrr3   s   &          r   _netdev_info_iproute_jsonrI   3   s    **[)KD '3GB$'GGK$8G$C#i.g$tu}<<u)<=BB	
 GGK,Dxx!V+ #d* htK/@.A$BCKKL  $((7B/DTXXk26TXXgr2	  ''4h7*XXgr* dhhy114q+r!: ;<B"dhhw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                   / pRp\        V P                  4       4       EF]  w  r4\        P                  ! RV4      pV'       d}   VP	                  R4      P                  4       P                  R4      ^ ,          pVP	                  R4      P                  R4      pR. R. R	R
R\        RV9   ;'       d    RV9   4      /W&   K  RV9   dg   \        P                  ! RV4      pV'       g   \        P                  RW44       K  W,          R,          P                  VP                  4       4       EK  RV9   d   \        P                  ! RV4      pV'       g   \        P                  RW44       EKM  VP                  4       pVP                  R4      pVP                  R4      w  rpV'       g   RpW,          R,          P                  RT	RVR,          '       d
   VR,          MR
R\        V4      RVR,          /4       EK  RV9   dz   \        P                  ! RV4      pV'       g   \        P                  RW44       EK  VP	                  R4      R8X  d   VP	                  R	4      W,          R	&   EKO  R
W,          R	&   EK]  EK`  	  V# )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+.*rE   @r)   ,r   r   r   r   r   r-   r.   r9   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) %sr1   zd\s+inet\s(?P<cidr4>\S+)(\smetric\s(?P<metric>\d+))?(\sbrd\s(?P<bcast>\S+))?\sscope\s(?P<scope>\S+).*cidr4r:   32r3   r6   r5   r8   linkz-\s+link/(?P<link_type>\S+)\s(?P<hwaddr>\S+).*r*   r+   )	enumerate
splitlinesrematchgrouplowersplitr   LOGwarningrA   	groupdictpop	partitionr   )
ipaddr_outrD   dev_namenumlinemr)   rU   rO   rG   _prefixs   &           r   _netdev_info_iproutere   i   s-    DHz4467	HHFMwwu~++-33C8;HGGG$**3/E"d45=@@Z5-@A	DN _. 	A @# N6"))!++-8t^- A @# KKMEIIg&E#ooc2ODVN6"))$uW~~U7^23F;U7^	 t^@$A @# ww{#w.+,778+<x(+-x(A 8B Kr   c           
      
   / pV P                  4        EFk  pV'       g   K  V^ ,          R9  dK   VP                  4       ^ ,          pVP                  R4      '       d   VRR pW19  d   \        \        4      W&   VP                  4       P                  4       P                  4       p\        V4      ^8  d1   \        P                  ! RV^,          4      '       d   RVX,          R&   \        \        V4      4       EF  pWE,          R8X  dO   WE^,           ,          P                  R4      w  rgVX,          R,          P                  R	VR
\        V4      /4       K_  WE,          R8X  d*   WE^,           ,          VX,          R,          R,          R&   K  WE,          R8X  d   WE^,           ,          VX,          R&   K  WE,          R8X  dw   WE^,           ,          R8X  d2   VX,          R,          P                  R	WE^,           ,          /4       EK  VX,          R,          P                  R	WE^,           ,          /4       EK@  WE,          R8X  dV   VX,          R,          R,          R	,          R,           WE^,           ,          ,           pWV,          R,          R,          R	&   EK  WE,          P                  R4      '       d3   WE,          P                  R4      VX,          R,          R,          R&   EK  WE,          R8X  g   EK  \        P                  ! RWE^,           ,          4      p	V	'       d-   V	P!                  ^4      VX,          R,          R,          R&   EKY  WE^,           ,          VX,          R,          R,          R&   EK  	  EKn  	  V# )r   :Nzflags=[x\d]+<up.*>Tr   r1   r:   r   r3   r5   r7   r6   zaddress:r   r9   addr:r   r2   scope:r;   scopeid	.*<(\S+)>	 )rS   rX   endswithr   DEFAULT_NETDEV_INFOrW   striplenrT   searchrangerA   r   
startswithlstriprU   rV   )
ifconfig_datarD   ra   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$++7F,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                    / pV P                  4        EFY  pV'       g   K  V^ ,          R9  dK   VP                  4       ^ ,          pVP                  R4      '       d   VRR pW19  d   \        \        4      W&   VP                  4       P                  4       P                  4       pV^ ,          R8X  d   RVX,          R&   M@\        V4      ^8  d1   \        P                  ! RV^,          4      '       d   RVX,          R&   \        \        V4      4       EFS  pWE,          R8X  d@   VX,          R,          P                  RWE^,           ,          P                  R	4      /4       KP  WE,          P                  R
4      '       d2   WE,          P                  R
4      VX,          R,          R,          R&   K  WE,          R8X  d*   WE^,           ,          VX,          R,          R,          R&   K  WE,          P                  R4      '       d3   WE,          P                  R4      VX,          R,          R,          R&   EK#  WE,          R8X  d+   WE^,           ,          VX,          R,          R,          R&   EKZ  WE,          R8X  g   WE,          R8X  d   WE^,           ,          VX,          R&   EK  WE,          R8X  dw   WE^,           ,          R	8X  d2   VX,          R,          P                  RWE^,           ,          /4       EK  VX,          R,          P                  RWE^,           ,          /4       EK  WE,          R8X  dV   VX,          R,          R,          R,          R,           WE^,           ,          ,           pWaV,          R,          R,          R&   EKu  WE,          P                  R4      '       d3   WE,          P                  R4      VX,          R,          R,          R&   EK  WE,          R8X  g   EK  \        P                  ! RWE^,           ,          4      pV'       d-   VP                  ^4      VX,          R,          R,          R&   EK,  WE^,           ,          VX,          R,          R,          R&   EKV  	  EK\  	  V# )r   rg   Nr   Tzflags=\d+<up,r1   r   r3   rh   zbcast:r6   r7   zmask:r5   r@   r   r+   r9   r   r2   r:   ri   r;   rj   rk   rl   ro   )rS   rX   rp   r   rq   rW   rr   rs   rT   rt   ru   rA   rw   rv   rU   rV   )rx   rD   ra   ry   rz   r{   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   c                h    V ^8  d   QhR\         \        \         \        \        3,          3,          /# )r   return)r   r   r   )r   s   "r   r   r   %  s*     S S	#tCN#
#$Sr   c                  aa / p\         P                  ! 4       '       d+   \        P                  ! RR.^ ^.R7      w  r#\        V4      pM\        P                  ! R4      '       d(    \        P                  ! . R	O4      w  rC\        V4      pM[\        P                  ! R4      '       d+   \        P                  ! RR.^ ^.R7      w  r#\        V4      pM\        P                  R4       V R8X  d   V# \        \        \        3oRVV3R lloS! WR7       V#   \        P                   d)    \        P                  ! . R
O4      w  rC\        T4      p Lji ; i)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-arcsr3   z>Could not print networks: missing 'ip' and 'ifconfig' commandsr   c                "  < \        V \        4      '       d   V P                  4       pM3\        V \        \        34      '       d   \        V 4      pM\        R4      hV F-  w  rEWR9   d   WV&   K  \        VS4      '       g   K%  S! WQ4       K/  	  R# )zIRecursively replace 'empty_vals' in data (dict, tuple, list)
with new_valzUnexpected input to fillN)
isinstancer   itemstuplelistrR   	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   )r3   z--jsonrG   )r3   rG   show)r   )r   r   )r   	is_NetBSDr
   r   whichrI   ProcessExecutionErrorre   r   rY   rZ   r   r   r   )emptyrD   	ifcfg_out_errr^   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 :EEc                   / p. VR&   . VR&   V P                  4       pRRRRRRRRRRR	R/pV EFg  p\        V4      pV'       g   K  VP                  4       pR
.pV^ ,          R8X  d   RVR&   RVR&   MjRV^ ,          9   d   V^ ,          P                  R4      w  rM*V^ ,          pRp	VP                  R4       \	        V	4      VR&   WR&   \	        V	4      VR&   RVR&   \        \        V4      4       Ft  p
Wj,          R8X  d%   Wj^,           ,          VR&   VP                  ^R4       Wj,          R8X  d   Wj^,           ,          VR&   Wj,          R	8X  g   Kb  Wj^,           ,          VR	&   Kv  	  RP                  V4      VR&   VR,          P                  V4       EKj  	   \        P                  ! . RO^ ^.R7      w  rVP                  4       pV EF  p/ pV'       g   K  VP                  4       pV^ ,          R8X  d   RVR&   RVR&   MV^ ,          VR&   RVR&   R
VR&   \        \        V4      4       F  p
Wj,          R8X  d   Wj^,           ,          VR&   RVR&   Wj,          R8X  d   Wj^,           ,          VR&   Wj,          R	8X  d   Wj^,           ,          VR	&   Wj,          R8X  g   Kt  VR,          R,           VR&   K  	  VR,          P                  V4       EK	  	  V#   \        P                   d     T# i ; i)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   destinationr   r)   gatewaygenmaskifacemetricUdefault0.0.0.0r:   rP   HviaGrE   r   z::/0UG::expirese)r3   z	--onelinez-6router   tableall)rS   r   rX   rA   r   ru   rs   insertjoinr
   r   )iproute_dataroutesentriesdefault_route_entryra   entryrz   r)   rG   cidrr{   iproute_data6_err6entries6s   &             r   _netdev_route_info_iprouter   {  s    FF6NF6N%%'Gr22" ()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   K K0/K0c                 d   / p. VR &   . VR&   V P                  4       pV EF  pV'       g   K  VP                  4       p\        V4      ^8  gG   V^ ,          R8X  g9   V^ ,          R8X  g+   V^ ,          R8X  g   V^ ,          R8X  g   V^ ,          R8X  d   Kv  \        V4      ^8  d4   VP                  R4       VP                  R4       V^,          V^&   RV^&   RV^ ,          R	V^,          R
V^,          RV^,          RV^,          RV^,          RV^,          RV^,          /pVR ,          P                  V4       EK  	   \        P                  ! . RO^ ^.R7      w  rgVP                  4       pV EF  pV'       g   K  VP                  4       p\        V4      ^8  gG   V^ ,          R8X  g9   V^ ,          R8X  g+   V^ ,          R8X  g   V^ ,          R8X  g   V^ ,          R8X  d   Kv  RV^ ,          R	V^,          RV^,          RV^,          RV^,          RV^,          RV^,          /pVR,          R8X  d   K  VR,          P                  R4      '       d#   \        P                  ! RRVR,          4      VR&   VR,          P                  V4       EK"  	  V#   \        P                   d     T# i ; i)r   r   KernelDestinationInternet	Internet6Routing-r   r   r   r)   r   refuser   r   ProtoActiveloz/128z\/128$r   )netstatz-Ar9   --route	--numeric)	rS   rX   rs   rA   r
   rp   rT   subr   )	
route_datar   r   ra   rz   r   route_data6r   r   s	   &        r   _netdev_route_info_netstatr     s   FF6NF6N##%Gzz| IMAw("Aw-'Aw*$Aw+%Aw)#t9q=KKKK1gDGDG47tAwtAwT!Wd1g4747T!W	
 	ve$G J&)#yy>QF 
 ))+D::<DD	A7h&7m+7j(7g%7h&tAw47a$q'tAwtAwaE W~%]#,,V44')vvr5#7(m$ 6N!!%(= > MG %% D MGs    J J/.J/c                  H   / p \         P                  ! R 4      '       d(   \         P                   ! . RO4      w  r\        V4      p V # \         P                  ! R4      '       d,   \         P                   ! . RO^ ^.R7      w  r2\        V4      p V # \        P                  R4       V # )r3   r   r   z;Could not print routes: missing 'ip' and 'netstat' commands)r3   z-or   r   )r   r   r   z--extend)r
   r   r   r   rY   rZ   )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                     . p R p \        VR7      pV'       g   R# . ROp\        V4      p\        VP                  4       4       F  w  rVVP	                  R4      pV FF  pVP                  VVR,          VR,          VR,          VP	                  RV4      VR,          34       KH  	  VP	                  R	4      p	V	 F?  pVP                  VVR,          VR,          VVP	                  R
V4      VR,          34       KA  	  V'       d   K  V	'       d   K  VP                  WVR,          WWR,          34       K  	  VP                  4       p
\        \        V
P                  4       \        R7      4      p\        P                  ! RRV4      pV P                  W.4       RP#                  V 4      R,           #   \         dK   pT P                  \        P                  ! RP                  \!        T4      R7      R^P4      4        Rp?LhRp?ii ; i).)r   
r   r   r3   r5   r8   r   r   r;   r   zNet device info+z Net device info failed ({error})error!N)DeviceUpAddressMaskScopez
Hw-Address)r   r   sortedr   r?   add_row
get_stringrs   maxrS   r   centerextend	ExceptionrA   r   r   r   )linesr   netdevfieldstblrE   r   
ipv4_addrsrG   
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   F0 0H;A H  Hc            
      *   . p  \        4       pVP                  R 4      '       d   . ROp\        V4      p\        VP                  R 4      4       FT  w  rE\	        V4      p VP                  VVR,          VP                  RR4      VR,          VR,          VR,          .4       KV  	  VP                  4       p\        \        VP                  4       \        R	7      4      p	\        P                  ! R
RV	4      p
V P                  W.4       VP                  R4      '       d   . ROp\        V4      p\        VP                  R4      4       F\  w  rE\	        V4      pVR,          R8X  d   K    VP                  VVR,          VP                  RR4      VR,          VR,          .4       K^  	  VP                  4       p\        \        VP                  4       \        R	7      4      p	\        P                  ! RRV	4      p
V P                  W.4       RP'                  T 4      R,           #   \         d/   p\        P                  ! \        RT,          4        Rp?EK  Rp?ii ; i  \         d/   p\        P                  ! \        RT,          4        Rp?EKJ  Rp?ii ; i  \          dn   pT P#                  \        P                  ! RP%                  \	        T4      R7      R^P4      4       \        P                  ! \        RT,          4        Rp?ELRp?ii ; i)r   r   r   r   r   r   r)   zRoute info formatting error: %sNr   zRoute IPv4 infor   r   r   r   zRoute IPv6 infozRoute info failed ({error})r   r   zRoute info failed: %sr   )Router   GatewayGenmaskr   Flags)r   r   r   r   r   )r   r?   r   rR   r   r   KeyErrorr   logexcrY   r   rs   r   rS   r   r   r   rA   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6sI   
J AH");I"I-"IIJ)"JJL%A"LLc                 p   . p\        4       P                  4       pV '       d"   V F  pVP                  V : V: 24       K  	  MVP                  V4       \	        4       P                  4       pV '       d"   V F  pVP                  V : V: 24       K  	  MVP                  V4       R P                  V4      # )r   )r   rS   rA   r   r  r   )rd   r   netdev_linesra   route_liness   &    r   
debug_infor    s    E!#..0L DLL6401 ! 	\"/,,.KDLL6401   	[!99Ur   )r   )z	ci-info: )$r=   loggingrT   r   r   	ipaddressr   typingr   r   r   	cloudinitr	   r
   r   cloudinit.net.network_stater   cloudinit.simpletabler   	getLoggerr!   rY   rq   r   rI   deprecate_callre   r   r   r   r   r   r   r   r  r  r    r   r   <module>r     s      	  ! ( ( + + ? -!& r62xT5I 	 3l K
K
K\-`6rSlUpRj&4#nF#Rr   