
    f[                        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	 d dl
mZ d dlmZ  ej                  e      Zg g ddd	Zd
 Z e	j&                  dd      d        Zd Zd ZddZd Zd Zd Zd Zd ZddZy)    N)copydeepcopy)IPv4Network)subputil)net_prefix_to_ipv4_mask)SimpleTable Fipv4ipv6hwaddrupc           	         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getboolstrr   netmaskappend)ipaddr_jsonipaddr_datadevsdevr   r   dev_infoaddrr   parsed_addrr   s              3/usr/lib/python3/dist-packages/cloudinit/netinfo.py_netdev_info_iproute_jsonr5   +   s    **[)KD %' '3GB$'GGK$8G$C#i.tu}<u)<=	
 GGK, 	5Dxx!V+ #d* htK/@.A$BCKKL  ((7B/ !XXk26!XXgr2	  ''4h7*XXgr* dhhy14q+r!: ;<B"hhw3  ''47	58 'S]K%'L K    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 rt        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+.*r0   @r   r   ,r
   r   r   r   r!   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+).*cidr4r"   32r   r    r   )r   r    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   rB   r<   r2   _prefixs               r4   _netdev_info_iprouterR   a   s2    DHz4467 @	THHFMwwu~++-33C8;HGGG$**3/E45=@Z5-@A	DN _. 	A @#t N6"))!++-8t^- A @#t KKMEIIg&E#ooc2OD!VN6"))/4W~U7^23F;"7^	 t^@$A @#t ww{#w.+,778+<Xx(+-Xx(A@B Kr6   c                    i }| j                         D ]^  }t        |      dk(  r|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<    a |S )Nr   	 :   zflags=[x\d]+<up.*>Tr   r   r"   r   )r   r   r   r    zaddress:r   r!   addr:r   r      r   scope:r$   scopeid	.*<(\S+)>)r@   lenrE   endswithr   DEFAULT_NETDEV_INFOrD   striprA   searchranger,   r   
startswithlstriprB   rC   )
ifconfig_datar/   rN   curdevtoksinetworknet_bitsaddr6ress
             r4   _netdev_info_ifconfig_netbsdro      s   D((* (Et9>7+%ZZ\!_Fs#T!'(;<Vzz|!!#))+t9q=yy.Q8%)VT"s4y! 	EAAw& $(QK$5$5c$:!VV$++",CH,MN aK'48QKVV$R(1aJ&)-a!eVX&aG#A;')L(//tAE{0CDL(//tAE{0CDaK'VV,R06<tAE{J16VV$R(.a##H-59!W^^H5MVV$R(2aI%hh|T!a%[99<1DL(,X69=a!eDL(,X63	E(ET Kr6   c                    i }| j                         D ]  }t        |      dk(  r|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   rT   rW   rX   r   TrY   zflags=\d+<up,r   r   r   rZ   zbcast:r    r   zmask:r   r+   r   r   r!   r   r[   r   r"   r\   r$   r]   r^   )r@   r_   rE   r`   r   ra   rD   rb   rA   rc   rd   r,   rf   re   rB   rC   )rg   r/   rN   rh   ri   rj   rm   rn   s           r4   _netdev_info_ifconfigrq      s   D((* 1Et9>7+%ZZ\!_Fs#T!'(;<Vzz|!!#))+7d?!%DL Y]yy)473%)VT"s4y! 	EAAw& VV$++4A;--g67 a##H-48GNN84L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(//tAE{0CDL(//tAE{0CDaK'VV,R06<tAE{J16VV$R(.a##H-59!W^^H5MVV$R(2aI%hh|T!a%[99<1DL(,X69=a!eDL(,X6=	E'1Ef Kr6   c                 x   i }t        j                         r*t        j                  ddgddg      \  }}t        |      }nt        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)Nifconfigz-ar   rY   rcsr   )r   z--jsonr2   )r   r2   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)
isinstancedictitemstuplelistr?   	TypeError)datanew_val
empty_valsmyiterkeyvalfillrecurse_typess         r4   r   znetdev_info.<locals>.fill9  su     dD!ZZ\Fudm,t_F677 	#HCj #S	C/S'"		#r6   )r   )r
   )r
   r6   )r   	is_NetBSDr   ro   whichr5   ProcessExecutionErrorrR   rq   rF   rG   ry   r{   r|   )emptyr/   	ifcfg_out_errrK   r   r   s        @@r4   netdev_infor     s   D~~ IIz4&8q!fED+I6	D		4!%+C!DZ,Z8D
 
J	 IIz4&8q!fED$Y/L	
 {5$'M#  	uKG )) 	4!%+A!BZ'
3D	4s   %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   r"   r=   Hr   viarY   Gr0   r   r   r   )r   z	--onelinez-6router|   tableallrt   z::/0UG::expirese)r@   r   rE   r,   r   rd   r_   insertjoinr   r   )iproute_dataroutesentriesdefault_route_entryrN   entryri   r   r2   cidrrj   iproute_data6_err6entries6s                 r4   _netdev_route_info_iprouter   M  s    FF6NF6N%%'G  %()zz|7i#,E- (E)d1g~#Aw}}S1tAwS!#:4#@i #'E- 6t<E)(E)s4y! 	.AAw%#'A;i Q$Aw%!%a!egAw(""&q1u+h	. gve$;%<)!%FA"
 !++- 	)DE::<DAw)#'-m$!%g'+Awm$#'i !$g3t9% 	:7e#'+AE{E)$%)E'N7e#%)!a%[E'N7h&&*1q5kE(O7i'%*7^c%9E'N	: 6N!!%(-	). M7 %% 4 M7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   -      rY   r[         )r   r   r   r   r   refuser   )netstatz-Ar!   --route	--numericrt   ProtoActive)r   r   r   r   r   r   r   r   lor   z/128z\/128$r
   )	r@   rE   r_   r,   r   r`   rA   subr   )	
route_datar   r   rN   ri   r   route_data6r   r   s	            r4   _netdev_route_info_netstatr     sv   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 
e ))+ 	)D::<DD	A7h&7m+7j(7g%7h&#Aw7aq'AwAwaE W~%]#,,V4')vvr5#7(m$ 6N!!%(=	)> MG %% D MG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   rY   rt   z;Could not print routes: missing 'ip' and 'netstat' commands)r   r   r   r   rF   rG   )r   iproute_outr   	route_outs       r4   
route_infor     s    Fzz$"ii(EFd+K8 M 
I	 II;!Q
D ,I6
 M 	I	
 Mr6   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 t        |j	                  d            t        |j	                  d            z   dk(  s|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   r$   r   r   zNet device info+z Net device info failed ({error})error!P   )r   r	   sortedrz   r(   add_rowr_   
get_stringmaxr@   r   centerextend	Exceptionr,   formatr*   r   )linesr   netdevfieldstblr0   r~   r2   netdev_smax_lenheaderr   s               r4   netdev_pformatr     s   EE-)5) K&!!&,,.1 	KS$( 
T
T
V%0X	
 ( 
T
T
51X	
 488F#$s488F+;'<<A$t*eUE4>J1	6 >>#c(--/S9:.W=fh'(99Ud""Y  
KK299A9G	
 	

s   F   	G2)?G--G2c            
         g } 	 t               }|j                  d      rg 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      rg 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Genmask	Interface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	   r?   r*   r   KeyErrorr   logexcrF   r   r_   r   r@   r   r   r   r,   r   r   )r   r   	fields_v4tbl_v4nrroute_idr   route_sr   r   	fields_v6tbl_v6s                r4   route_pformatr   A  s   EC, ::fI !+F#FJJv$67 LAq6LNN$m,EE)Y7iLgJgJ	L '')G#g002<=G[[!2CAFLL&'*+::fI !+F#FJJv$67 LAq6W:%LNN$m,EE)T2gJgJL  '')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 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   r@   r,   r   r   r   )rQ   r   netdev_linesrN   route_liness        r4   
debug_infor     s    E!#..0L  	2DLL6401	2 	\"/,,.K 	2DLL6401	2 	[!99Ur6   )r
   )z	ci-info: )r&   loggingrA   r   r   	ipaddressr   	cloudinitr   r   cloudinit.net.network_stater   cloudinit.simpletabler	   	getLogger__name__rF   ra   r5   deprecate_callrR   ro   rq   r   r   r   r   r   r   r    r6   r4   <module>r     s      	  !   ? -g!&  "25I 3l K
K
K\-`6r-`UpRj&1#hF#Rr6   