509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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}�xˆt| 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�rÈt| jd|  ƒ}
|jd
dt|ƒ t|
ƒf ƒ qR|dkrR| j
|ƒrRt| jd|› � ƒ}d| | jk�rªd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r”d|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< �xÖt|t|jƒd�D �]¾\}}d}|jd	ƒ}|d
ksr|dkrè|dkr¢|d dAkr�d|d< nd
|d< d|d< nB|dkrÔ|dkrÔd|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�ràd|d< �n
|dFk�ržt|ƒ�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�ràd|d< d|d< nB|d k�rÎ|dk�rÀt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�rÞd|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r¢t	d|j
 ƒ‚d	|d
< |d dkr¾d	|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rŠd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r¢t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ƒsðd 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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< 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< qòW |jrÈxBt|jj|jjgddgƒD ]$\}
}|
|	k�r.|jj|ƒ|	|
< �q.W qÈW |	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	r„tj|| j	ƒ}| j
||d�}	|	r„tj||	|ƒ | jr¶tj|| jƒ}
| j||ƒ}|r¶tj|
||ƒ | jræ| j|ƒ}tj|| jƒ}tj|||dd� tj||jdƒƒ}|jdƒ�r t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      


