
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼meã[  ã               @   sâ   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
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)ÚsubpÚutil)Únet_prefix_to_ipv4_mask)ÚSimpleTableÚ F)Úipv4Úipv6ÚhwaddrÚupc             C   s\  t j| ƒ}i }�xF|D �]<}d|kr,|d ng }|jdƒdkrF|d nd}|td|ko\d|kƒg g dœ}xÞ|jd	g ƒD ]Î}|jd
ƒdkrâd|kr¨ttd|d › �ƒjƒnd}|jddƒ||jddƒ|jddƒdœ}	|d j|	ƒ qv|d
 dkrv|jddƒ}
|
�r$|jdƒ �r$|
› d|jddƒ› �}
|
|jddƒdœ}	|d j|	ƒ qvW |||d < qW |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)   ú/usr/lib/python3.6/netinfo.pyÚ_netdev_info_iproute_json+   s6    

 

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}�x¢t | jƒ ƒD �]�\}}tjd|ƒ}|r~|jdƒjƒ jdƒd }|jdƒjdƒ}g g dtd	|kopd
|kƒdœ||< qd|kr¾tjd|ƒ}|s¦tj	d||ƒ q|| d j
|jƒ ƒ qd|k�rLtjd|ƒ}|sètj	d||ƒ q|jƒ }|jdƒ}|jdƒ\}	}
}|�sd}|| d j
|	|d �r4|d ndt|ƒ|d dœƒ qd|krtjd|ƒ}|�svtj	d||ƒ q|jdƒdk�rš|jdƒ|| d< nd|| d< qqqW |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   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   r4   r.   r(   Ú_Úprefixr)   r)   r*   Ú_netdev_info_iproutea   sd    




rB   c       
      C   s†  i }�xz| j ƒ D �]l}t|ƒdkr$q|d dkrf|jƒ d }|jdƒrR|d d… }||krfttƒ||< |jƒ jƒ jƒ }t|ƒdkržtj	d|d ƒržd|| d< �xÜt
t|ƒƒD �]Ê}|| d	krô||d  jd
ƒ\}}|| d j|t|ƒdœƒ q®|| dk�r ||d  || d d d< q®|| dk�rD||d  || d< q®|| dk�r¤||d  dk�r„|| d jd||d  iƒ n|| d jd||d  iƒ q®|| dk�rì|| d d d d
 ||d   }||| d d d< q®|| jdƒ�r|| jdƒ|| d d  d< q®|| dkr®tjd||d  ƒ}	|	�r^|	jdƒ|| d d! d< q®||d  || d d" d< q®W qW |S )#Nr   ú	ú ú:é   zflags=[x\d]+<up.*>Tr   r   r   r
   )r   r   r   r   zaddress:r   r   zaddr:r   r   é   r   zscope:r   Úscopeidz	.*<(\S+)>)rC   rD   éÿÿÿÿrI   rI   rI   rI   rI   rI   )r2   Úlenr7   Úendswithr   ÚDEFAULT_NETDEV_INFOr6   Ústripr3   ÚsearchÚranger%   r   Ú
startswithÚlstripr4   r5   )
Úifconfig_datar&   r>   ÚcurdevÚtoksÚiZnetworkZnet_bitsÚaddr6Úresr)   r)   r*   Ú_netdev_info_ifconfig_netbsd´   sL    
  $ $rX   c             C   s.  i }�x"| j ƒ D �]}t|ƒdkr$q|d dkrf|jƒ d }|jdƒrR|d d… }||krfttƒ||< |jƒ jƒ jƒ }|d dkr�d|| d< n(t|ƒdkr¸tj	d|d ƒr¸d|| d< �xjt
t|ƒƒD �]X}|| d	k�r|| d
 jd||d  jdƒiƒ qÈ|| jdƒ�r2|| jdƒ|| d
 d  d< qÈ|| dk�r^||d  || d
 d! d< qÈ|| jdƒ�rŽ|| jdƒ|| d
 d" d< qÈ|| dk�rº||d  || d
 d# d< qÈ|| dk�sÖ|| dk�rì||d  || d< qÈ|| dk�rL||d  dk�r,|| d jd||d  iƒ n|| d jd||d  iƒ qÈ|| dk�r”|| d d$ d d ||d   }||| d d% d< qÈ|| jdƒ�rÄ|| jdƒ|| d d& d< qÈ|| dkrÈtjd||d  ƒ}|�r|jdƒ|| d d' d< qÈ||d  || d d( d< qÈW qW |S ))Nr   rC   rD   rE   rF   r   Tzflags=\d+<up,r   r
   r   zaddr:zbcast:r   r   zmask:r   r$   r   r   r   r   rG   r   r   zscope:r   rH   z	.*<(\S+)>)rC   rD   rI   rI   rI   rI   rI   rI   rI   rI   rI   rI   )r2   rJ   r7   rK   r   rL   r6   rM   r3   rN   rO   r%   rQ   rP   r4   r5   )rR   r&   r>   rS   rT   rU   rV   rW   r)   r)   r*   Ú_netdev_info_ifconfigä   sZ    
    $ $rY   c                sþ   i }t jƒ r0tjddgddgd�\}}t|ƒ}n˜tjdƒr�y tjdddgƒ\}}t|ƒ}W qÈ tjk
rŒ   tjddd	gƒ\}}t|ƒ}Y qÈX n8tjdƒr¾tjddgddgd�\}}t|ƒ}n
t	j
d
ƒ | dkrÔ|S tttf‰d‡ ‡fdd„	‰ ˆ || d� |S )NZifconfigz-ar   rF   )Úrcsr   z--jsonr(   Zshowz>Could not print networks: missing 'ip' and 'ifconfig' commandsr	   ó    c                sp   t | tƒr| jƒ }n t | ttfƒr,t| ƒ}ntdƒ‚x6|D ].\}}||krT|| |< q:t |ˆƒr:ˆ ||ƒ q:W dS )zQRecursively replace 'empty_vals' in data (dict, tuple, list)
        with new_valzUnexpected input to fillN)Ú
isinstanceÚdictÚitemsÚtupleÚlistr1   Ú	TypeError)ÚdataÚnew_valZ
empty_valsZmyiterÚkeyÚval)ÚfillÚrecurse_typesr)   r*   rf   9  s    




znetdev_info.<locals>.fill)rc   ©r	   r[   )r	   rh   )r   Z	is_NetBSDr   rX   Úwhichr+   ÚProcessExecutionErrorrB   rY   r8   r9   r]   r_   r`   )Úemptyr&   Z	ifcfg_outÚ_errr=   r)   )rf   rg   r*   Únetdev_info  s,    




rm   c             C   sÊ  i }g |d< g |d< | j ƒ }dddddddœ}�x<|D �]2}t|ƒ}|sJq6|jƒ }dg}|d dkrvd|d	< d|d
< n^d|d kr–|d jdƒ\}}	n"|d }d}	|jdƒ t|	ƒ|d
< ||d	< t|	ƒ|d
< d|d< xxtt|ƒƒD ]h}
||
 dk�r||
d  |d< |jddƒ ||
 dk�r.||
d  |d< ||
 dkrâ||
d  |d< qâW dj|ƒ|d< |d j|ƒ q6W y(t	j	dddddddgddgd�\}}W n t	j
k
�r°   Y �nX |j ƒ }�x|D � ]þ}i }|�sÖ�qÂ|jƒ }|d dk�rþd|d	< d|d< n|d |d	< d |d< d|d< x–tt|ƒƒD ]†}
||
 dk�rR||
d  |d< d|d< ||
 dk�rp||
d  |d< ||
 dk�rŽ||
d  |d< ||
 d!k�r(|d d" |d< �q(W |d j|ƒ �qÂW |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   Údefaultz0.0.0.0rn   rp   r   r/   ÚHro   ZviarF   ÚGr'   rq   rr   r   r   z	--onelinez-6Úrouter`   ÚtableÚall)rZ   z::/0ZUGz::ZexpiresÚe)r2   r   r7   r%   r   rO   rJ   ÚinsertÚjoinr   rj   )Ziproute_dataÚroutesÚentriesZdefault_route_entryr>   ÚentryrT   r   r(   ZcidrrU   Ziproute_data6Ú_err6Úentries6r)   r)   r*   Ú_netdev_route_info_iprouteM  sˆ    


r‚   c       	      C   s4  i }g |d< g |d< | j ƒ }xÜ|D ]Ô}|s,q"|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~q"t|ƒd
k r²|jdƒ |jdƒ |d |d< d|d< |d |d |d |d |d |d |d |d dœ}|d j|ƒ q"W y$tjdddddgddgd�\}}W n tjk
�r6   Y núX |j ƒ }xî|D ]æ}|�sT�qF|jƒ }t|ƒdk �sF|d dk�sF|d dk�sF|d dk�sF|d dk�sF|d dk�r´�qF|d |d |d |d |d |d |d dœ}|d dk�rö�qF|d jdƒ�rtjd d!|d ƒ|d< |d j|ƒ �qFW |S )"Nr
   r   é   r   ZKernelÚDestinationZInternetZ	Internet6ZRoutingé   ú-é   é   rF   rG   é   é   )rn   ro   rp   r   rr   ÚrefÚuserq   Únetstatz-Ar   z--routez	--numeric)rZ   ZProtoZActive)rn   ro   r   rr   r‹   rŒ   rq   rq   Úlorn   z/128z\/128$r	   )	r2   r7   rJ   r%   r   rj   rK   r3   Úsub)	Z
route_datar}   r~   r>   rT   r   Zroute_data6r€   r�   r)   r)   r*   Ú_netdev_route_info_netstat¥  sx    
	

 
r�   c              C   sn   i } t jdƒr.t j ddddgƒ\}}t|ƒ} n<t jdƒr`t j ddddgd	d
gd�\}}t|ƒ} n
tjdƒ | S )Nr   z-orw   r`   r�   z--routez	--numericz--extendr   rF   )rZ   z;Could not print routes: missing 'ip' and 'netstat' commands)r   ri   r‚   r�   r8   r9   )r}   Ziproute_outrl   Z	route_outr)   r)   r*   Ú
route_infoú  s    



r‘   c              C   sš  g } d}yt |d�}W nD tk
rZ } z&| jtjdjt|ƒd�ddƒƒ W Y d d }~X �n2X |sddS dd	d
dddg}t|ƒ}xÖt|j	ƒ ƒD ]Æ\}}x@|j
dƒD ]2}|j||d |d |d |j
d|ƒ|d fƒ qžW x<|j
dƒD ].}|j||d |d ||j
d|ƒ|d fƒ qàW t|j
dƒƒt|j
dƒƒ dkrŠ|j||d ||||d fƒ qŠW |jƒ }	tt|	jƒ td�ƒ}
tjdd|
ƒ}| j||	gƒ dj| ƒd S )NÚ.)rk   z Net device info failed ({error}))Úerrorú!éP   Ú
ZDeviceZUpZAddressZMaskZScopez
Hw-Addressr
   r   r   r   r   r   r   r   r   )rd   zNet device infoú+)rm   Ú	Exceptionr%   r   ÚcenterÚformatr#   r   Úsortedr^   r!   Úadd_rowrJ   Ú
get_stringÚmaxr2   Úextendr|   )Úlinesrk   Znetdevrz   ZfieldsZtblr'   rb   r(   Znetdev_sÚmax_lenÚheaderr)   r)   r*   Únetdev_pformat  sN    

 r£   c              C   sN  g } y
t ƒ }W nT tk
rb } z6| jtjdjt|ƒd�ddƒƒ tjtd| ƒ W Y d d }~X �nÞX |j	dƒ�rLddd	d
ddg}t
|ƒ}xŠt|j	dƒƒD ]x\}}t|ƒ}y2|j||d |j	ddƒ|d |d |d gƒ W q˜ tk
�r } ztjtd| ƒ W Y d d }~X q˜X q˜W |jƒ }tt|jƒ td�ƒ}	tjdd|	ƒ}
| j|
|gƒ |j	dƒ�r@ddd	ddg}t
|ƒ}x˜t|j	dƒƒD ]†\}}t|ƒ}|d dk�r �q~y,|j||d |j	ddƒ|d |d gƒ W n4 tk
�r  } ztjtd| ƒ W Y d d }~X nX �q~W |jƒ }tt|jƒ td�ƒ}	tjdd|	ƒ}
| j|
|gƒ dj| ƒd S )NzRoute info failed ({error}))r“   r”   r•   zRoute info failed: %sr
   ZRouter„   ZGatewayZGenmaskZ	InterfaceZFlagsrn   ro   z0.0.0.0rp   rq   r   zRoute info formatting error: %s)rd   zRoute IPv4 infor—   r   rŽ   z::zRoute IPv6 infor–   )r‘   r˜   r%   r   r™   rš   r#   Zlogexcr8   r!   r   r1   rœ   ÚKeyErrorr�   rJ   rž   r2   rŸ   r|   )r    r}   rz   Z	fields_v4Ztbl_v4ÚnÚrZroute_idZroute_sr¡   r¢   Z	fields_v6Ztbl_v6r)   r)   r*   Úroute_pformatA  sr    
$
&
(r§   ú	ci-info: c             C   s‚   g }t ƒ jƒ }| r4x*|D ]}|jd| |f ƒ qW n
|j|ƒ tƒ jƒ }| rnx*|D ]}|jd| |f ƒ qRW n
|j|ƒ dj|ƒS )Nz%s%sr–   )r£   r2   r%   rŸ   r§   r|   )rA   r    Znetdev_linesr>   Zroute_linesr)   r)   r*   Ú
debug_infoŠ  s    





r©   )r	   )r¨   )r   Zloggingr3   r   r   Z	ipaddressr   Z	cloudinitr   r   Zcloudinit.net.network_stater   Zcloudinit.simpletabler   Z	getLoggerÚ__name__r8   rL   r+   Zdeprecate_callrB   rX   rY   rm   r‚   r�   r‘   r£   r§   r©   r)   r)   r)   r*   Ú<module>   s,   
6Q09
0XU4I