
    x[hʲ                     T   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g dZddZd	 Zd
 Z G d d      Z G d de      Z G d de      Z  G d dejB                        Z!d Z"ddZ#ddZ$ddZ%y)    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	virtuozzoc                     ddg}t        t        |            D ]  }||   r| dz   ||   z   ||<   | ||<    dj                  |      S )Nz1Created by cloud-init automatically, do not edit.  
)rangelenjoin)seplinesis      9/usr/lib/python3/dist-packages/cloudinit/net/sysconfig.py_make_headerr(   )   s`    ;
E 3u: 8Sy58+E!HE!H	
 99U    c                 (    d}| d   dk(  xr | d   |v S )N)z::z0.0.0.0prefixr   network )routedefault_netss     r'   _is_default_router0   6   s%    $L?aDE)$4$DDr)   c                     t        j                  d|       r)| j                  d      r| j                  d      r| S d| z  S | S )Nz\s"z"%s")research
startswithendswith)values    r'   _quote_valuer8   ;   s=    	yyC U^^C%8LE>!r)   c                   V    e Zd ZdZdddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zy)	ConfigMapz!Sysconfig like dictionary object.yesno)TFc                     i | _         y N_confselfs    r'   __init__zConfigMap.__init__O   s	    
r)   c                 "    || j                   |<   y r>   r?   )rB   keyr7   s      r'   __setitem__zConfigMap.__setitem__R   s    

3r)   c                      | j                   |   S r>   r?   rB   rE   s     r'   __getitem__zConfigMap.__getitem__U   s    zz#r)   c                 8    | j                   j                  |      S r>   )r@   getrH   s     r'   rK   zConfigMap.getX   s    zz~~c""r)   c                     || j                   v S r>   r?   rH   s     r'   __contains__zConfigMap.__contains__[   s    djj  r)   c                 <    | j                   j                  |d        y r>   )r@   poprH   s     r'   dropzConfigMap.drop^   s    

sD!r)   c                 ,    t        | j                        S r>   )r"   r@   rA   s    r'   __len__zConfigMap.__len__a   s    4::r)   c                      y)z6Skip the pair key, value if it matches a certain rule.Fr-   rB   rE   vals      r'   skip_key_valuezConfigMap.skip_key_valued   s    r)   c                    t        j                         }|j                  t                      | j                  r|j                  d       t        | j                  j                               D ]~  }| j                  |   }| j                  ||      r%t        |t              r| j                  |   }t        |t              st        |      }|j                  |dt        |      d        |j                         S )Nr    =)ioStringIOwriter(   r@   sortedkeysrV   
isinstancebool	_bool_mapstrr8   getvalue)rB   bufrE   r7   s       r'   	to_stringzConfigMap.to_stringh   s    kkm		,.!::IIdO$**//+, 	>CJJsOE""3.%&u-eS)E
II3U(;<=	> ||~r)   c                 :    | j                   j                  |       y r>   )r@   update)rB   updatess     r'   rf   zConfigMap.updatex   s    

'"r)   N)__name__
__module____qualname____doc__r`   rC   rF   rI   rK   rM   rP   rR   rV   rd   rf   r-   r)   r'   r:   r:   F   sF    + I
 #!" #r)   r:   c                   V     e Zd ZdZ fdZd Zed        Zed        Zd Z	ddZ
 xZS )	Routez!Represents a route configuration.c                     t         t        |           d| _        d| _        d| _        || _        || _        || _        || _	        y )N   F)
superrm   rC   last_idxhas_set_default_ipv4has_set_default_ipv6_route_name_base_sysconf_dirroute_fn_tpl_ipv4route_fn_tpl_ipv6)rB   
route_namebase_sysconf_diripv4_tplipv6_tpl	__class__s        r'   rC   zRoute.__init__   sG    eT#%$)!$)!%!1!)!)r)   c                    t        | j                  | j                  | j                  | j                        }| j
                  j                         |_        | j                  |_        | j                  |_        | j                  |_	        |S r>   )
rm   rt   ru   rv   rw   r@   copyrq   rr   rs   )rB   rs     r'   r~   z
Route.copy   sp    """"""	
 **//#]]
!%!:!:!%!:!:r)   c                 N    | j                   | j                  | j                  dz  S N)basename)rv   ru   rt   rA   s    r'   	path_ipv4zRoute.path_ipv4   )    %%++T5E5EF
 	
r)   c                 N    | j                   | j                  | j                  dz  S r   )rw   ru   rt   rA   s    r'   	path_ipv6zRoute.path_ipv6   r   r)   c                 
    d|v S )N:r-   )rB   addresss     r'   is_ipv6_routezRoute.is_ipv6_route   s    g~r)   c                 $   |dvrt        dt        |      z        t        j                         }|j	                  t                      | j                  r|j	                  d       d}t        | j                  j                               D ]  }d|vr	|j                  dd      }t        | j                  |         }t        | j                  d|z            }|dk(  r| j                  |      st        | j                  d	|z            }|d
z   }|j	                  dt        |      z   dt        |      d       |j	                  dt        |      z   dt        |      d       |j	                  d	t        |      z   dt        |      d       d|z   }	|	| j                  v st        | j                  |	         }
|j	                  dt        |      z   dt        |
      d       d|dk(  sk| j                  |      s~t        | j                  d|          }d|z   | j                  v rdt        | j                  d|z            z   nd}
|j	                  |d|d|d|
d| j                  d
        |j                         S )N)ipv4ipv6zUnknown protocol '%s'r    ADDRESSr   GATEWAYr   NETMASKro   rX   METRICr   PREFIXzmetric /z via r   z dev )
ValueErrorra   rY   rZ   r[   r(   r@   r\   r]   replacer   r8   rt   rb   )rB   protorc   reindexrE   indexaddress_valuegateway_valuenetmask_value
metric_keymetric_valueprefix_values               r'   rd   zRoute.to_string   sR   ((4E
CDDkkm		,.!::IIdO $**//+, 5	C#KK	2.E

30M

9u+< =>M t'9'9-'H #DJJy5/@$A B!A+		 3w</m1LN 		 3w</m1LN 		 3w</m1LN &-
+#&tzz*'=#>LII#c'l2L4NP &T%7%7%F"4::ug.>#?@  %'4::5 DJJx%/?$@ AA 
 		 &$%$((	Y5	n ||~r)   )r   )rh   ri   rj   rk   rC   r~   propertyr   r   r   rd   __classcell__r|   s   @r'   rm   rm   |   sC    +* 
 

 
 

Br)   rm   c                        e Zd ZdZddddddZ	 d fd	Zed	        Zej                  d
        Zed        Z	e	j                  d        Z	ed        Z
ddZd Z xZS )NetInterfacezERepresents a sysconfig/networking-script (and its config + children).EthernetBondBridge
InfiniBandVlan)ethernetbondbridge
infinibandvlanc                 h   t         t        |           g | _        || _        | j                  j                  d      }t        |||j                  d      |j                  d            | _        | j                  j                  d      | _        || _	        || _
        || j                  d<   || _        y )Nroute_templatesr   r   )rz   r{   iface_templatesDEVICE)rp   r   rC   children	templatesrK   rm   routesiface_fn_tplkind_iface_namer@   ru   )rB   
iface_namery   r   r   	route_tplr|   s         r'   rC   zNetInterface.__init__   s     	lD*,"NN&&'89	]]6*]]6*	
 !NN../@A	%)

8!1r)   c                     | j                   S r>   )r   rA   s    r'   r   zNetInterface.name	  s    r)   c                 0    || _         || j                  d<   y )Nr   )r   r@   )rB   r   s     r'   r   zNetInterface.name  s    %)

8r)   c                     | j                   S r>   )_kindrA   s    r'   r   zNetInterface.kind  s    zzr)   c                 |    || j                   vrt        |      || _        | j                   |   | j                  d<   y )NTYPE)iface_typesr   r   r@   )rB   r   s     r'   r   zNetInterface.kind  s;    t'''T""
!--d3

6r)   c                 N    | j                   | j                  | j                  dz  S r   )r   ru   r   rA   s    r'   pathzNetInterface.path  s'      ++TYY?
 	
r)   c                 ,   t        | j                  | j                  | j                  | j                        }| j
                  j                         |_        |rt        | j                        |_        |r| j                  j                         |_	        |S )N)r   )
r   r   ru   r   r   r@   r~   listr   r   )rB   copy_childrencopy_routescs       r'   r~   zNetInterface.copy#  sj    IIt--t~~DJJ
 **//#dmm,AJ{{'')AHr)   c                     |dk(  r|dk(  ryy)Nr   r   TFr-   rT   s      r'   rV   zNetInterface.skip_key_value.  s    &=SF]r)   )r   )FF)rh   ri   rj   rk   r   rC   r   r   setterr   r   r~   rV   r   r   s   @r'   r   r      s    O "K =G2(     
[[* *   
[[4 4 
 

	r)   r   c                   l   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<   d)dZed        Zed        Zed        Zed        Zed        Zed        Zed         Zed)d!       Zed)d"       Zed#efd$       Zed%        Ze	 d)d#efd&       Z	 	 d*d#edee	   d'dfd(Zy)+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                 f   |si }|j                  dd      | _        |j                  dd      | _        |j                  dd      | _        d}|j                  d|      | _        |j                  d	      |j                  d
      |j                  d      d| _        |j                  dd      | _        y )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   )rK   r   r   r   r   r   r   )rB   confignm_conf_paths      r'   rC   zRenderer.__init__p  s    F!::m_E#ZZG
 

:/@AE(.

&)
% zz),%zz*;<%zz*;<

 jj62r)   c                 R   t        j                  | j                  j                  |i             }|j	                  |       dD ]I  }|j                  |      }||dk(  r|d   dvr$| j
                  |   j                  |      }|sE|||<   K d|v r|d   r|d   dk(  rd|d<   y y y y )	N)r   r   r   r   type)physicalr   	wakeonlanr   zwol gETHTOOL_OPTS)r~   deepcopyiface_defaultsrK   rf   cfg_key_maps)clsiface	iface_cfgr   flavor_defaultsold_key	old_valuenew_keys           r'   _render_iface_sharedzRenderer._render_iface_shared  s    --(:(:(>(>vr(JK): 	3G		'*I$m+f F 1 **6266w?)2Ig&	3 5 k"f+(/In% , # !r)   c           	         |dk(  r d|d<   d|v rd|d<   |j                  d       nd|d<   t        |t        |j                              D ]  \  }}d}|j	                  d	      }|d
k(  s|dk(  rJ|dk(  r|d   dv rd|d<   nd
|d<   d|d<   n|dk(  r|dk(  rd|d<   d|d<   d|d<   d|d<   nvd|d<   d|d<   nj|dk(  r4|dk(  r|d   dv rd|d<   nd
|d<   d|d<   nGd|d<   d|d<   d|d<   d|d<   n1|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rd|d<   n|dv rt        |      r|dk7  rd}d|d<   d|v rft        ||v xr |d   ||   k7        }
|
r(t        j                  d |j                  ||   |d          t        |      r|dk(  rn|d   ||<   n|d   ||<   t        |      rU|dk(  rPd|d!<   d|d<   nE|d"k(  r$|dk(  rt        j                  d#|       n$||v |d$<   nt        d%|d&|j                  d'      |j	                  d(      d"k(  s|dk(  rd"|d)<   d|d$<    d*}d*}t        |t        |j                              D ]  \  }}|j	                  d	      }d+|v r/|dk(  rt        |      r	|d+   |d,<   n|d+   |d-<   n|dk7  r|d+   |d.<   |d/v r|dk7  r|r|d   dk7  rd|d0<   d|t        v rm|dv srt        |      r]|d1z   }|d2   d3|d4   }|d5k(  r|dk(  r||d6<   nq||d7<   nk|d1k(  r|dk(  r||d8<   n[||d9<   nU|dk(  r	||d:|z  <   nG|d9xx   d;|z   z  cc<   n6|d1z   }|d5k(  rd<n
t        |      }|d2   |d=|z   <   t        |d4         |d>|z   <   d?|v r)|dk7  r$d|d@<   t        |d?         r	|d?   |dA<   n|d?   |dB<   dC|v r|dk7  rd;j!                  |dC         |dD<   dE|v sc|dk7  sjt        |dE         dFkD  r-t        j                  dG|j                  t        |dE                t        |dE   d dF d1      D ]  \  }}||dHt        |      z   <     y )INr   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   zUnknown subnet type 'z' found for interface ''r   r   r   metricIPV6_ROUTE_METRICIPV4_ROUTE_METRICr   r  r  DHCLIENT_SET_DEFAULT_ROUTEro   r   r   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)rP   	enumerater"   r   rK   r   r_   LOGwarningr   debugr   r	   ra   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ks                   r'   _render_subnetszRenderer._render_subnets  s    V%-Ik"9$)/	+&x(%+Ik" #7#i6H6H2IJ u	0IAvG **V,Kg%8N)NV# -1BB17	+. 29	+.2;I./v%#99+/Ii(,0Ij)16Io.6:I23,0Ij)+/Ii( 77V# -1BB17	+. 29	+.28I./,0Ij) 26Io.+/Ii( 48I/0,V# -1BB17	+. 29	+.28I./,0Ij)15Io. 11(5)/	+&V# $+<<18	+. 55 "&)f.>(G,0Ij)F?#'9, @"5MYw-??$L $J%NN%g."5M &f-!V+ !17Ig.-3E]	'*!&)f.>8=I4516Io.(V#II@+N +2Y*>Ih' "INN4  zz)$0V#-5Ik**/Ih'ku	0p 

"7#i6H6H2IJ E	6IAv **V,K6!V#%f-9?9I	"569?9I	"56v%*0*:Ih'// V#(Y{-Cv-MBG	">? 22 55!&)!+aJ+1)+<fX>N OI!Q!V+3<Ii04=Ij1#q!V+5>Ik2@II&<=!V+CLIlZ&?@%&<= #i= ",aJ!+q2c*oD17	1BIho.2Ix(3Ii$./ &6V+;,0Ij)&vi'896<Y6G	"23/5i/@	),6)f.>*-((6,3G*HIh'$.6V3C6"3459		/%NN'8 9:	 !*&1B*CBQ*G K 6145	%#a&.16IE	6r)   c                    |dk(  ry t        |t        |j                              D ]X  \  }}|j                  d      }|j                  dg       D ]+  }|j                  d      xs t	        |d         }	t        |      r|t        vr|j                  d      r|j                  s|j                  d      r$|j                  rt        d|j                  z        d	|d
<   |d   dv rd	|d<   d|v r!|	r|d   |d<   d	|_        n|d   |d<   d	|_        d|v s|dk(  rt        |      r	|d   |d<   |d   |d<   |d   |d<   dD ]"  \  }
}|
|v s| |j                   }||
   ||<   $ |xj                  dz  c_        . [ y )Nr   r  r   r   r   r+  r   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   ro   )r3  r"   r   rK   r
   r0   r	   rr   rs   r   r   r   rq   )r  r  	route_cfgr7  r   _r9  r;  r.   is_ipv6r	  new_namer  s                r'   _render_subnet_routeszRenderer._render_subnet_routesj  s   
 V"7#i6H6H2IJ ?	,IAv **V,KHb1 =, **V, )$1 &e,#+== 

6*y/M/M

6*y/M/M(=@IP  -1Ij) -1BBBF	">? E)":?	:JI&67=AI:383CIi0=AI:5(!V+-f5AF$,B"	*= > BG$,B"	*= > 38/Ih/
. 	@) #e+)1
93E3E2F&GG16wIg.	@ &&!+&{=,?	,r)   c                 T   g }| j                   D ]f  \  }}||j                  dd      g}|D ]H  }||v s||   }t        |t        t        f      rdj                  |      }|j                  ||z          f h |r/|dk(  rdj                  |      |d<   y dj                  |      |d<   y y )NrG  -r   r   BONDING_MODULE_OPTSBONDING_OPTS)bond_tpl_optsr   r^   tupler   r#   append)	r  r  r  r   	bond_optsbond_key	value_tpl	bond_keys
bond_values	            r'   _render_bonding_optszRenderer._render_bonding_opts  s    	#&#4#4 		Hi!8#3#3C#=>I% u$!&xJ!*udm<%(XXj%9
$$Y*%=>		 
 4788I3F	/0 -0HHY,?	.) r)   c                 0   |j                  t        j                  d            D ]o  }|j                  d      xs |d   }|j                  dg       }||   }|j                  }| j                  |||j                  |       | j                  ||||       q y )Nr   	config_idr   r7  )iter_interfacesr   filter_by_typerK   r   rC  r8  rJ  )	r  network_stateiface_contentsr   r  r   iface_subnetsr  rF  s	            r'   _render_physical_interfacesz$Renderer._render_physical_interfaces  s     #22##J/
 	E ;/@5=J!IIi4M&z2I!((I//	 %%9mV	r)   c                 L   t        j                  d      }t        j                  d      }|j                  |      D ]`  }|d   }||   }| j	                  |||       |g}	|	j                  |j                         |	D ]  }
d|
d<   |dk7  sd|
_         |j                  d      r.|dk(  r|j                  d      |d<   n|j                  d      |d	<   |j                  d
g       }|j                  }| j                  |||j                  |       | j                  ||||       t        |j                  |      D cg c]  }|d   |k(  r|d    c}      }t        |      D ]9  \  }}|dk(  rd|z  }nd|z  }|||<   ||   }|dk(  rd|d<   d|d<   0||d<   d|d<   ; c y c c}w )Nr   zbond-masterr   TBONDING_MASTERr   r   r   MACADDRr7  zBONDING_SLAVE_%szBONDING_SLAVE%sr   r   hotplugr   MASTERSLAVE)r   r[  filter_by_attrrZ  rW  extendr   r   rK   r   rC  r8  rJ  r\   r3  )r  r\  r]  r   bond_filterslave_filterr  r   r  master_cfgs
master_cfgr^  rF  slave_ifacebond_slavesr   
bond_slaveslavestr	slave_cfgs                      r'   _render_bond_interfacesz Renderer._render_bond_interfaces  s   --f5..}="22;? 9	.EvJ&z2I$$Yv> %+Ky112) -
/3
+,V#&,JO-
 yy'V#*/))M*BIh'+099]+CIi(!IIi4M!((I//	 %%9mV ! (5'D'D$(# #=1Z?	  'K &/{%; .!zV#1E9H058H&0	(#*:6	V#-3Ik*-6Ik**4Ih')-Ig&.Y9	.Fs   ;F!
c           	         t        j                  d      }|j                  |      D ]  }|d   }||   }|dk(  r0|j                  d      }|r||d<   |d |j	                  d       |d<   nPd|d	<   d|_        |d
   }	t        |	|d         }
||
vr't        j                  d||	dj                  |
             |	|d<   |j                  dg       }|j                  }| j                  |||j                  |       | j                  ||||        y )Nr   r   r   vlan_idVLAN_ID.ETHERDEVICETVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %sr   PHYSDEVr7  )r   r[  rZ  rK   rfindr   _supported_vlan_namesr4  r  r#   r   rC  r8  rJ  )r  r\  r]  r   vlan_filterr  r   r  rs  rdev	supportedr^  rF  s                r'   _render_vlan_interfacesz Renderer._render_vlan_interfaces"  s8   --f5"22;? "	EvJ&z2I))I.+2Ii(+56M
8H8H8M+N	-($(	&!!'	./1$i8HI	Y.HH1"+ (,	)$!IIi4M!((I//	 %%9mVA"	r)   c                    g }g }| j                         D ]|  }|d   D ]3  }d|v r|j                  |d          d|v s |j                  |d          5 d|v sC||d   d   D cg c]  }||vr|
 c}z  }||d   d   D cg c]  }||vr|
 c}z  }~ | j                  r!|| j                  D cg c]  }||vr|
 c}z  }| j                  r!|| j                  D cg c]  }||vr|
 c}z  }t	        t        |      t        |      g      sy t        j                  d      }	|rGt        j                  j                  |      r(t        j                  t        j                  |            }	|D ]  }|	j                  |        |D ]  }
|	j                  |
        t        d      }t!        |	      }|j#                  |      s|d	z   |z   }|S c c}w c c}w c c}w c c}w )
Nr7  r0  r.  dnsnameserversr4   r   ;r    )rZ  rg  r0  dns_searchdomainsanyr"   r   
ResolvConfosr   isfiler   load_text_fileadd_nameserveradd_search_domainr(   ra   r5   )r\  existing_dns_pathfound_nameserversfound_dns_searchr  r9  r  r4   
nameservercontentsearchdomainheadercontent_strs                r'   _render_dnszRenderer._render_dnsI  sJ    "224 	E	* B$.%,,V4E-FG6)$++F<,@AB ~!$U|M:&"33 & !
 !"',x"8%%55 %  	2 (("/"?"?"%66 " 
 **+==!!11 !  %&$%
 ((,0A!B!,,##$56G , 	/J"":.	/, 	4L%%l3	4c"'l%%f- 4-+5Kc&
%"!s   #G G/GGc                    d}t        j                  d      }| j                         D ]4  }|d   D ]  }d|v sd|v sd} n |rd|v s!|d   d   s	|d   d	   s2d} n | j                  s| j                  s|r|j                  d
dd       |sy dj                  t               ddj                  |j                               dg      }|S )NFr   r7  r0  r.  Tr  r  r4   mainr   r    )	r   NetworkManagerConfrZ  r0  r  set_section_keypairr#   r(   r[   )r\  r   	iface_dnsr  r  r9  outs          r'   _render_networkmanager_confz$Renderer._render_networkmanager_conf  s    	%88<"224 	E	* $.,&2H $I
 UN5\-0E%L4J 		, ))..''v>gg|~tTYYw}}-GNO
r)   r\  c                    | j                   |   j                         D ci c]  \  }}|j                  d      r|| }}}t        j                  d      }|j                  |      D ]m  }|d   }	||	   }
|dk7  rd|
_        |j                         D ]  \  }}||v s||   |
|<    |dk(  r d|
v r|
j                  d      rd|
d<   nd|
d<   |j                  d      rd}|dk(  rd	}|j                  d      |
|<   |dk(  r8|j                  d
g       r&ddj                  |j                  d
            z  |
d<   |j                  d
g       D ]:  }||   }|g}|j                  |j                         |D ]  }|	}|dk(  rd}||d<    < |j                  dg       }|
j                  }| j                  |
||j                  |       | j                  |
|||       p y c c}}w )Nr   r   r   r   onoffr   rb  	LLADDRESSbridge_portsz%sr   BRIDGE_PORTSr;   r  r7  )r  itemsr5   r   r[  rZ  r   rK   r#   rg  r   r   rC  r8  rJ  )r  r\  r]  r   old_knew_kbridge_key_mapbridge_filterr  r   r  r	  r  rE   bridged_iface_namebridged_cfgbridged_cfgs
bridge_cfgbridge_valuer^  rF  s                        r'   _render_bridge_interfacesz"Renderer._render_bridge_interfaces  s6    !$ 0 0 8 > > @
u) 5L
 

 !//9"22=A 2	EvJ&z2I!)	$2$8$8$: 8 e#).wIg&8 9, }}\226	,/27	,/yy'V#%C!&=!9	#99^R004sxx		.18 1In- ',ii&C 
8" --?@ +}##K$8$89". 8J#-L'',+7Jx(	8
8 "IIi4M!((I//	 %%9mVa2	
s   Gc                    t        j                  d      }|j                  |      D ]c  }|d   }||   }d|_        |j	                  dg       }|j
                  }	| j                  |||j                  |       | j                  ||	||       e y )Nr   r   r7  )	r   r[  rZ  r   rK   r   rC  r8  rJ  )
r  r\  r]  r   	ib_filterr  r   r  r^  rF  s
             r'   _render_ib_interfaceszRenderer._render_ib_interfaces  s    ++L9	"229= 	EvJ&z2I)IN!IIi4M!((I//	 %%9mV	r)   c                    |s| j                   }i }|j                         D ]r  }|d   dk(  r|j                  d      xs |d   }t        |d   ||      }|dk(  r"|j	                  d       |j	                  d       | j                  |||       |||<   t | j                  |||       | j                  |||       | j                  |||       | j                  |||       | j                  |||       i }	|j                         D ]  \  }
}|s|j                  rN|j                         |	|j                  <   |j                  D ]"  }|s|j                         |	|j                  <   $ |j                  sot!        |j                  j"                  |j                  j$                  gdd	g      D ](  \  }}||	vs|j                  j                  |      |	|<   *  |	S )
z3Given state, return /etc/sysconfig files + contentsr   loopbackrY  r   r   r   r   r   r   )r   rZ  rK   r   rP   r  r_  rq  r~  r  r  r  r   rd   r   r   zipr   r   )r  ry   r\  r   r   r]  r  rY  r  contentsr   cpathr   s                r'   _render_sysconfigzRenderer._render_sysconfig  s    I24"224 	2EV}
*"YY{3DuV}I$f/I x(v&$$UIv>(1N9%	2 	''~vN##M>6J##M>6J%%m^VL!!-H%3%9%9%; 	L!J	I..+4+>+>+@(!*!3!3 II 3<3F3F3H0I $'%%//1A1A1K1KLV$% LLE5 H,*3*:*:*D*DU*KL	L r)   returnc                    |s| j                   }d}t        j                  || j                        }| j	                  ||| j
                  |      j                         D ]  \  }}t        j                  |||        | j                  rLt        j                  || j                        }| j                  ||      }	|	rt        j                  ||	|       | j                  rKt        j                  || j                        }
| j                  ||      }|rt        j                  |
||       | j                  rJ| j                  |      }t        j                  || j                        }t        j                  |||d       t        j                  ||j                  d            }|j!                  d      rt        j"                  t$        j&                  j)                  |             t+               dg}|j,                  r"|j/                  d	       |j/                  d
       t$        j&                  j1                  |      rit        j2                  |      j5                         D ]C  t7        fddD              rt+               j5                         vs3|j/                         E t        j                  |dj9                  |      dz   |       y y )Ni  )r   )r  T)r  modepreserve_moder   r,   zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=noc              3   &   K   | ]  }|v  
 y wr>   r-   ).0settinglines     r'   	<genexpr>z0Renderer.render_network_state.<locals>.<genexpr>h  s        ' $tO s   )
NETWORKINGNETWORKING_IPV6r  r    )r   r   target_pathr   r  r   r  r   
write_filer   r  r   r  r   _render_persistent_netrK   r6   
ensure_dirr  r   dirnamer(   use_ipv6rQ  existsr  
splitlinesr  r#   )rB   r\  r   target	file_modery   r   datar   resolv_contentr   nm_conf_contentnetrules_contentr   sysconfig_pathnetcfgr  s                   @r'   render_network_statezRenderer.render_network_state2  si    I	++FD4D4DE00mT[[I 1 

%'	3JD$ OOD$	2	3 ==''>H!-- . N .)D((++55L #>>yO oyI#::=I ,,VT5G5GHMOO("	 ))&)--	2JK""9-OOBGGOON;<"n&67F%%3401 ww~~n- //?JJL ,D  ,   !(A(A(CCd+, OO		& 1D 8)1 .r)   r>   )NN)rh   ri   rj   rk   r  r  rP  rO  r   dict__annotations__rC   classmethodr  rC  rJ  rW  r_  rq  r~  staticmethodr  r  r   r  r  r  r   r  r-   r)   r'   r   r   4  s   A 

 'V<N 0%!'#
 '0!2#
L* 	
M( It3& 0 02 J6 J6X E, E,N @ @4  * <. <.| $ $L @ @D # #J <(< <|  $  + $+ +` %)	D#D D>D
 
Dr)   r   c           	      `    dD cg c]  }|j                  | t        |              c}S c c}w )ziReturn list of supported names for vlan devices per RHEL doc
    11.5. Naming Scheme for VLAN Interfaces.)z{rdev}{vid:04}z{rdev}{vid}z{rdev}.{vid:04}z{rdev}.{vid})r|  vid)formatint)r|  r  vs      r'   rz  rz  y  s5    

 	
dC)  s   #+c                 p    t        j                         d   t        vryt        |       ryt	        |       ryy)NvariantFT)r   system_infoKNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rhr  s    r'   	availabler    s4    )$M96"V$r)   c                 T    t        j                   t        j                  | d            S )Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globr   r  r  s    r'   r  r    s)     99I	
 r)   c                     ddg}ddg}|D ]  }t        j                  |||       r y ddg}|D ]7  }t        j                  j	                  t        j
                  | |            s7 y	 y)
Nifupifdownz/sbinz	/usr/sbin)r4   r  Fz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)r   whichr  r   r  r  )r  expectedr4   pexpected_pathss        r'   r  r    s}    !H{#F zz!F6:
 	:N  77>>$**6156 r)   )#r>   )&r~   r  rY   loggingr  r3   typingr   r   	cloudinitr   r   cloudinit.distros.parsersr   r   cloudinit.netr	   r
   r   r   r   cloudinit.net.network_stater   	getLoggerrh   r4  r  r(   r0   r8   r:   rm   r   r   rz  r  r  r  r-   r)   r'   <module>r     s      	  	 	 !   F  5g!$
E
3# 3#lkI k\G9 GTBx   BJr)   