U
    L¬÷d\  ã                   @   sæ   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 d dlm	Z	m
Z
 d dlmZ d dlmZ e e¡Zg g dd	d
œZdd„ Ze
jddddd„ ƒZdd„ Zdd„ Zd%dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd&d#d$„ZdS )'é    N)ÚcopyÚdeepcopy)ÚIPv4Network)Úlog)ÚsubpÚutil)Únet_prefix_to_ipv4_mask)ÚSimpleTableÚ F©Úipv4Úipv6ÚhwaddrÚupc              	   C   sP  t  | ¡}i }|D ]6}d|kr(|d ng }| d¡dkrB|d nd}|td|koXd|kƒg g dœ}| d	g ¡D ]Ì}| d
¡dkrÜd|kr¢ttd|d › ƒjƒnd}| dd¡|| dd¡| dd¡dœ}	|d  |	¡ qp|d
 dkrp| dd¡}
|
r| d¡s|
› d| dd¡› }
|
| dd¡dœ}	|d  |	¡ qp|||d < q|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   Z	addr_infoZfamilyÚinetÚ	prefixlenz0.0.0.0/ZlocalÚ	broadcastÚscope)ÚipÚmaskÚbcastr   r   Úinet6ú/é@   )r   Úscope6r   Zifname)ÚjsonÚloadsÚgetÚboolÚstrr   ÚnetmaskÚappend)Zipaddr_jsonZipaddr_dataÚdevsÚdevr   r   Zdev_infoÚaddrr   Zparsed_addrr   © r+   ú3/usr/lib/python3/dist-packages/cloudinit/netinfo.pyÚ_netdev_info_iproute_json+   s@    


üÿý


ü
þr-   z22.1zqRequired by old iproute2 versions that don't support ip json output. Consider upgrading to a more recent version.)Zdeprecated_versionZextra_messagec                 C   s¬  i }d}t |  ¡ ƒD ]\}}t d|¡}|rz| d¡ ¡  d¡d }| d¡ d¡}g g dtd	|kold
|kƒdœ||< qd|krºt d|¡}|s¢t 	d||¡ q|| d  
| ¡ ¡ qd|krHt d|¡}|sät 	d||¡ q| ¡ }| d¡}| d¡\}	}
}|sd}|| d  
|	|d r0|d ndt|ƒ|d dœ¡ qd|krt d|¡}|srt 	d||¡ q| d¡dkr–| d¡|| d< nd|| d< qqq|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   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(   Zdev_nameZnumÚlineÚmr   r6   r0   r*   Ú_Úprefixr+   r+   r,   Ú_netdev_info_iproutea   s„    üü  ÿ
û  ÿ
üÿ ÿ  ÿrD   c           
      C   sz  i }|   ¡ D ]f}t|ƒdkr q|d dkrb| ¡ d }| d¡rN|d d… }||krbttƒ||< | ¡  ¡  ¡ }t|ƒdkršt 	d|d ¡ršd|| d< t
t|ƒƒD ]Ê}|| d	krì||d   d
¡\}}|| d  |t|ƒdœ¡ q¦|| dkr||d  || d d d< q¦|| dkr<||d  || d< q¦|| dkrœ||d  dkr||| d  d||d  i¡ n|| d  d||d  i¡ q¦|| dkrä|| d d d d
 ||d   }||| d d d< q¦||  d¡r||  d¡|| d d d< q¦|| dkr¦t d||d  ¡}	|	rV|	 d¡|| d d d< q¦||d  || d d d< q¦q|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+)>)r4   Úlenr9   Úendswithr   ÚDEFAULT_NETDEV_INFOr8   Ústripr5   ÚsearchÚranger'   r   Ú
startswithÚlstripr6   r7   )
Úifconfig_datar(   r@   ÚcurdevÚtoksÚiZnetworkZnet_bitsÚaddr6Úresr+   r+   r,   Ú_netdev_info_ifconfig_netbsd´   sN    
ÿ  $  r^   c                 C   s   i }|   ¡ D ]}t|ƒdkr q|d dkrb| ¡ d }| d¡rN|d d… }||krbttƒ||< | ¡  ¡  ¡ }|d dkrŒd|| d< n(t|ƒdkr´t 	d|d ¡r´d|| d< t
t|ƒƒD ]V}|| d	krø|| d
  d||d   d¡i¡ qÀ||  d¡r(||  d¡|| d
 d d< qÀ|| dkrT||d  || d
 d d< qÀ||  d¡r„||  d¡|| d
 d d< qÀ|| dkr°||d  || d
 d d< qÀ|| dksÌ|| dkrâ||d  || d< qÀ|| dkrB||d  dkr"|| d  d||d  i¡ n|| d  d||d  i¡ qÀ|| dkrŠ|| d d d d ||d   }||| d d d< qÀ||  d¡rº||  d¡|| d d d< qÀ|| dkrÀt d||d  ¡}|rü| d¡|| d d d< qÀ||d  || d d d< qÀq|S )Nr   rE   rH   rI   r   TrJ   zflags=\d+<up,r   r   r   rK   zbcast:r   r   zmask:r   r&   r   r   r   r   rL   r   r   rM   r    rN   rO   )r4   rP   r9   rQ   r   rR   r8   rS   r5   rT   rU   r'   rW   rV   r6   r7   )rX   r(   r@   rY   rZ   r[   r\   r]   r+   r+   r,   Ú_netdev_info_ifconfigä   s\    
ÿ    $  r_   c                    sþ   i }t  ¡ r0tjddgddgd\}}t|ƒ}n˜t d¡rz t dddg¡\}}t|ƒ}W qÈ tjk
rŒ   t ddd	g¡\}}t|ƒ}Y qÈX n8t d¡r¾tjddgddgd\}}t|ƒ}n
t	 
d
¡ | dkrÔ|S tttf‰d‡ ‡fdd„	‰ ˆ || d |S )NZifconfigz-ar   rJ   ©Zrcsr   z--jsonr*   Zshowz>Could not print networks: missing 'ip' and 'ifconfig' commandsr
   ©r
   ó    c                    sl   t | tƒr|  ¡ }n t | ttfƒr,t| ƒ}ntdƒ‚|D ].\}}||krR|| |< q8t |ˆƒr8ˆ ||ƒ q8dS )zQRecursively replace 'empty_vals' in data (dict, tuple, list)
        with new_valzUnexpected input to fillN)Ú
isinstanceÚdictÚitemsÚtupleÚlistr3   Ú	TypeError)ÚdataÚnew_valZ
empty_valsZmyiterÚkeyÚval©ÚfillZrecurse_typesr+   r,   rn   9  s    




znetdev_info.<locals>.fill)rj   )r
   ra   )r   Z	is_NetBSDr   r^   Úwhichr-   ÚProcessExecutionErrorrD   r_   r:   r;   rd   rf   rg   )Úemptyr(   Z	ifcfg_outÚ_errr?   r+   rm   r,   Únetdev_info  s.    



ÿ
rs   c                 C   s´  i }g |d< g |d< |   ¡ }dddddddœ}|D ].}t|ƒ}|sFq2| ¡ }dg}|d dkrrd|d	< d|d
< n^d|d kr’|d  d¡\}}	n"|d }d}	| d¡ t|	ƒ|d
< ||d	< t|	ƒ|d
< d|d< tt|ƒƒD ]h}
||
 dkr
||
d  |d< | dd¡ ||
 dkr(||
d  |d< ||
 dkrÜ||
d  |d< qÜd |¡|d< |d  |¡ q2z(t	j	dddddddgddgd\}}W n t	j
k
r¦   Y n
X |  ¡ }|D ]ú}i }|sÆq´| ¡ }|d dkrîd|d	< d|d< n|d |d	< d |d< d|d< tt|ƒƒD ]†}
||
 dkr@||
d  |d< d|d< ||
 dkr^||
d  |d< ||
 dkr|||
d  |d< ||
 d!kr|d d" |d< q|d  |¡ q´|S )#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.0rt   rv   r   r1   ÚHru   ZviarJ   ÚGr)   rw   rx   r   r   z	--onelinez-6Úrouterg   ÚtableÚallr`   z::/0ZUGú::ZexpiresÚe)r4   r   r9   r'   r   rU   rP   ÚinsertÚjoinr   rp   )Ziproute_dataÚroutesÚentriesZdefault_route_entryr@   ÚentryrZ   r   r*   Zcidrr[   Ziproute_data6Ú_err6Úentries6r+   r+   r,   Ú_netdev_route_info_iprouteM  sŒ    ú


þ
rŠ   c           	   
   C   s,  i }g |d< g |d< |   ¡ }|D ]Ô}|s*q | ¡ }t|ƒdk s |d dks |d dks |d dks |d dks |d d	kr|q t|ƒd
k r°| d¡ | d¡ |d |d< d|d< |d |d |d |d |d |d |d |d dœ}|d  |¡ q z$tjdddddgddgd\}}W n tjk
r2   Y nöX |  ¡ }|D ]æ}|sNq@| ¡ }t|ƒdk s@|d dks@|d dks@|d dks@|d dks@|d dkr®q@|d |d |d |d |d |d |d dœ}|d dkrðq@|d  d¡rt d d!|d ¡|d< |d  |¡ q@|S )"Nr   r   é   r   ZKernelÚDestinationZInternetZ	Internet6ZRoutingé   ú-é   é   rJ   rL   é   é   )rt   ru   rv   r   rx   ÚrefÚuserw   Únetstatz-Ar   ú--routeú	--numericr`   ZProtoZActive)rt   ru   r   rx   r“   r”   rw   rw   Úlort   z/128z\/128$r
   )	r4   r9   rP   r'   r   rp   rQ   r5   Úsub)	Z
route_datar…   r†   r@   rZ   r‡   Zroute_data6rˆ   r‰   r+   r+   r,   Ú_netdev_route_info_netstat¥  sž    	
ÿ
þ
ý
ü
û
ú

ø
 ÿ
ÿ
þ
ý
ü
û
úù
  ÿrš   c                  C   sn   i } t  d¡r.t   ddddg¡\}}t|ƒ} n<t  d¡r`t j ddddgd	d
gd\}}t|ƒ} n
t d¡ | S )Nr   z-or~   rg   r•   r–   r—   z--extendr   rJ   r`   z;Could not print routes: missing 'ip' and 'netstat' commands)r   ro   rŠ   rš   r:   r;   )r…   Ziproute_outrr   Z	route_outr+   r+   r,   Ú
route_infoú  s    



 ÿ

ÿr›   c                  C   sŽ  g } d}zt |d}W nD tk
rZ } z$|  t djt|ƒddd¡¡ W 5 d }~X Y n&X |sddS dd	d
dddg}t|ƒ}t| 	¡ ƒD ]¾\}}| 
d¡D ]2}| ||d |d |d | 
d|¡|d f¡ qš| 
d¡D ].}| ||d |d || 
d|¡|d f¡ qØt| 
d¡ƒt| 
d¡ƒ dkrˆ| ||d ||||d f¡ qˆ| ¡ }	tt|	 ¡ tdƒ}
t dd|
¡}|  ||	g¡ d | ¡d S )NÚ.)rq   z Net device info failed ({error})©Úerrorú!éP   Ú
ZDeviceZUpZAddressZMaskZScopez
Hw-Addressr   r   r   r   r   r   r   r    r   ©rk   zNet device infoú+)rs   Ú	Exceptionr'   r   ÚcenterÚformatr%   r	   Úsortedre   r#   Úadd_rowrP   Ú
get_stringÚmaxr4   Úextendr„   )Úlinesrq   Znetdevr‚   ZfieldsZtblr)   ri   r*   Znetdev_sÚmax_lenÚheaderr+   r+   r,   Únetdev_pformat  s\    ýÿ
úÿ

úÿ
 ÿr¯   c                  C   sF  g } z
t ƒ }W nT tk
rb } z4|  t djt|ƒddd¡¡ t td| ¡ W 5 d }~X Y nÖX | 	d¡rHddd	d
ddg}t
|ƒ}t| 	d¡ƒD ]x\}}t|ƒ}z2| ||d | 	dd¡|d |d |d g¡ W q– tk
r } zt td| ¡ W 5 d }~X Y q–X q–| ¡ }tt| ¡ tdƒ}	t dd|	¡}
|  |
|g¡ | 	d¡r8ddd	ddg}t
|ƒ}t| 	d¡ƒD ]†\}}t|ƒ}|d dkršqxz,| ||d | 	dd¡|d |d g¡ W n4 tk
rú } zt td| ¡ W 5 d }~X Y nX qx| ¡ }tt| ¡ tdƒ}	t dd|	¡}
|  |
|g¡ d | ¡d S )NzRoute info failed ({error})r   rŸ   r    zRoute info failed: %sr   ZRouterŒ   ZGatewayZGenmaskZ	InterfaceZFlagsrt   ru   r{   rv   rw   r   zRoute info formatting error: %sr¢   zRoute IPv4 infor£   r   r˜   r   zRoute IPv6 infor¡   )r›   r¤   r'   r   r¥   r¦   r%   Zlogexcr:   r#   r	   r3   r¨   ÚKeyErrorr©   rP   rª   r4   r«   r„   )r¬   r…   r‚   Z	fields_v4Ztbl_v4ÚnÚrZroute_idZroute_sr­   r®   Z	fields_v6Ztbl_v6r+   r+   r,   Úroute_pformatA  s†    
  ÿÿ$ú
úÿ
$û
ûÿ	&r³   ú	ci-info: c                 C   sz   g }t ƒ  ¡ }| r0|D ]}| d| |f ¡ qn
| |¡ tƒ  ¡ }| rf|D ]}| d| |f ¡ qLn
| |¡ d |¡S )Nz%s%sr¡   )r¯   r4   r'   r«   r³   r„   )rC   r¬   Znetdev_linesr@   Zroute_linesr+   r+   r,   Ú
debug_infoŠ  s    



rµ   )r
   )r´   )r!   r5   r   r   Z	ipaddressr   Z	cloudinitr   Zloggingr   r   Zcloudinit.net.network_stater   Zcloudinit.simpletabler	   Z	getLoggerÚ__name__r:   rR   r-   Zdeprecate_callrD   r^   r_   rs   rŠ   rš   r›   r¯   r³   rµ   r+   r+   r+   r,   Ú<module>   s0   
6þ
N09
0XU4I