
"T`}H                 @   s  d  d l  m  Z  m Z d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 m Z e j   Z d g  d	 g  d
 d d d i Z 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)#    )copydeepcopyN)log)net_prefix_to_ipv4_mask)subp)util)SimpleTableipv4ipv6hwaddr upFc             C   s^  i  } d } xKt  |  j    D]7\ } } t j d |  } | r | j d  j   j d  d } | j d  j d  } d g  d	 g  d
 d d t d | k o d | k  i | | <q d | k rt j d |  } | s t j	 d | |  q | | d	 j
 | j    q d | k rt j d |  } | sLt j	 d | |  q | j   } | j d  } | j d  \ }	 }
 } | sd } | | d j
 d |	 d | d r| d n d d t |  d | d i  q d | k r t j d |  } | st j	 d | |  q | j d  d k rB| j d
  | | d
 <qVd | | d
 <q q q W| S)a1  
    Get network device dicts from ip route and ip link info.

    @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+.*dev@r   flags,r	   r
   r   r   r   ZUPZLOWER_UPinet6z/\s+inet6\s(?P<ip>\S+)\sscope\s(?P<scope6>\S+).*z*Could not parse ip addr show: (line:%d) %sinetzH\s+inet\s(?P<cidr4>\S+)(\sbrd\s(?P<bcast>\S+))?\sscope\s(?P<scope>\S+).*cidr4/32ipbcastmaskscopelinkz-\s+link/(?P<link_type>\S+)\s(?P<hwaddr>\S+).*Z	link_typeether)	enumerate
splitlinesrematchgrouplowersplitboolLOGwarningappend	groupdictpop	partitionr   )
ipaddr_outdevsZdev_nameZnumlinemr   r    r   addr_prefix r2   3/usr/lib/python3/dist-packages/cloudinit/netinfo.py_netdev_info_iproute    s^    
"+	r4   c       
      C   s  i  } x|  j    D]} t |  d k r. q | d d k r | j   d } | j d  rm | d  d  } | | k r t t  | | <| j   j   j   } t |  d k r t j	 d | d  r d | | d <x3t
 t |   D]} | | d	 k rG| | d j d
  \ } } | | d j d | d t |  i  q | | d k rx| | d | | d d d <q | | d k r| | d | | d <q | | d k r| | d d k r| | d j d | | d i  q	| | 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 Wq W| S)#Nr   	 :   zflags=[x\d]+<up.*>Tr   r   r   r	   r   r   	broadcastr   zaddress:r   r   zaddr:r
      	prefixlenzscope:scope6scopeidz	.*<(\S+)>)r5   r6   r>   r>   r>   r>   r>   r>   )r   lenr#   endswithr   DEFAULT_NETDEV_INFOr"   stripr   searchranger'   r   
startswithlstripr    r!   )
ifconfig_datar,   r-   curdevtoksiZnetworkZnet_bitsaddr6resr2   r2   r3   _netdev_info_ifconfig_netbsd_   sL    !&&&&"&rM   c             C   s  i  } x|  j    D]} t |  d k r. q | d d k r | j   d } | j d  rm | d  d  } | | k r t t  | | <| j   j   j   } | d d k r d | | d <n6 t |  d k r t j	 d | d  r d | | d <xt
 t |   D]} | | d	 k rP| | d
 j d | | d j d  i  q| | j d  r| | 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 sD| | d k r]| | d | | d <q| | d k r| | d d k r| | d j d | | d i  q| | d j d | | d i  q| | d k r| | d d$ d d | | d } | | | d d% d <q| | j d  rU| | 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Wq W| S))Nr   r5   r6   r7   r8   r   Tzflags=\d+<up,r   r	   r   zaddr:zbcast:r   r9   zmask:r   Znetmaskr   r   r   r
   r:   r;   r   zscope:r<   r=   z	.*<(\S+)>)r5   r6   r>   r>   r>   r>   r>   r>   r>   r>   r>   r>   )r   r?   r#   r@   r   rA   r"   rB   r   rC   rD   r'   rF   rE   r    r!   )rG   r,   r-   rH   rI   rJ   rK   rL   r2   r2   r3   _netdev_info_ifconfig   sZ    !&!&! &&&&"&rN   c                s$  i  } t  j   rH t j d d g d d d g \ } } t |  } n t j d  r t j d d d g  \ } } t |  } nR t j d  r t j d d g d d d g \ } } t |  } n t j d	  |  d
 k r | St	 t
 t f  d
 d    f d d      | d |  | S)NZifconfigz-arcsr   r8   r   r/   Zshowz>Could not print networks: missing 'ip' and 'ifconfig' commandsr       c                s   t  |  t  r |  j   } n0 t  |  t t f  rB t |   } n t d   xI | D]A \ } } | | k rz | |  | <qU t  |   rU   | |  qU Wd S)zTRecursively replace 'empty_vals' in data (dict, tuple, list)
           with new_valzUnexpected input to fillN)
isinstancedictitemstuplelistr   	TypeError)datanew_valZ
empty_valsZmyiterkeyval)fillrecurse_typesr2   r3   r[      s    znetdev_info.<locals>.fillrX   )r   rP   )r   Z	is_NetBSDr   rM   whichr4   rN   r%   r&   rR   rT   rU   )emptyr,   Z	ifcfg_out_errr+   r2   )r[   r\   r3   netdev_info   s$    ''r`   c             C   s}  i  } g  | d <g  | d <|  j    } d d d d d d d d d d d	 d i } x| D]} t |  } | sr qW | j   } d
 g } | d d k r d | d <d | d <n} d | d k r | d j d  \ } }	 n- | d } d }	 | j d  t |	  | d <| | d <t |	  | d <d | d <x t t |   D]| }
 | |
 d k rv| |
 d | d <| j d d  | |
 d k r| |
 d | d <| |
 d	 k r>| |
 d | d	 <q>Wd j |  | d <| d j |  qW Wy: t	 j	 d d d d d d d g d d d g \ } } Wn t	 j
 k
 r7YnBX| j    } x2| D]*} i  } | s`qK| j   } | d d k rd | d <d | d <n" | d | d <d | d <d
 | d <x 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W| d j |  qK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
   destinationr   r   gatewaygenmaskifacemetricUr   defaultz0.0.0.0r   r   HZviar8   Gr   r   z	--onelinez-6routerU   tableallrO   z::/0ZUGz::Zexpirese)r   r   r#   r'   r   rD   r?   insertjoinr   ProcessExecutionError)Ziproute_dataroutesentriesZdefault_route_entryr-   entryrI   r   r/   ZcidrrJ   Ziproute_data6_err6entries6r2   r2   r3   _netdev_route_info_iproute   s    

	







rv   c       	      C   s  i  } g  | d <g  | d <|  j    } x3| 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 d | d d | d d | d i } | d j |  q- Wy4 t j d d d d d g d d d g \ } } Wn t j k
 rYn8X| 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d | d d | d d | d d | d d | d d | d d | d i } | d d" k rq| d j d#  rt j d$ d% | d  | d <| d j |  qW| S)&Nr	   r
      r   ZKernelDestinationZInternetZ	Internet6ZRouting   -      ra   rb   r8   rc   r:   r      re      refZuserd   netstatz-Ar   z--routez	--numericrO   ZProtoZActiveloz/128z\/128$r   )	r   r#   r?   r'   r   rp   r@   r   sub)	Z
route_datarq   rr   r-   rI   rs   Zroute_data6rt   ru   r2   r2   r3   _netdev_route_info_netstatB  sl    

"  







."  





r   c              C   s   i  }  t  j d  rE t  j  d d d d g  \ } } t |  }  nX t  j d  r t  j  d d d d g d	 d
 d g \ } } t |  }  n t j d  |  S)Nr   z-orj   rU   r   z--routez	--numericz--extendrO   r   r8   z;Could not print routes: missing 'ip' and 'netstat' commands)r   r]   rv   r   r%   r&   )rq   Ziproute_outr_   Z	route_outr2   r2   r3   
route_info  s    !'r   c              C   s$  g  }  d } y t  d |  } WnS t k
 rt } z3 |  j t j d j d t |   d d   WYd  d  } ~ XnX| s d Sd d	 d
 d d d g } t |  } xt | j	    D]\ } } xR | j
 d  D]A } | j | | d | d | d | j
 d |  | d f  q WxN | j
 d  D]= } | j | | d | d | | j
 d |  | d f  q'Wt | j
 d   t | j
 d   d k r | j | | d | | | | d f  q W| j   }	 t t |	 j   d t  }
 t j d d |
  } |  j | |	 g  d j |   d S)N.r^   z Net device info failed ({error})error!P   
ZDeviceZUpZAddressZMaskZScopez
Hw-Addressr	   r   r   r   r   r   r
   r<   r   rY   zNet device info+)r`   	Exceptionr'   r   centerformatstrr   sortedrS   getadd_rowr?   
get_stringmaxr   extendro   )linesr^   Znetdevrm   ZfieldsZtblr   rW   r/   Znetdev_smax_lenheaderr2   r2   r3   netdev_pformat  s<     !!.r   c              C   sk  g  }  y t    } Wng t k
 r| } zG |  j t j d j d t |   d d   t j t d |  WYd  d  } ~ XnX| j	 d  rgd d d	 d
 d d g } t
 |  } xb t | j	 d   D]K \ } } t |  } | j | | d | d | d | d | d g  q W| j   } t t | j   d t  }	 t j d d |	  }
 |  j |
 | g  | j	 d  rZd d d	 d d g } t
 |  } xn t | j	 d   D]W \ } } t |  } | d d k rq| j | | d | d | d | d g  qW| j   } t t | j   d t  }	 t j d d |	  }
 |  j |
 | g  d j |   d S)NzRoute info failed ({error})r   r   r   zRoute info failed: %sr	   ZRouterx   ZGatewayZGenmaskZ	InterfaceZFlagsra   rb   rc   rd   r   rY   zRoute IPv4 infor   r
   r   zRoute IPv6 infor   )r   r   r'   r   r   r   r   Zlogexcr%   r   r   r   r   r   r?   r   r   r   ro   )r   rq   rm   Z	fields_v4Ztbl_v4nrZroute_idZroute_sr   r   Z	fields_v6Ztbl_v6r2   r2   r3   route_pformat  sJ    '	"	" r   z	ci-info: c             C   s   g  } t    j   } |  rF x5 | D] } | j d |  | f  q" Wn | j |  t   j   } |  r x5 | D] } | j d |  | f  qo Wn | j |  d j |  S)Nz%s%sr   )r   r   r'   r   r   ro   )r1   r   Znetdev_linesr-   Zroute_linesr2   r2   r3   
debug_info  s    r   )r   r   r   Z	cloudinitr   ZloggingZcloudinit.net.network_stater   r   r   Zcloudinit.simpletabler   Z	getLoggerr%   rA   r4   rM   rN   r`   rv   r   r   r   r   r   r2   r2   r2   r3   <module>   s*   ?/8*RI")