o
    x[hÊ²  ã                   @   s  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 e¡Zg d¢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 )!é    N)ÚDictÚOptional)ÚsubpÚutil)Únetworkmanager_confÚresolv_conf)ÚIPV6_DYNAMIC_TYPESÚis_ipv6_addressÚnet_prefix_to_ipv4_maskÚrendererÚsubnet_is_ipv6)ÚNetworkState)Ú	almalinuxÚcentosÚ
cloudlinuxÚ	eurolinuxÚfedoraÚmiraclelinuxÚ	openeulerÚOpenCloudOSÚopenmandrivaÚrhelÚrockyÚsuseÚ	TencentOSÚ	virtuozzoú#c                 C   sJ   ddg}t t|ƒƒD ]}|| r| d ||  ||< q
| ||< q
d |¡S )Nz1Created by cloud-init automatically, do not edit.Ú ú Ú
)Ú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 |v S )N)z::z0.0.0.0Úprefixr   Únetworkr&   )ÚrouteÚdefault_netsr&   r&   r'   Ú_is_default_route6   s   r-   c                 C   s0   t  d| ¡r|  d¡r|  d¡r| S d|  S | S )Nz\sú"z"%s")ÚreÚsearchÚ
startswithÚendswith)Úvaluer&   r&   r'   Ú_quote_value;   s
   r4   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   ó   
zConfigMap.__init__c                 C   s   || j |< d S r8   r9   )r<   Úkeyr3   r&   r&   r'   Ú__setitem__R   s   zConfigMap.__setitem__c                 C   s
   | j | S r8   r9   ©r<   r?   r&   r&   r'   Ú__getitem__U   r>   zConfigMap.__getitem__c                 C   s   | j  |¡S r8   )r:   ÚgetrA   r&   r&   r'   rC   X   s   zConfigMap.getc                 C   s
   || j v S r8   r9   rA   r&   r&   r'   Ú__contains__[   r>   zConfigMap.__contains__c                 C   s   | j  |d ¡ d S r8   )r:   ÚpoprA   r&   r&   r'   Údrop^   s   zConfigMap.dropc                 C   s
   t | jƒS r8   )r!   r:   r;   r&   r&   r'   Ú__len__a   r>   zConfigMap.__len__c                 C   s   dS )z6Skip the pair key, value if it matches a certain rule.Fr&   ©r<   r?   Úvalr&   r&   r'   Úskip_key_valued   s   zConfigMap.skip_key_valuec                 C   s”   t  ¡ }| tƒ ¡ | jr| d¡ t| j ¡ ƒD ],}| j| }|  ||¡r'qt|t	ƒr1| j
| }t|tƒs:t|ƒ}| d|t|ƒf ¡ q| ¡ S )Nr   ú%s=%s
)ÚioÚStringIOÚwriter(   r:   ÚsortedÚkeysrJ   Ú
isinstanceÚboolÚ	_bool_mapÚstrr4   Úgetvalue)r<   Úbufr?   r3   r&   r&   r'   Ú	to_stringh   s   




zConfigMap.to_stringc                 C   s   | j  |¡ d S r8   )r:   Úupdate)r<   Úupdatesr&   r&   r'   rX   x   s   zConfigMap.updateN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rS   r=   r@   rB   rC   rD   rF   rG   rJ   rW   rX   r&   r&   r&   r'   r5   F   s    þr5   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| ƒ ¡  d| _d| _d| _|| _|| _|| _|| _	d S )Né   F)
Úsuperr^   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<   Ú
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	|_	|S r8   )
r^   rd   re   rf   rg   r:   Úcopyra   rb   rc   )r<   Úrr&   r&   r'   rn   ‰   s   üz
Route.copyc                 C   ó   | j | j| jdœ S ©N)ÚbaseÚname)rf   re   rd   r;   r&   r&   r'   Ú	path_ipv4–   ó   ÿzRoute.path_ipv4c                 C   rp   rq   )rg   re   rd   r;   r&   r&   r'   Ú	path_ipv6œ   ru   zRoute.path_ipv6c                 C   s   d|v S )Nú:r&   )r<   Úaddressr&   r&   r'   Úis_ipv6_route¢   s   zRoute.is_ipv6_routeÚipv4c              	   C   sÀ  |dvrt dt|ƒ ƒ‚t ¡ }| tƒ ¡ | jr| d¡ d}t| j ¡ ƒD ]´}d|vr.q'| 	dd¡}t| j| ƒ}t| jd|  ƒ}|dkr§|  
|¡s§t| jd	|  ƒ}|d
 }| ddt|ƒ t|ƒf ¡ | ddt|ƒ t|ƒf ¡ | dd	t|ƒ t|ƒf ¡ d| }	|	| jv r¦t| j|	 ƒ}
| ddt|ƒ t|
ƒf ¡ q'|dkrÛ|  
|¡rÛt| jd|› � ƒ}d| | jv rÌdt| jd|  ƒ nd}
| d||||
| jf ¡ q'| ¡ S )N)rz   Úipv6zUnknown protocol '%s'r   éÿÿÿÿÚADDRESSr   ÚGATEWAYrz   ÚNETMASKr_   rK   ÚMETRICr{   ÚPREFIXzmetric z%s/%s via %s %s dev %s
)Ú
ValueErrorrT   rL   rM   rN   r(   r:   rO   rP   Úreplacery   r4   rd   rU   )r<   ÚprotorV   Úreindexr?   ÚindexÚaddress_valueÚgateway_valueÚnetmask_valueÚ
metric_keyÚmetric_valueÚprefix_valuer&   r&   r'   rW   ¥   st   
ÿÿÿÿÿÿ
ÿÿ€ÿýûÿÿ€zRoute.to_string)rz   )rZ   r[   r\   r]   r=   rn   Úpropertyrt   rv   ry   rW   Ú__classcell__r&   r&   rl   r'   r^   |   s    


r^   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).ÚEthernetÚBondÚBridgeÚ
InfiniBandÚVlan)ÚethernetÚbondÚbridgeÚ
infinibandÚvlanr•   c                    sr   t t| ƒ ¡  g | _|| _| j d¡}t||| d¡| d¡d�| _| j d¡| _|| _	|| _
|| jd< || _d S )NÚroute_templatesrz   r{   )rj   rk   Úiface_templatesÚDEVICE)r`   r�   r=   ÚchildrenÚ	templatesrC   r^   ÚroutesÚiface_fn_tplÚkindÚ_iface_namer:   re   )r<   Ú
iface_nameri   rž   r¡   Ú	route_tplrl   r&   r'   r=   õ   s   ü

zNetInterface.__init__c                 C   ó   | j S r8   )r¢   r;   r&   r&   r'   rs   	  ó   zNetInterface.namec                 C   s   || _ || jd< d S )Nrœ   )r¢   r:   )r<   r£   r&   r&   r'   rs     s   c                 C   r¥   r8   )Ú_kindr;   r&   r&   r'   r¡     r¦   zNetInterface.kindc                 C   s,   || j vr	t|ƒ‚|| _| j | | jd< d S )NÚTYPE)Úiface_typesr‚   r§   r:   )r<   r¡   r&   r&   r'   r¡     s   
c                 C   rp   rq   )r    re   rs   r;   r&   r&   r'   Úpath  ru   zNetInterface.pathFc                 C   sH   t | j| j| j| jd�}| j ¡ |_|rt| jƒ|_|r"| j	 ¡ |_	|S )N)r¡   )
r�   rs   re   rž   r§   r:   rn   Úlistr�   rŸ   )r<   Úcopy_childrenÚcopy_routesÚcr&   r&   r'   rn   #  s   ÿzNetInterface.copyc                 C   s   |dkr
|dkr
dS dS )Nr¨   r”   TFr&   rH   r&   r&   r'   rJ   .  s   zNetInterface.skip_key_value)r•   )FF)rZ   r[   r\   r]   r©   r=   r�   rs   Úsetterr¡   rª   rn   rJ   rŽ   r&   r&   rl   r'   r�   ê   s,    û	ÿ





r�   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g d¢ƒZi Ze	e
d< d7dd„Zedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed7d)d*„ƒZed7d+d,„ƒZed-efd.d/„ƒZed0d1„ ƒZe	d7d-efd2d3„ƒZ		d8d-edee	 d4dfd5d6„ZdS )9ÚRendererz7Renders network information in a /etc/sysconfig format.TFÚnone)ÚONBOOTÚUSERCTLÚ	BOOTPROTOÚstaticÚauto)r´   Ú	STARTMODE)r   r   ÚIPV6_FORCE_ACCEPT_RAÚSTPÚAGEINGÚPRIOÚHWADDRÚMTU)ú	accept-raÚ
bridge_stpÚbridge_ageingÚbridge_bridgeprioÚmac_addressÚmtuÚ
BRIDGE_STPÚBRIDGE_AGEINGTIMEÚBRIDGE_PRIORITYÚLLADDR)r¿   rÀ   rÁ   rÂ   rÃ   ))Ú	bond_modezmode=%s)Úbond_xmit_hash_policyzxmit_hash_policy=%s)Úbond_miimonz	miimon=%s)Úbond_min_linkszmin_links=%s)Úbond_arp_intervalzarp_interval=%s)Úbond_arp_ip_targetzarp_ip_target=%s)Úbond_arp_validatezarp_validate=%s)Úbond_ad_selectzad_select=%s)Úbond_num_grat_arpznum_grat_arp=%s)Úbond_downdelayzdowndelay=%s)Úbond_updelayz
updelay=%s)Úbond_lacp_ratezlacp_rate=%s)Úbond_fail_over_maczfail_over_mac=%s)Úbond_primaryz
primary=%s)Úbond_primary_reselectzprimary_reselect=%srž   Nc                 C   sv   |si }|  dd¡| _|  dd¡| _|  dd¡| _d}|  d|¡| _|  d	¡|  d
¡|  d¡dœ| _|  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š   )rÛ   r›   rš   Úflavorr   )rC   r×   rØ   rÙ   rÚ   rž   rÜ   )r<   ÚconfigÚnm_conf_pathr&   r&   r'   r=   p  s    ÿÿýzRenderer.__init__c                 C   s    t  | j |i ¡¡}| |¡ dD ]$}| |¡}|d ur5|dkr'|d dvr'q| j|  |¡}|r5|||< qd|v rJ|d rL|d dkrNd|d< d S d S d S d S )	N)rÂ   rÃ   r¾   rÂ   Útype)Úphysicalr˜   Ú	wakeonlanrà   zwol gÚETHTOOL_OPTS)rn   ÚdeepcopyÚiface_defaultsrC   rX   Úcfg_key_maps)ÚclsÚifaceÚ	iface_cfgrÜ   Úflavor_defaultsÚold_keyÚ	old_valueÚnew_keyr&   r&   r'   Ú_render_iface_sharedƒ  s$   

€ÿüzRenderer._render_iface_sharedc                 C   s€  |dkrd|d< d|v rd|d< |  d¡ nd|d< t|t|jƒd�D �]R\}}d}| d	¡}|d
ks7|dkrr|dkrP|d dv rFd|d< nd
|d< d|d< �n|dkri|dkrid|d< d|d< d|d< d|d< n÷d|d< d|d< nî|dkrŸ|dkrŽ|d dv 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 dv r²d|d< nd
|d< d|d< n¥d|d< d|d< nœ|dv rÝ|d }	d|d< |dkrÜ|	dvrÜd|d< nƒ|dv �r?t|ƒrð|dkrðd}d|d< d|v �r,t||v �o|d || kƒ}
|
�rt d |j	|| |d ¡ t|ƒ�r&|dk�rn|d ||< n|d ||< t|ƒ�r>|dk�r>d|d!< d|d< n!|d"k�rW|dk�rPt 
d#|¡ n||v |d$< n	td%||j	f ƒ‚| d&¡d"k�rv|dk�rrd"|d'< q#d|d$< q#d(}d(}t|t|jƒd�D �]8\}}| d	¡}d)|v �r¶|dk�r«t|ƒ�r¤|d) |d*< n|d) |d+< n|dk�r¶|d) |d,< |d-v �rÐ|dk�rÎ|�rÎ|d dk�rÎd|d.< �q„|tv �r×�q„|dv �r¼t|ƒ�r.|d/ }d0|d1 |d2 f }|d3k�r|dk�rþ||d4< nQ||d5< nL|d/k�r|dk�r||d6< n=||d7< n8|dk�r#||d8| < n,|d7  d9| 7  < n!|d/ }|d3k�r9d:nt|ƒ}|d1 |d;| < t|d2 ƒ|d<| < d=|v �rq|dk�rqd|d>< t|d= ƒ�rk|d= |d?< n|d= |d@< dA|v �r„|dk�r„d9 |dA ¡|dB< dC|v �r¼|dk�r¼t|dC ƒdDk�r£t 
dE|j	t|dC ƒ¡ t|dC d dD… d/ƒD ]\}}||dFt|ƒ < �q®�q„d S )GNr   rµ   r´   ÚBRIDGEÚdhcpr±   ©Ústartr½   rß   Údhcp6zipv6_dhcpv6-stateful)Údhcp4rï   ÚmanagedÚDHCLIENT6_MODEr   TÚDHCPV6CÚIPV6INITFÚIPV6_AUTOCONFÚIPV6_FAILURE_FATALzipv6_dhcpv6-statelessÚinfoz-SÚDHCPV6C_OPTIONSÚ
ipv6_slaac)rò   rï   ró   )rµ   Ústatic6ÚIPV6_MTUrÃ   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r¸   Úmanualz Unknown subnet type setting "%s"r²   z1Unknown subnet type '%s' found for interface '%s'rÛ   r·   r|   ÚmetricÚIPV6_ROUTE_METRICÚIPV4_ROUTE_METRICr€   ©rï   ró   ÚDHCLIENT_SET_DEFAULT_ROUTEr_   z%s/%srx   r)   r   ÚIPADDR6ÚIPV6ADDRÚ	IPADDR6_1ÚIPV6ADDR_SECONDARIESz
IPADDR6_%dr   r   ÚIPADDRr   ÚgatewayÚDEFROUTEÚIPV6_DEFAULTGWr~   Ú
dns_searchÚDOMAINÚdns_nameserversé   z6%s has %d entries in dns_nameservers. Only 3 are used.ÚDNS)rF   Ú	enumerater!   r�   rC   r   rR   ÚLOGÚwarningrs   Údebugr‚   r   rT   r
   r	   r"   )ræ   rè   ÚsubnetsÚhas_default_routerÜ   r%   ÚsubnetÚmtu_keyÚsubnet_typeÚbootproto_inÚmtu_mismatchÚ
ipv4_indexÚ
ipv6_indexÚ	ipv6_cidrÚsuffÚkr&   r&   r'   Ú_render_subnets�  s&  
€









€


þû

€

ÿÿ

€


















ÿÿ
ü€»zRenderer._render_subnetsc                 C   sj  |dkrd S t |t|jƒd�D ]£\}}| d¡}| dg ¡D ]“}| d¡p*t|d ƒ}	t|ƒr’|tvr’| d¡r;|jsC| d¡rJ|jrJt	d|j
 ƒ‚d	|d
< |d dv rXd	|d< d|v rq|	rh|d |d< d	|_n	|d |d< d	|_d|v r‘|dkr‹t|ƒr„|d |d< q|d |d< q|d |d< qdD ]\}
}|
|v r©|› |j› �}||
 ||< q”| jd7  _qqd S )Nr   rð   rß   rŸ   r{   r
  rz   z?Duplicate declaration of default route found for interface '%s'Tr  r´   r  r  r  r~   r   r   r  r  r€   ))r
  r~   )r   r€   )r)   r�   )Únetmaskr   )r*   r}   r_   )r  r!   r�   rC   r	   r-   r   rb   rc   r‚   rs   r   ra   )ræ   rè   Ú	route_cfgr  rÜ   Ú_r  r  r+   Úis_ipv6rê   Únew_namerì   r&   r&   r'   Ú_render_subnet_routesj  sh   
ÿÿÿÿýýÿÿ	
ÿ
ÿ€€ÃþzRenderer._render_subnet_routesc           	      C   sœ   g }| j D ].\}}|| dd¡g}|D ]}||v r2|| }t|ttfƒr)d |¡}| || ¡  nqq|rL|dkrCd |¡|d< d S d |¡|d< d S d S )Nr%  ú-r   r   ÚBONDING_MODULE_OPTSÚBONDING_OPTS)Úbond_tpl_optsrƒ   rQ   Útupler«   r"   Úappend)	ræ   rè   rç   rÜ   Ú	bond_optsÚbond_keyÚ	value_tplÚ	bond_keysÚ
bond_valuer&   r&   r'   Ú_render_bonding_opts²  s"   
û€ôzRenderer._render_bonding_optsc           	      C   sh   |  t d¡¡D ])}| d¡p|d }| dg ¡}|| }|j}|  |||j|¡ |  ||||¡ qd S )Nrà   Ú	config_idrs   r  )Úiter_interfacesr   Úfilter_by_typerC   rŸ   r"  r  r(  )	ræ   Únetwork_stateÚiface_contentsrÜ   rç   r£   Úiface_subnetsrè   r$  r&   r&   r'   Ú_render_physical_interfacesÍ  s"   ÿüÿòz$Renderer._render_physical_interfacesc                    s^  t  d¡}t  d¡}| |¡D ]�}|d ‰ |ˆ  }|  |||¡ |g}| |j¡ |D ]}	d|	d< |dkr8d|	_q+| d¡rQ|dkrJ| d¡|d< n| d¡|d	< | d
g ¡}
|j	}|  
||
|j|¡ |  |||
|¡ t‡ fdd„| |¡D ƒƒ}t|ƒD ].\}}|dkrŠd| }nd| }|||< || }|dkr£d|d< d|d< q}ˆ |d< d|d< q}qd S )Nr–   úbond-masterrs   TÚBONDING_MASTERr   rÂ   rÇ   ÚMACADDRr  c                    s    g | ]}|d  ˆ kr|d ‘qS )r<  rs   r&   )Ú.0Úslave_iface©r£   r&   r'   Ú
<listcomp>
  s
    üz4Renderer._render_bond_interfaces.<locals>.<listcomp>zBONDING_SLAVE_%szBONDING_SLAVE%sr±   r´   Úhotplugr·   ÚMASTERÚSLAVE)r   r7  Úfilter_by_attrr6  r4  Úextendr�   r¡   rC   rŸ   r"  r  r(  rO   r  )ræ   r8  r9  rÜ   Úbond_filterÚslave_filterrç   rè   Úmaster_cfgsÚ
master_cfgr:  r$  Úbond_slavesr†   Ú
bond_slaveÚslavestrÚ	slave_cfgr&   rA  r'   Ú_render_bond_interfacesã  s`   

€
üÿ
ÿþÿ



óÔz Renderer._render_bond_interfacesc              	   C   sâ   t  d¡}| |¡D ]d}|d }|| }|dkr/| d¡}|r#||d< |d | d¡… |d< n%d|d	< d|_|d
 }	t|	|d ƒ}
||
vrPt d||	d 	|
¡¡ |	|d< | dg ¡}|j
}|  |||j|¡ |  ||||¡ q
d S )Nr™   rs   r   Úvlan_idÚVLAN_IDÚ.ÚETHERDEVICETÚVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %sr   ÚPHYSDEVr  )r   r7  r6  rC   Úrfindr¡   Ú_supported_vlan_namesr  rú   r"   rŸ   r"  r  r(  )ræ   r8  r9  rÜ   Úvlan_filterrç   r£   rè   rQ  ÚrdevÚ	supportedr:  r$  r&   r&   r'   Ú_render_vlan_interfaces"  sB   

ûüÿàz Renderer._render_vlan_interfacesc           	         sd  g ‰g ‰ |   ¡ D ]A}|d D ]}d|v rˆ |d ¡ d|v r&ˆ  |d ¡ qd|v rIˆ‡fdd„|d d D ƒ7 ‰ˆ ‡ fdd„|d d	 D ƒ7 ‰ q| jrYˆ‡fd
d„| jD ƒ7 ‰| jrhˆ ‡ fdd„| jD ƒ7 ‰ ttˆƒtˆ ƒgƒstd S t d¡}|r‰tj	 
|¡r‰t t |¡¡}ˆD ]}| |¡ q‹ˆ D ]}| |¡ q•tdƒ}t|ƒ}| |¡s°|d | }|S )Nr  r  r  Údnsc                    ó   g | ]}|ˆ vr|‘qS r&   r&   )r?  r]  ©Úfound_nameserversr&   r'   rB  Y  ó
    þz(Renderer._render_dns.<locals>.<listcomp>Únameserversc                    r^  r&   r&   ©r?  r0   ©Úfound_dns_searchr&   r'   rB  ^  ra  r0   c                    r^  r&   r&   )r?  Ú
nameserverr_  r&   r'   rB  i  ra  c                    r^  r&   r&   rc  rd  r&   r'   rB  o  ra  r   ú;r   )r6  rG  r  Údns_searchdomainsÚanyr!   r   Ú
ResolvConfÚosrª   Úisfiler   Úload_text_fileÚadd_nameserverÚadd_search_domainr(   rT   r1   )	r8  Úexisting_dns_pathrç   r  Úcontentrf  ÚsearchdomainÚheaderÚcontent_strr&   )re  r`  r'   Ú_render_dnsI  sZ   €
þ
þ€
þþþÿ
ÿ
zRenderer._render_dnsc                 C   s¶   d}t  d¡}|  ¡ D ]+}|d D ]}d|v sd|v rd} nq|s6d|v r6|d d s2|d d	 r6d} nq| js?| js?|rF| d
dd¡ |sJd S d tƒ dd | ¡ ¡dg¡}|S )NFr   r  r  r  Tr]  rb  r0   Úmainr±   r   )	r   ÚNetworkManagerConfr6  r  rh  Úset_section_keypairr"   r(   rN   )r8  rž   Ú	iface_dnsrq  rç   r  Úoutr&   r&   r'   Ú_render_networkmanager_confŒ  s:   
þÿ
ÿ
ÿ€ÿþýz$Renderer._render_networkmanager_confr8  c                 C   s|  dd„ | j |  ¡ D ƒ}t d¡}| |¡D ]¥}|d }|| }|dkr'd|_| ¡ D ]\}	}
|	|v r9||	 ||
< q+|dkrPd|v rP| d¡rLd|d< nd|d< | d	¡rdd
}|dkr]d}| d	¡||< |dkrz| dg ¡rzdd | d¡¡ |d< | dg ¡D ] }|| }|g}| |j	¡ |D ]}|}|dkr›d}||d< q‘q€| dg ¡}|j
}|  |||j|¡ |  ||||¡ qd S )Nc                 S   s    i | ]\}}|  d ¡r||“qS )r—   )r1   )r?  Úold_kÚnew_kr&   r&   r'   Ú
<dictcomp>¶  s    ýÿz6Renderer._render_bridge_interfaces.<locals>.<dictcomp>r—   rs   r   rÄ   ÚonÚoffrÂ   r>  Ú	LLADDRESSÚbridge_portsz%sr   ÚBRIDGE_PORTSr6   rî   r  )rå   Úitemsr   r7  r6  r¡   rC   r"   rG  r�   rŸ   r"  r  r(  )ræ   r8  r9  rÜ   Úbridge_key_mapÚbridge_filterrç   r£   rè   rê   rì   r?   Úbridged_iface_nameÚbridged_cfgÚbridged_cfgsÚ
bridge_cfgÚbridge_valuer:  r$  r&   r&   r'   Ú_render_bridge_interfaces²  sd   þ
€



ÿ
üüÿÐz"Renderer._render_bridge_interfacesc           
      C   sh   t  d¡}| |¡D ]'}|d }|| }d|_| dg ¡}|j}	|  |||j|¡ |  ||	||¡ q
d S )Nr˜   rs   r  )	r   r7  r6  r¡   rC   rŸ   r"  r  r(  )
ræ   r8  r9  rÜ   Ú	ib_filterrç   r£   rè   r:  r$  r&   r&   r'   Ú_render_ib_interfacesñ  s"   
üÿôzRenderer._render_ib_interfacesc                 C   sV  |s| j }i }| ¡ D ]3}|d dkrq| d¡p|d }t|d ||ƒ}|dkr3| d¡ | d¡ |  |||¡ |||< q|  |||¡ |  |||¡ |  |||¡ |  	|||¡ |  
|||¡ i }	| ¡ D ]@\}
}|sq|jr‡| ¡ |	|j< |jD ]}|r†| ¡ |	|j< q{|jr¨t|jj|jjgdd	gƒD ]\}}||	vr§|j |¡|	|< q—qh|	S )
z3Given state, return /etc/sysconfig files + contentsrß   Úloopbackr5  rs   r   rœ   r¨   rz   r{   )rž   r6  rC   r�   rF   rí   r;  rP  r\  rŒ  rŽ  r„  r�   rW   rª   rŸ   Úziprt   rv   )ræ   ri   r8  rÜ   rž   r9  rç   r5  rè   Úcontentsr£   Úcpathr„   r&   r&   r'   Ú_render_sysconfig  sJ   	
ÿ




€þ€zRenderer._render_sysconfigÚreturnc                    s¢  |s| j }d}t || j¡}| j||| j|d� ¡ D ]\}}t |||¡ q| j	r@t || j	¡}| j
||d�}	|	r@t ||	|¡ | jrYt || j¡}
|  ||¡}|rYt |
||¡ | jrq|  |¡}t || j¡}tj|||dd� t || d¡¡}| d¡rÏt tj |¡¡ tƒ dg}|jrš| d	¡ | d
¡ tj |¡rÁt |¡ ¡ D ]‰ t‡ fdd„dD ƒƒsÀˆ tƒ  ¡ vrÀ| ˆ ¡ q§t |d |¡d |¡ d S d S )Ni¤  )rž   )rp  T)rq  ÚmodeÚpreserve_moderÛ   r*   zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=noc                 3   s   � | ]}|ˆ v V  qd S r8   r&   )r?  Úsetting©Úliner&   r'   Ú	<genexpr>h  s
   € ÿ
ÿz0Renderer.render_network_state.<locals>.<genexpr>)Ú
NETWORKINGÚNETWORKING_IPV6rø   r   )rž   r   Útarget_pathr×   r“  rÜ   r„  r   Ú
write_filerÙ   ru  rÚ   r{  rØ   Ú_render_persistent_netrC   r2   Ú
ensure_dirrk  rª   Údirnamer(   Úuse_ipv6r.  Úexistsrm  Ú
splitlinesri  r"   )r<   r8  rž   ÚtargetÚ	file_moderi   rª   ÚdatarÙ   Úresolv_contentrÞ   Únm_conf_contentÚnetrules_contentrØ   Úsysconfig_pathÚnetcfgr&   r˜  r'   Úrender_network_state2  sn   
ÿ
þÿÿÿ
ü



þÿ	
€ÿèzRenderer.render_network_stater8   )NN)rZ   r[   r\   r]   rä   rå   r-  r,  rž   ÚdictÚ__annotations__r=   Úclassmethodrí   r"  r(  r4  r;  rP  r\  Ústaticmethodru  r{  r   rŒ  rŽ  r“  r   r­  r&   r&   r&   r'   r°   4  s„   
 	ýúú	û÷ÿ


 M
G


>
&B%ÿ>
ûý0üþýû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 )©rZ  Úvid)ÚformatÚint)r?  Úvr²  r&   r'   rB  |  s    ÿÿz)_supported_vlan_names.<locals>.<listcomp>)z{rdev}{vid:04}z{rdev}{vid}z{rdev}.{vid:04}z{rdev}.{vid}r&   r²  r&   r²  r'   rX  y  s   þrX  c                 C   s0   t  ¡ d tvr
dS t| ƒrdS t| ƒrdS dS )NÚvariantFT)r   Úsystem_infoÚKNOWN_DISTROSÚavailable_sysconfigÚavailable_nm_ifcfg_rh©r¥  r&   r&   r'   Ú	available‡  s   r½  c                 C   s   t   t | d¡¡S )Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)Úglobr   r�  r¼  r&   r&   r'   r»  ‘  s   þÿr»  c                 C   s`   ddg}ddg}|D ]}t j||| d�s dS q
ddg}|D ]}tj t  | |¡¡r- d	S qdS )
NÚifupÚifdownz/sbinz	/usr/sbin)r0   r¥  Fz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)r   Úwhichrk  rª   rl  r�  )r¥  Úexpectedr0   ÚpÚexpected_pathsr&   r&   r'   rº  œ  s   ÿþÿrº  )r   r8   )&rn   r¾  rL   Úloggingrk  r/   Útypingr   r   Ú	cloudinitr   r   Úcloudinit.distros.parsersr   r   Úcloudinit.netr   r	   r
   r   r   Úcloudinit.net.network_stater   Ú	getLoggerrZ   r  r¹  r(   r-   r4   r5   r^   r�   r°   rX  r½  r»  rº  r&   r&   r&   r'   Ú<module>   s<   

6nJ      K


