
"T`j                 @   s  d  d l  Z  d  d l Z d  d l 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 d  d l m Z d d	 l m Z d d
 l m Z m Z m Z m Z e j e  Z d Z d d d d g Z d d d  Z d d   Z d d   Z d d   Z Gd d   d e  Z Gd d   d e  Z  Gd d   d e  Z! Gd d    d  e j"  Z" d! d"   Z# d d# d$  Z$ d d% d&  Z% d d' d(  Z& d S))    N)	ConfigObj)log)util)subp)networkmanager_conf)resolv_conf   )renderer)is_ipv6_addrnet_prefix_to_ipv4_masksubnet_is_ipv6IPV6_DYNAMIC_TYPESz'/etc/NetworkManager/NetworkManager.confZcentosZfedorarhelsuse#c             C   sf   d d g } xJ t  d t |   D]3 } | | rK |  d | | | | <q" |  | | <q" Wd j |  S)NzBCreated by cloud-init on instance boot automatically, do not edit. r    
)rangelenjoin)seplinesi r   9/usr/lib/python3/dist-packages/cloudinit/net/sysconfig.py_make_header   s    	
r   c             C   s$   d } |  d d k o# |  d | k S)N::0.0.0.0prefixr   network)r   r   r   )routeZdefault_netsr   r   r   _is_default_route&   s    r"   c             C   sG   t  j d |   r? |  j d  r4 |  j d  r4 |  Sd |  Sn |  Sd  S)Nz\s"z"%s")research
startswithendswith)valuer   r   r   _quote_value+   s
    r)   c             C   s   t  |   } d | k r d | d k rC d | d d k rQ d Sn g  | d d <t | d d t  r | d d j d  n | d d d g | d d <| j   t j d  d S)zEAdd ifcfg-rh to NetworkManager.cfg plugins if main section is presentmainZpluginszifcfg-rhNz'Enabled ifcfg-rh NetworkManager plugins)r   
isinstancelistappendwriteLOGdebug)pathconfigr   r   r   enable_ifcfg_rh6   s    
r3   c               @   s   e  Z d  Z d Z d d d d i Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d S)	ConfigMapz!Sysconfig like dictionary object.TyesFnoc             C   s   i  |  _  d  S)N)_conf)selfr   r   r   __init__Q   s    zConfigMap.__init__c             C   s   | |  j  | <d  S)N)r7   )r8   keyr(   r   r   r   __setitem__T   s    zConfigMap.__setitem__c             C   s   |  j  | S)N)r7   )r8   r:   r   r   r   __getitem__W   s    zConfigMap.__getitem__c             C   s   |  j  j |  S)N)r7   get)r8   r:   r   r   r   r=   Z   s    zConfigMap.getc             C   s   | |  j  k S)N)r7   )r8   r:   r   r   r   __contains__]   s    zConfigMap.__contains__c             C   s   |  j  j | d   d  S)N)r7   pop)r8   r:   r   r   r   drop`   s    zConfigMap.dropc             C   s   t  |  j  S)N)r   r7   )r8   r   r   r   __len__c   s    zConfigMap.__len__c             C   s   d S)z6Skip the pair key, value if it matches a certain rule.Fr   )r8   r:   valr   r   r   skip_key_valuef   s    zConfigMap.skip_key_valuec             C   s   t  j   } | j t    |  j r2 | j d  x t |  j j    D]| } |  j | } |  j | |  rp qH t | t	  r |  j
 | } t | t  s t |  } | j d | t |  f  qH W| j   S)Nr   z%s=%s
)ioStringIOr.   r   r7   sortedkeysrC   r+   bool	_bool_mapstrr)   getvalue)r8   bufr:   r(   r   r   r   	to_stringj   s    	!zConfigMap.to_stringc             C   s   |  j  j |  d  S)N)r7   update)r8   Zupdatesr   r   r   rN   z   s    zConfigMap.updateN)__name__
__module____qualname____doc__rI   r9   r;   r<   r=   r>   r@   rA   rC   rM   rN   r   r   r   r   r4   H   s   r4   c                   ss   e  Z d  Z d Z   f d d   Z d d   Z e d d    Z e d d	    Z d
 d   Z	 d d d  Z
   S)Routez!Represents a route configuration.c                sV   t  t |   j   d |  _ d |  _ d |  _ | |  _ | |  _ | |  _ | |  _	 d  S)Nr   F)
superrS   r9   last_idxhas_set_default_ipv4has_set_default_ipv6_route_name_base_sysconf_dirroute_fn_tpl_ipv4route_fn_tpl_ipv6)r8   Z
route_namebase_sysconf_diripv4_tplipv6_tpl)	__class__r   r   r9      s    						zRoute.__init__c             C   s[   t  |  j |  j |  j |  j  } |  j j   | _ |  j | _ |  j | _ |  j	 | _	 | S)N)
rS   rX   rY   rZ   r[   r7   copyrU   rV   rW   )r8   rr   r   r   r`      s    z
Route.copyc             C   s   |  j  d |  j d |  j i S)Nbasename)rZ   rY   rX   )r8   r   r   r   	path_ipv4   s    zRoute.path_ipv4c             C   s   |  j  d |  j d |  j i S)Nrb   rc   )r[   rY   rX   )r8   r   r   r   	path_ipv6   s    zRoute.path_ipv6c             C   s
   d | k S)N:r   )r8   addressr   r   r   is_ipv6_route   s    zRoute.is_ipv6_routeipv4c             C   sx  | d k r" t  d t |    t j   } | j t    |  j rT | j d  d } xt |  j j    D]} d | k rp | j	 d d  } t |  j |  } | d k r|  j
 |  rt |  j d |  } t |  j d	 |  } | d } | j d
 d t |  t |  f  | j d
 d	 t |  t |  f  | j d
 d t |  t |  f  d | }	 |	 |  j k rjt |  j d |  }
 | j d
 d t |  t |
  f  qp | d k rp |  j
 |  rp t |  j d |  } t |  j d	 |  } d | |  j k rAd t |  j d |  n d }
 | j d | | | |
 |  j f  qp W| j   S)Nri   ipv6zUnknown protocol '%s'r   r   ZADDRESSr   NETMASKGATEWAYz%s=%s
METRICzmetric z%s/%s via %s %s dev %s
)ri   rj   )
ValueErrorrJ   rD   rE   r.   r   r7   rF   rG   replacerh   r)   rX   rK   )r8   protorL   Zreindexr:   indexZaddress_valueZnetmask_valueZgateway_value
metric_keyZmetric_valuer   r   r   rM      sJ    	

4zRoute.to_string)rO   rP   rQ   rR   r9   r`   propertyrd   re   rh   rM   r   r   )r_   r   rS   ~   s   	rS   c            
       s   e  Z d  Z d Z d d d d d d d d	 d
 d i Z d   f d d  Z e d d    Z e j d d    Z e d d    Z	 e	 j d d    Z	 e d d    Z
 d d d d  Z d d   Z   S)NetInterfacezERepresents a sysconfig/networking-script (and its config + children).ZethernetZEthernetbondZBondbridgeZBridge
infinibandZ
InfiniBandvlanVlanc                s   t  t |   j   g  |  _ | |  _ |  j j d  } t | | d | j d  d | j d  |  _ |  j j d  |  _ | |  _	 | |  _
 | |  j d <| |  _ d  S)Nroute_templatesr]   ri   r^   rj   iface_templatesDEVICE)rT   ru   r9   children	templatesr=   rS   routesiface_fn_tplkind_iface_namer7   rY   )r8   
iface_namer\   r   r   Z	route_tpl)r_   r   r   r9      s    				zNetInterface.__init__c             C   s   |  j  S)N)r   )r8   r   r   r   rc      s    zNetInterface.namec             C   s   | |  _  | |  j d <d  S)Nr}   )r   r7   )r8   r   r   r   r   rc      s    	c             C   s   |  j  S)N)_kind)r8   r   r   r   r      s    zNetInterface.kindc             C   s<   | |  j  k r t |   | |  _ |  j  | |  j d <d  S)NTYPE)iface_typesro   r   r7   )r8   r   r   r   r   r      s    	c             C   s   |  j  d |  j d |  j i S)Nrb   rc   )r   rY   rc   )r8   r   r   r   r1     s    zNetInterface.pathFc             C   sj   t  |  j |  j |  j d |  j } |  j j   | _ | rN t |  j  | _ | rf |  j	 j   | _	 | S)Nr   )
ru   rc   rY   r   r   r7   r`   r,   r~   r   )r8   Zcopy_childrenZcopy_routescr   r   r   r`     s    zNetInterface.copyc             C   s    | d k r | d k r d Sd S)Nr   rz   TFr   )r8   r:   rB   r   r   r   rC     s    zNetInterface.skip_key_value)rO   rP   rQ   rR   r   r9   rt   rc   setterr   r1   r`   rC   r   r   )r_   r   ru      s   
ru   c               @   s  e  Z d  Z d Z d d d d d d d d d	 i d
 d d d d i i Z d d d d d d d d d d d d d i d
 d d d d d d d d d d i i Z e dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg g  Z i  Z d< d= d>  Z	 e
 d? d@    Z e
 dA dB    Z e
 dC dD    Z e
 dE dF    Z e
 dG dH    Z e
 dI dJ    Z e
 dK dL    Z e d< dM dN   Z e d< dO dP   Z e
 dQ dR    Z e
 dS dT    Z e
 d< dU dV   Z d< d< dW dX  Z d< S)hRendererz7Renders network information in a /etc/sysconfig format.r   ONBOOTTZUSERCTLFZNM_CONTROLLED	BOOTPROTOnoner   static	STARTMODEZautoz	accept-raIPV6_FORCE_ACCEPT_RAZ
bridge_stpZSTPZbridge_ageingZAGEINGZbridge_bridgeprioZPRIOmac_addressZHWADDRmtuMTU
BRIDGE_STPZBRIDGE_AGEINGTIMEZBRIDGE_PRIORITYLLADDR	bond_modemode=%sbond_xmit_hash_policyxmit_hash_policy=%sbond_miimon	miimon=%sbond_min_linksmin_links=%sbond_arp_intervalarp_interval=%sbond_arp_ip_targetarp_ip_target=%sbond_arp_validatearp_validate=%sbond_ad_selectad_select=%sbond_num_grat_arpnum_grat_arp=%sbond_downdelaydowndelay=%sbond_updelay
updelay=%sbond_lacp_ratelacp_rate=%sbond_fail_over_macfail_over_mac=%sbond_primary
primary=%sbond_primary_reselectprimary_reselect=%sNc             C   s   | s i  } | j  d d  |  _ | j  d d  |  _ | j  d d  |  _ d } | j  d |  |  _ d	 | j  d	  d
 | j  d
  d | j  d  i |  _ | j  d d  |  _ d  S)Nsysconf_dirzetc/sysconfignetrules_pathz(etc/udev/rules.d/70-persistent-net.rulesdns_pathzetc/resolv.confz,etc/NetworkManager/conf.d/99-cloud-init.confnetworkmanager_conf_pathcontrolr|   r{   flavorr   )r=   r   r   r   r   r   r   )r8   r2   nm_conf_pathr   r   r   r9   Q  s    	zRenderer.__init__c             C   s   t  j |  j j | i    } | j |  xn d
 D]f } | j |  } | d  k	 r2 | d k rr | d d k rr q2 |  j | j |  } | r2 | | | <q2 Wd | k r | d r | d d k r d | d	 <d  S)Nr   r   	accept-ratypephysicalrx   Z	wakeonlanzwol gZETHTOOL_OPTS)r   r   r   )r   z
infiniband)r`   deepcopyiface_defaultsr=   rN   cfg_key_maps)clsiface	iface_cfgr   Zflavor_defaultsold_keyZ	old_valuenew_keyr   r   r   _render_iface_sharedb  s    zRenderer._render_iface_sharedc             C   s  | d k r< d | d <d | k rF d | d <| j  d  n
 d | d <xt | d t | j  D]\ } } d } | j d	  } | d
 k s | d k r5| d k r | d d k r d | d <n
 d
 | d <d | d <q| d k r| d k rd | d <d | d <d | d <d | d <qd | d <d | d <nx| d k r| d k r| d d k rjd | d <n
 d
 | d <d | d <qd | d <d | d <d | d <d | d <n| d k r| d k r| d d k rd | d <n
 d
 | d <d | d <qd | d <d | d <n| d@ k r`| d }	 d | d <| d k r| d k r|	 d
 k rd | d <nM| dA k rVt |  r| d k rd } d | d <d | k r't | | k o| d | | k  }
 |
 rt j d | j	 | | | d  t |  r| d k rq'| d | | <n | d | | <t |  r| d k rd | d <d | d <nW | d k r| d k rt j
 d  |  q| | k | d! <n t d" | | j	 f   | j d#  d k rb | d k rd | d$ <qb d | d! <qb WdB } dC } xt | d t | j  D]\ } } | j d	  } d& | k rR| d k rR| d& | d' <| dD k r| d k r| r| d d k rd | d( <qq| t k rqq| dE k rt |  rr| d% } d) | d* | d+ f } | d, k r| d k r| | d- <qo| | d. <q| d% k r@| d k r3| | d/ <qo| | d0 <q| d k r]| | d1 | <q| d0 d2 | 7<nR | d% } | d, k rd3 n	 t |  } | d* | d4 | <t | d+  | d5 | <d6 | k r| d k rd | d7 <t | d6  r| d6 | d8 <n | d6 | d9 <d: | k rD| d k rDd2 j | d:  | d; <d< | k r| d k rt | d<  d= k rt j
 d> | j	 t | d<   x? t | d< d  d=  d%  D]  \ } } | | d? t |  <qWqWd  S)FNr   r   r   BRIDGEdhcpr   startr   r   Zdhcp6zipv6_dhcpv6-statefuldhcp4ZmanagedZDHCLIENT6_MODEr   TZDHCPV6CZIPV6INITFZIPV6_AUTOCONFzipv6_dhcpv6-statelessinfoz-SZDHCPV6C_OPTIONSZ
ipv6_slaacstatic6ZIPV6_MTUr   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r   Zmanualz Unknown subnet type setting "%s"r   z1Unknown subnet type '%s' found for interface '%s'r   r   r   metricrm   DHCLIENT_SET_DEFAULT_ROUTEz%s/%srg   r   r   ZIPADDR6ZIPV6ADDRZ	IPADDR6_1ZIPV6ADDR_SECONDARIESz
IPADDR6_%dr   r   ZIPADDRrk   gatewayDEFROUTEIPV6_DEFAULTGWrl   Z
dns_searchZDOMAINdns_nameservers   z6%s has %d entries in dns_nameservers. Only 3 are used.ZDNS)r   r   )r   r   rn   rn   )r   r   )r   r   )r@   	enumerater   r~   r=   r   rH   r/   Zwarningrc   r0   ro   r   rJ   r   r
   r   )r   r   subnetshas_default_router   r   subnetZmtu_keysubnet_typeZbootproto_inZmtu_mismatchZ
ipv4_indexZ
ipv6_indexZ	ipv6_cidrZsuffkr   r   r   _render_subnetsw  s    


(














(



	*zRenderer._render_subnetsc             C   s  | d k r d  Sxt  | d t | j  D]\ } } | j d  } x| j d g   D]} | j d  p| t | d  }	 t |  rp| t k rp| j d  r | j s | j d  r | j r t	 d | j
   d	 }
 d
 } d } d | d <| d d k rd | d <d | k rS|	 r<| d | d <d | _ n | d | d <d | _ d | k r| d | d <qZ d | j }
 d | j } d | j } d | j } | j d 7_ xR d |
 f d | f d | f d | f g D]& \ } } | | k r| | | | <qWqZ Wq, Wd  S)Nr   r   r   r   rj   r   ri   z?Duplicate declaration of default route found for interface '%s'ZGATEWAY0ZNETMASK0ZADDRESS0Tr   r   r   r   r   r   rl   r   rm   z	GATEWAY%sz	NETMASK%sz	ADDRESS%szMETRIC%sr   Znetmaskr    )zdhcpzdhcp4)r   r   r~   r=   r
   r"   r   rV   rW   ro   rc   rU   )r   r   	route_cfgr   r   _r   r   r!   Zis_ipv6Zgw_keyZnm_keyZaddr_keyrs   r   r   r   r   r   _render_subnet_routes3  sN    (			

			zRenderer._render_subnet_routesc             C   s   g  } x |  j  D] \ } } | | j d d  g } xZ | D]R } | | k r; | | } t | t t f  r{ d j |  } | j | |  Pq; Wq W| r d j |  | d <d  S)Nr   -r   ZBONDING_OPTS)bond_tpl_optsrp   r+   tupler,   r   r-   )r   r   r   Z	bond_optsZbond_keyZ	value_tplZ	bond_keysZ
bond_valuer   r   r   _render_bonding_optsp  s    
	zRenderer._render_bonding_optsc       
      C   s   t  j } xu | j |  D]d } | d } | j d g   } | | } | j }	 |  j | | | j |  |  j | |	 | |  q Wd  S)Nrc   r   )r	   Zfilter_by_physicaliter_interfacesr=   r   r   r   r   )
r   network_stateiface_contentsr   Zphysical_filterr   r   iface_subnetsr   r   r   r   r   _render_physical_interfaces  s    	

	z$Renderer._render_physical_interfacesc                s  t  j d  } t  j d  } x| j |  D]} | d   |   } |  j | |  | g } | j | j  x- | D]% }	 d |	 d <| d k rx d |	 _ qx W| j d  r | d k r | j d  | d <n | j d  | d	 <| j d
 g   }
 | j	 } |  j
 | |
 | j |  |  j | | |
 |  t   f d d   | j |  D  } x t |  D]z \ } } | d k rd | } n
 d | } | | | <| | } | d k rd | d <d | d <qd  | d <d | d <qdWq. Wd  S)Nrv   zbond-masterrc   TZBONDING_MASTERr   r   r   MACADDRr   c                s*   g  |  ]  } | d    k r | d  q S)zbond-masterrc   r   ).0Zslave_iface)r   r   r   
<listcomp>  s   	 z4Renderer._render_bond_interfaces.<locals>.<listcomp>zBONDING_SLAVE_%szBONDING_SLAVE%sr   r   Zhotplugr   ZMASTERZSLAVE)r	   filter_by_typeZfilter_by_attrr   r   extendr~   r   r=   r   r   r   r   rF   r   )r   r   r   r   Zbond_filterZslave_filterr   r   Zmaster_cfgsZ
master_cfgr   r   Zbond_slavesrr   Z
bond_slaveZslavestrZ	slave_cfgr   )r   r   _render_bond_interfaces  sJ    

	
	




z Renderer._render_bond_interfacesc             C   s;  t  j d  } x%| j |  D]} | d } | | } | d k r | j d  } | rd | | d <| d  | j d   | d <ne d | d	 <d | _ | d
 }	 t |	 | d  }
 | |
 k r t j d | |	 d j	 |
   |	 | d <| j d g   } | j
 } |  j | | | j |  |  j | | | |  q Wd  S)Nry   rc   r   vlan_idZVLAN_ID.ZETHERDEVICETZVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %sr   ZPHYSDEVr   )r	   r   r   r=   rfindr   _supported_vlan_namesr/   r   r   r   r   r   r   )r   r   r   r   Zvlan_filterr   r   r   r   rdevZ	supportedr   r   r   r   r   _render_vlan_interfaces  s2    


 
	

	z Renderer._render_vlan_interfacesc             C   s   t  t |  j  t |  j  g  s( d  St j d  } | rg t j j |  rg t j t	 j
 |   } x |  j D] } | j |  qq Wx |  j D] } | j |  q Wt d  } t |  } | j |  s | d | } | S)Nr   ;r   )anyr   r   Zdns_searchdomainsr   Z
ResolvConfosr1   isfiler   Z	load_fileZadd_nameserverZadd_search_domainr   rJ   r&   )r   existing_dns_pathcontentZ
nameserverZsearchdomainheaderZcontent_strr   r   r   _render_dns  s    zRenderer._render_dnsc             C   sr   t  j d  } |  j r+ | j d d d  t |  d k rA d  Sd j t   d d j | j    d g  } | S)Nr   r*   Zdnsr   r   r   )r   ZNetworkManagerConfr   Zset_section_keypairr   r   r   r.   )r   r   r   outr   r   r   _render_networkmanager_conf   s    	-z$Renderer._render_networkmanager_confc             C   s   d d   |  j  | j   D } t j d  } x| j |  D]} | d } | | } | d k rn d | _ x4 | j   D]& \ }	 }
 |	 | k r{ | |	 | |
 <q{ W| d k r d | k r | j d  r d | d <n
 d | d <| j d	  rd
 } | d k r
d } | j d	  | | <| d k r[| j d g   r[d d j | j d   | d <xp | j d g   D]\ } | | } | g } | j | j	  x0 | D]( } | } | d k rd } | | d <qWqnW| j d g   } | j
 } |  j | | | j |  |  j | | | |  q? Wd  S)Nc             S   s.   i  |  ]$ \ } } | j  d   r | |  q S)rw   )r&   )r   Zold_kZnew_kr   r   r   
<dictcomp>  s   		z6Renderer._render_bridge_interfaces.<locals>.<dictcomp>rw   rc   r   r   ZonZoffr   r   Z	LLADDRESSZbridge_portsz%sr   ZBRIDGE_PORTSr5   r   r   )r   itemsr	   r   r   r   r=   r   r   r~   r   r   r   r   )r   r   r   r   Zbridge_key_mapZbridge_filterr   r   r   r   r   r:   Zbridged_iface_nameZbridged_cfgZbridged_cfgsZ
bridge_cfgZbridge_valuer   r   r   r   r   _render_bridge_interfaces  sR    	

	
	
		z"Renderer._render_bridge_interfacesc       
      C   s   t  j d  } x~ | j |  D]m } | d } | | } d | _ | j d g   } | j }	 |  j | | | j |  |  j | |	 | |  q Wd  S)Nrx   rc   r   )	r	   r   r   r   r=   r   r   r   r   )
r   r   r   r   Z	ib_filterr   r   r   r   r   r   r   r   _render_ib_interfacesH  s    

		zRenderer._render_ib_interfacesc             C   s  | s |  j  } i  } x | j   D]x } | d d k r; q" | d } t | | |  } | d k r} | j d  | j d  |  j | | |  | | | <q" W|  j | | |  |  j | | |  |  j | | |  |  j | | |  |  j	 | | |  i  }	 x | j
   D] \ } } | s+| j rk| j   |	 | j <x* | j D] } | rH| j   |	 | j <qHW| j rxW t | j j | j j g d d g  D]. \ }
 } |
 |	 k r| j j |  |	 |
 <qWqW|	 S)	z3Given state, return /etc/sysconfig files + contentsr   Zloopbackrc   r   r}   r   ri   rj   )r   r   ru   r@   r   r   r   r   r   r   r   r~   rM   r1   r   ziprd   re   )r   r\   r   r   r   r   r   r   r   contentsZcpathrq   r   r   r   _render_sysconfigY  s@    	
	zRenderer._render_sysconfigc             C   s  | s |  j  } d } t j | |  j  } xE |  j | | |  j d | j   D] \ } } t j | | |  qO W|  j	 r t j | |  j	  } |  j
 | d | }	 |	 r t j | |	 |  |  j rt j | |  j  }
 |  j | |  } | rt j |
 | |  |  j rG|  j |  } t j | |  j  } t j | | |  t d |  rot t j | d t  t j | | j d   } | j d  rt j t j j |   t   d g } | j r| j d	  | j d
  t j | d j |  d |  d  S)Ni  r   r   targetr1   r   r    zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=nor   )r   r   target_pathr   r  r   r   r   Z
write_filer   r   r   r   r   Z_render_persistent_netavailable_nmr3   NM_CFG_FILEr=   r'   Z
ensure_dirr   r1   dirnamer   Zuse_ipv6r-   r   )r8   r   r   r  Z	file_moder\   r1   datar   Zresolv_contentr   Znm_conf_contentZnetrules_contentr   Zsysconfig_pathZnetcfgr   r   r   render_network_state  sH    										zRenderer.render_network_state)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )rO   rP   rQ   rR   r   r   r   r   r   r9   classmethodr   r   r   r   r   r   r   staticmethodr   r   r   r   r  r
  r   r   r   r   r     sf   		=8"9$r   c                s      f d d   d D S)ziReturn list of supported names for vlan devices per RHEL doc
    11.5. Naming Scheme for VLAN Interfaces.c                s.   g  |  ]$ } | j  d    d t     q S)r   vid)formatint)r   v)r   r  r   r   r     s   	z)_supported_vlan_names.<locals>.<listcomp>{rdev}{vid:04}{rdev}{vid}{rdev}.{vid:04}{rdev}.{vid})r  r  r  r  r   )r   r  r   )r   r  r   r     s     r   c             C   sD   t  d |   } t d |   } t j   d t k oC t | | g  S)Nr  Zvariant)available_sysconfigr  r   Zsystem_infoKNOWN_DISTROSr   )r  	sysconfigZnmr   r   r   	available  s    r  c             C   s   d d g } d d g } x- | D]% } t  j | d | d |  s d Sq Wd d	 g } x0 | D]( } t j j t  j |  |   r[ d
 Sq[ Wd S)NZifupZifdownz/sbinz	/usr/sbinr%   r  Fz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)r   Zwhichr   r1   r   r  )r  Zexpectedr%   pZexpected_pathsr   r   r   r    s    	r  c             C   s)   t  j j t j |  d t  s% d Sd S)Nr1   FT)r   r1   r   r   r  r  )r  r   r   r   r    s    !r  )'r`   rD   r   r$   Z	configobjr   Z	cloudinitr   Zloggingr   r   Zcloudinit.distros.parsersr   r   r   r	   r   r
   r   r   r   Z	getLoggerrO   r/   r  r  r   r"   r)   r3   objectr4   rS   ru   r   r   r  r  r  r   r   r   r   <module>   s8   "6YD  	