
­­­­­­­­­­­­­­­­­­
<!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rd|krt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}xt | 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rtjd|}|stj	d|| q|| d j
|j  qd|krLtjd|}|st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rtj	d|d rd|| d< xt
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rtjd||d  }	|	r^|	jd|| d d! d< q||d  || d d" d< qW 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rd|| d< n(t|dkrtj	d|d rd|| 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rtjd||d  }|r|jd|| d d' d< q||d  || d d( d< qW 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|}ntjdry tjdddg\}}t|}W q tjk
r   tjddd	g\}}t|}Y qX n8tjdrt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< qW 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rd|d	< d|d< n|d |d	< d |d< d|d< xt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| qW |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 nX |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|}xt|j	 D ]\}}x@|j
dD ]2}|j||d |d |d |j
d||d f qW x<|j
dD ].}|j||d |d ||j
d||d f qW t|j
dt|j
d dkr|j||d ||||d f qW |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 nX |j	drLddd	d
ddg}t
|}xt|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 qX qW |j }tt|j td}	tjdd|	}
| j|
|g |j	dr@ddd	ddg}t
|}xt|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