
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
cj/                 @   s6  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ ejeZddd	d
ddddddddddgZd,ddZdd Zdd ZG dd dZG dd deZG d d! d!eZ G d"d# d#ej!Z!d$d% Z"d-d&d'Z#d.d(d)Z$d/d*d+Z%dS )0    N)MappingOptional)subputil)networkmanager_confresolv_conf)IPV6_DYNAMIC_TYPESis_ipv6_addressnet_prefix_to_ipv4_maskrenderersubnet_is_ipv6)NetworkStateZ	almalinuxZcentosZ
cloudlinuxZ	eurolinuxZfedoraZmiraclelinuxZ	openeulerZOpenCloudOSZopenmandrivarhelZrockysuseZ	TencentOSZ	virtuozzo#c             C   sP   ddg}x<t dt|D ]*}|| r:| d ||  ||< q| ||< qW dj|S )Nz1Created by cloud-init automatically, do not edit. r    
)rangelenjoin)seplinesi r   /usr/lib/python3.6/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_route6   s    r"   c             C   s6   t jd| r.| jdr$| jdr$| S d|  S n| S d S )Nz\s"z"%s")research
startswithendswith)valuer   r   r   _quote_value;   s
    
r)   c               @   sj   e Zd ZdZd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d ZdS )	ConfigMapz!Sysconfig like dictionary object.yesno)TFc             C   s
   i | _ d S )N)_conf)selfr   r   r   __init__O   s    zConfigMap.__init__c             C   s   || j |< d S )N)r-   )r.   keyr(   r   r   r   __setitem__R   s    zConfigMap.__setitem__c             C   s
   | j | S )N)r-   )r.   r0   r   r   r   __getitem__U   s    zConfigMap.__getitem__c             C   s   | j j|S )N)r-   get)r.   r0   r   r   r   r3   X   s    zConfigMap.getc             C   s
   || j kS )N)r-   )r.   r0   r   r   r   __contains__[   s    zConfigMap.__contains__c             C   s   | j j|d  d S )N)r-   pop)r.   r0   r   r   r   drop^   s    zConfigMap.dropc             C   s
   t | jS )N)r   r-   )r.   r   r   r   __len__a   s    zConfigMap.__len__c             C   s   dS )z6Skip the pair key, value if it matches a certain rule.Fr   )r.   r0   valr   r   r   skip_key_valued   s    zConfigMap.skip_key_valuec             C   s   t j }|jt  | jr$|jd xjt| jj D ]X}| j| }| j||rPq4t|t	rd| j
| }t|tsvt|}|jd|t|f  q4W |j S )Nr   z%s=%s
)ioStringIOwriter   r-   sortedkeysr9   
isinstancebool	_bool_mapstrr)   getvalue)r.   bufr0   r(   r   r   r   	to_stringh   s    




zConfigMap.to_stringc             C   s   | j j| d S )N)r-   update)r.   Zupdatesr   r   r   rF   x   s    zConfigMap.updateN)__name__
__module____qualname____doc__rA   r/   r1   r2   r3   r4   r6   r7   r9   rE   rF   r   r   r   r   r*   F   s   r*   c                   sR   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
  ZS )Routez!Represents a route configuration.c                s<   t t| j  d| _d| _d| _|| _|| _|| _|| _	d S )N   F)
superrK   r/   last_idxhas_set_default_ipv4has_set_default_ipv6_route_name_base_sysconf_dirroute_fn_tpl_ipv4route_fn_tpl_ipv6)r.   Z
route_namebase_sysconf_diripv4_tplipv6_tpl)	__class__r   r   r/      s    zRoute.__init__c             C   s>   t | j| j| j| j}| jj |_| j|_| j|_| j	|_	|S )N)
rK   rQ   rR   rS   rT   r-   copyrN   rO   rP   )r.   rr   r   r   rY      s    z
Route.copyc             C   s   | j | j| jd S )N)basename)rS   rR   rQ   )r.   r   r   r   	path_ipv4   s    zRoute.path_ipv4c             C   s   | j | j| jd S )N)r[   r\   )rT   rR   rQ   )r.   r   r   r   	path_ipv6   s    zRoute.path_ipv6c             C   s   d|kS )N:r   )r.   addressr   r   r   is_ipv6_route   s    zRoute.is_ipv6_routeipv4c             C   s  |dkrt dt| tj }|jt  | jr<|jd d}xt| jj D ]t}d|krbqR|j	dd}t| j| }t| jd|  }|dko| j
| r^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rt| jd|  }
|jd
dt| t|
f  qR|dkrR| j
|rRt| jd|  }d| | jkrdt| jd|   nd}
|jd||||
| jf  qRW |j S )Nrb   ipv6zUnknown protocol '%s'r   rL   ADDRESSr   GATEWAYNETMASKz%s=%s
METRICPREFIXzmetric z%s/%s via %s %s dev %s
)rb   rc   )
ValueErrorrB   r:   r;   r<   r   r-   r=   r>   replacera   r)   rQ   rC   )r.   protorD   Zreindexr0   indexZaddress_valueZgateway_valueZnetmask_valueZ
metric_keyZmetric_valueZprefix_valuer   r   r   rE      sV    
&zRoute.to_string)rb   )rG   rH   rI   rJ   r/   rY   propertyr]   r^   ra   rE   __classcell__r   r   )rX   r   rK   |   s   
rK   c                   s   e Zd ZdZdddddd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Zdd Z  ZS )NetInterfacezERepresents a sysconfig/networking-script (and its config + children).ZEthernetZBondZBridgeZ
InfiniBandVlan)ethernetbondbridge
infinibandvlanrr   c                sr   t t| j  g | _|| _| jjd}t|||jd|jdd| _| jjd| _|| _	|| _
|| jd< || _d S )Nroute_templatesrb   rc   )rV   rW   iface_templatesDEVICE)rM   rp   r/   children	templatesr3   rK   routesiface_fn_tplkind_iface_namer-   rR   )r.   
iface_namerU   r{   r~   Z	route_tpl)rX   r   r   r/      s    
zNetInterface.__init__c             C   s   | j S )N)r   )r.   r   r   r   r\   	  s    zNetInterface.namec             C   s   || _ || jd< d S )Nry   )r   r-   )r.   r   r   r   r   r\     s    c             C   s   | j S )N)_kind)r.   r   r   r   r~     s    zNetInterface.kindc             C   s,   || j krt||| _| j | | jd< d S )NTYPE)iface_typesrj   r   r-   )r.   r~   r   r   r   r~     s    
c             C   s   | j | j| jd S )N)r[   r\   )r}   rR   r\   )r.   r   r   r   path  s    zNetInterface.pathFc             C   sH   t | j| j| j| jd}| jj |_|r4t| j|_|rD| j	j |_	|S )N)r~   )
rp   r\   rR   r{   r   r-   rY   listrz   r|   )r.   Zcopy_childrenZcopy_routescr   r   r   rY   #  s    zNetInterface.copyc             C   s   |dkr|dkrdS dS )Nr   rq   TFr   )r.   r0   r8   r   r   r   r9   .  s    zNetInterface.skip_key_value)rr   )FF)rG   rH   rI   rJ   r   r/   rn   r\   setterr~   r   rY   r9   ro   r   r   )rX   r   rp      s   
rp   c               @   s4  e Zd ZU dZdddddddd	Zd
ddddddddddddd	ZedRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gZi Ze	dad5d6Z
ed7d8 Zed9d: Zed;d< Zed=d> Zed?d@ ZedAdB ZedCdD ZedbdEdFZedcdGdHZedIdJ ZedKdL ZedddMdNZdeeee	 d4dOdPdQZd4S )fRendererz7Renders network information in a /etc/sysconfig format.TFnone)ONBOOTZUSERCTL	BOOTPROTOstaticauto)r   	STARTMODE)r   r   IPV6_FORCE_ACCEPT_RAZSTPZAGEINGZPRIOZHWADDRMTU)z	accept-ra
bridge_stpbridge_ageingbridge_bridgepriomac_addressmtu
BRIDGE_STPZBRIDGE_AGEINGTIMEZBRIDGE_PRIORITYLLADDR)r   r   r   r   r   	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   sv   |si }|j dd| _|j dd| _|j dd| _d}|j d|| _|j d	|j d
|j dd| _|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controlrx   rw   )r   rx   rw   flavorr   )r3   r   r   r   r   r{   r   )r.   confignm_conf_pathr   r   r   r/   p  s    

zRenderer.__init__c             C   s   t j| jj|i }|j| xPd
D ]H}|j|}|d k	r$|dkrP|d dkrPq$| j| j|}|r$|||< q$W d|kr|d r|d dkrd|d	< d S )Nr   r   	accept-ratypephysicalru   Z	wakeonlanzwol gZETHTOOL_OPTS)r   r   r   )r   ru   )rY   deepcopyiface_defaultsr3   rF   cfg_key_maps)clsiface	iface_cfgr   Zflavor_defaultsold_keyZ	old_valuenew_keyr   r   r   _render_iface_shared  s     


 zRenderer._render_iface_sharedc             C   s  |dkr,d|d< d|kr4d|d< |j d nd|d< xt|t|jdD ]\}}d}|jd	}|d
ksr|dkr|dkr|d dAkrd|d< nd
|d< d|d< nB|dkr|dkrd|d< d|d< d|d< d|d< nd|d< d|d< n|dkrJ|dkr&|d dBkrd|d< nd
|d< d|d< n d|d< d|d< d|d< d|d< n|dkr|dkr|d dCkrvd|d< nd
|d< d|d< nd|d< d|d< nD|dDkr|d }	d|d< |dkr|	dEkrd|d< n
|dFkrt|r |dkr d}d|d< d|krxt||ko$|d || k}
|
rHtjd|j	|| |d  t|rl|dkr^n|d ||< n|d ||< t|r|dkrd|d< d|d< nB|d kr|dkrtj
d!| n||k|d"< ntd#||j	f |jd$d krJ|dkrd |d%< qJd|d"< qJW dG}dH}xdt|t|jdD ]L\}}|jd	}d'|kr`|dkr`|d' |d(< |dIkr|dkr,|r,|d dkr,d|d)< q,q,|tkrq,q,|dJkr,t|rX|d& }d*|d+ |d, f }|d-kr|dkr||d.< n||d/< nT|d&kr*|dkr ||d0< n||d1< n,|dkrB||d2| < n|d1  d3| 7  < nB|d& }|d-krnd4nt|}|d+ |d5| < t|d, |d6| < d7|kr|dkrd|d8< t|d7 r|d7 |d9< n|d7 |d:< d;|kr|dkrd3j|d; |d<< d=|kr,|dkr,t|d= d>krBtj
d?|j	t|d=  x4t|d= d d> d&D ]\}}||d@t| < qZW q,W d S )KNr   r   r   BRIDGEdhcpr   )startr   r   dhcp6zipv6_dhcpv6-statefuldhcp4ZmanagedZDHCLIENT6_MODEr   TZDHCPV6CZIPV6INITFZIPV6_AUTOCONFZIPV6_FAILURE_FATALz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   rL   metricrg   DHCLIENT_SET_DEFAULT_ROUTEz%s/%sr`   r   r   ZIPADDR6ZIPV6ADDRZ	IPADDR6_1ZIPV6ADDR_SECONDARIESz
IPADDR6_%dr   r   ZIPADDRrf   gatewayDEFROUTEIPV6_DEFAULTGWre   
dns_searchZDOMAINdns_nameservers   z6%s has %d entries in dns_nameservers. Only 3 are used.ZDNS)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   ri   ri   )r   r   )r   r   )r6   	enumerater   rz   r3   r   r@   LOGZwarningr\   debugrj   r   rB   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_subnets  s    

























 
















 zRenderer._render_subnetsc             C   sZ  |dkrd S xFt |t|jdD ].\}}|jd}x|jdg D ]}|jdp`t|d }	t|op|tkr|jdr|js|jdr|jrt	d|j
 d	|d
< |d dkrd	|d< d|kr|	r|d |d< d	|_n|d |d< d	|_d|krN|d |d< qFx6d D ].\}
}|
|kr| |j }||
 ||< qW | jd7  _qFW q"W d S )!Nr   )r   r   r|   rc   r   rb   z?Duplicate declaration of default route found for interface '%s'Tr   r   r   r   r   r   re   r   rg   r   rh   netmaskrf   r    rd   rL   )r   r   r   re   r   rg   r   rh   r   rf   r    rd   )r   r   r   r   r   )r   r   rz   r3   r	   r"   r   rO   rP   rj   r\   rN   )r   r   	route_cfgr   r   _r   r   r!   Zis_ipv6r   new_namer   r   r   r   _render_subnet_routese  sF     




    
zRenderer._render_subnet_routesc       	      C   s   g }xh| j D ]^\}}||jddg}xD|D ]<}||kr*|| }t|ttfrVdj|}|j||  P q*W qW |r|dkrdj||d< ndj||d< d S )Nr   -r   r   ZBONDING_MODULE_OPTSZBONDING_OPTS)bond_tpl_optsrk   r?   tupler   r   append)	r   r   r   r   Z	bond_optsZbond_keyZ	value_tplZ	bond_keysZ
bond_valuer   r   r   _render_bonding_opts  s    


zRenderer._render_bonding_optsc       
      C   sb   t j}xV|j|D ]H}|d }|jdg }|| }|j}	| j|||j| | j||	|| qW d S )Nr\   r   )r   Zfilter_by_physicaliter_interfacesr3   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                st  t jd}t jd}xX|j|D ]H}|d  |  }| j||| |g}|j|j x"|D ]}	d|	d< |dkr^d|	_q^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 }xnt|D ]b\}}|dkr"d| }nd| }|||< || }|dkrVd|d< d|d< n |d< d|d< qW q"W d S )Nrs   zbond-masterr\   TZBONDING_MASTERr   r   r   MACADDRr   c                s    g | ]}|d   kr|d qS )zbond-masterr\   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   extendrz   r~   r3   r|   r   r   r   r=   r   )r   r   r   r   Zbond_filterZslave_filterr   r   Zmaster_cfgsZ
master_cfgr   r   Zbond_slavesrm   Z
bond_slaveZslavestrZ	slave_cfgr   )r   r   _render_bond_interfaces  sP    









z Renderer._render_bond_interfacesc             C   s   t jd}x|j|D ]}|d }|| }|dkr`|jd}|rH||d< |d |jd |d< nJd|d	< d|_|d
 }	t|	|d }
||
krtjd||	dj	|
 |	|d< |jdg }|j
}| j|||j| | j|||| qW d S )Nrv   r\   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   r3   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  s:    

z Renderer._render_vlan_interfacesc       	         s~  g g  x| j  D ]}x<|d D ]0}d|kr:j|d  d|kr  j|d  q W d|krfdd|d d D 7   fdd|d d	 D 7  qW | jrfd
d| jD 7 | jr؈  fdd| jD 7  ttt gsd S tjd}|rtj	j
|rtjtj|}xD ]}|j| q$W x D ]}|j| q>W td}t|}|j|sz|d | }|S )Nr   r   r   dnsc                s   g | ]}| kr|qS r   r   )r   r  )found_nameserversr   r   r   J  s   z(Renderer._render_dns.<locals>.<listcomp>Znameserversc                s   g | ]}| kr|qS r   r   )r   r%   )found_dns_searchr   r   r   O  s   r%   c                s   g | ]}| kr|qS r   r   )r   
nameserver)r  r   r   r   Z  s   c                s   g | ]}| kr|qS r   r   )r   r%   )r  r   r   r   `  s   r   ;r   )r   r   r   Zdns_searchdomainsanyr   r   Z
ResolvConfosr   isfiler   	load_fileZadd_nameserverZadd_search_domainr   rB   r&   )	r   existing_dns_pathr   r   contentr  ZsearchdomainheaderZcontent_strr   )r  r  r   _render_dns9  sN    






zRenderer._render_dnsc             C   sP   t jd}| jr|jddd t|dkr.d S djt ddj|j dg}|S )Nr   mainr  r   r   r   )r   ZNetworkManagerConfr   Zset_section_keypairr   r   r   r<   )r   r{   r  outr   r   r   _render_networkmanager_confz  s    

z$Renderer._render_networkmanager_confc             C   s  dd | j | j D }tjd}xl|j|D ]\}|d }|| }|dkrTd|_x(|j D ]\}	}
|	|kr^||	 ||
< q^W |dkrd|kr|jdrd|d< nd|d< |jd	rd
}|dkrd}|jd	||< |dkr|jdg rddj|jd |d< xZ|jdg D ]J}|| }|g}|j|j	 x(|D ] }|}|dkrFd}||d< q0W qW |jdg }|j
}| j|||j| | j|||| q0W d S )Nc             S   s    i | ]\}}|j d r||qS )rt   )r&   )r   Zold_kZnew_kr   r   r   
<dictcomp>  s   z6Renderer._render_bridge_interfaces.<locals>.<dictcomp>rt   r\   r   r   ZonZoffr   r   Z	LLADDRESSZbridge_portsz%sr   ZBRIDGE_PORTSr+   r   r   )r   itemsr   r   r   r~   r3   r   r   rz   r|   r   r   r   )r   r   r   r   Zbridge_key_mapZbridge_filterr   r   r   r   r   r0   Zbridged_iface_nameZbridged_cfgZbridged_cfgsZ
bridge_cfgZbridge_valuer   r   r   r   r   _render_bridge_interfaces  sV    





z"Renderer._render_bridge_interfacesc       
      C   sl   t jd}x\|j|D ]N}|d }|| }d|_|jdg }|j}	| j|||j| | j||	|| qW d S )Nru   r\   r   )	r   r   r   r~   r3   r|   r   r   r   )
r   r   r   r   Z	ib_filterr   r   r   r   r   r   r   r   _render_ib_interfaces  s    
zRenderer._render_ib_interfacesc             C   s^  |s
| j }i }xd|j D ]X}|d dkr*q|d }t|||}|dkrZ|jd |jd | j||| |||< qW | j||| | j||| | j||| | j||| | j	||| i }	x|j
 D ]\}}|s|jr|j |	|j< x |jD ]}|r|j |	|j< qW |jrxBt|jj|jjgddgD ]$\}
}|
|	kr.|jj||	|
< q.W qW |	S )	z3Given state, return /etc/sysconfig files + contentsr   Zloopbackr\   r   ry   r   rb   rc   )r{   r   rp   r6   r   r   r   r  r  r  r  rz   rE   r   r|   zipr]   r^   )r   rU   r   r   r{   r   r   r   r   contentsZcpathrl   r   r   r   _render_sysconfig  s@    


zRenderer._render_sysconfig)r   r{   returnc             C   s  |s
| j }d}tj|| j}x2| j||| j|dj D ]\}}tj||| q6W | j	rtj|| j	}| j
||d}	|	rtj||	| | jrtj|| j}
| j||}|rtj|
|| | jr| j|}tj|| j}tj|||dd tj||jd}|jdrtjtjj| g }x@tj|ddjd	D ](}d
|kr@P |jds0|j| q0W |jt dg |jr|jd |jd tj|d	j|d	 | d S )Ni  )r{   )r  T)r  modeZpreserve_moder   r    )quietr   z
cloud-initNETWORKING=IPV6_AUTOCONF=NETWORKING_IPV6=zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=no)r  r  r  )r{   r   target_pathr   r  r   r  r   Z
write_filer   r  r   r  r   Z_render_persistent_netr3   r'   Z
ensure_dirr  r   dirnamer
  splitr&   r   r   r   Zuse_ipv6r   )r.   r   r{   targetZ	file_moderU   r   datar   Zresolv_contentr   Znm_conf_contentZnetrules_contentr   Zsysconfig_pathZnetcfgliner   r   r   render_network_state  sX    





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   )N)N)N)N)NN)rG   rH   rI   rJ   r   r   r   r   r{   dictr/   classmethodr   r   r   r   r   r   r  staticmethodr  r  r  r  r  r   r   r%  r   r   r   r   r   4  sj   
	
 I>?'@=) 
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  td qS ))r   vid)formatint)r   v)r   r)  r   r   r   H  s   z)_supported_vlan_names.<locals>.<listcomp>{rdev}{vid:04}{rdev}{vid}{rdev}.{vid:04}{rdev}.{vid})r-  r.  r/  r0  r   )r   r)  r   )r   r)  r   r   D  s
       r   c             C   s0   t j d tkrdS t| r dS t| r,dS dS )NZvariantFT)r   Zsystem_infoKNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rh)r"  r   r   r   	availableR  s    r4  c             C   s   t j tj| dS )Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globr   r  )r"  r   r   r   r3  \  s    r3  c             C   sd   ddg}ddg}x |D ]}t j||| dsdS qW ddg}x$|D ]}tjjt j| |r@d	S q@W dS )
NZifupZifdownz/sbinz	/usr/sbin)r%   r"  Fz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)r   Zwhichr  r   r	  r  )r"  Zexpectedr%   pZexpected_pathsr   r   r   r2  g  s    

r2  )r   )N)N)N)&rY   r5  r:   Zloggingr  r$   Ztypingr   r   Z	cloudinitr   r   Zcloudinit.distros.parsersr   r   Zcloudinit.netr   r	   r
   r   r   Zcloudinit.net.network_stater   Z	getLoggerrG   r   r1  r   r"   r)   r*   rK   rp   r   r   r4  r3  r2  r   r   r   r   <module>   sT   

6nJ      


