
    }f                     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)Mapping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                  |      st        | 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                  d|z            }
|j	                  dt        |      z   dt        |
      d       h|dk(  so| 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   sW   ((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(U2B'C#DL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                   `   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#        Zed$        Ze	 d)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           	      L   |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k7  r|d+   |d,<   |d-v r|dk7  r|r|d   dk7  rd|d.<   B|t        v rK|dv sPt        |      r]|d/z   }|d0   d1|d2   }|d3k(  r|dk(  r||d4<   nq||d5<   nk|d/k(  r|dk(  r||d6<   n[||d7<   nU|dk(  r	||d8|z  <   nG|d7xx   d9|z   z  cc<   n6|d/z   }|d3k(  rd:n
t        |      }|d0   |d;|z   <   t        |d2         |d<|z   <   d=|v r)|dk7  r$d|d><   t        |d=         r	|d=   |d?<   n|d=   |d@<   dA|v r|dk7  rd9j!                  |dA         |dB<   dC|v sA|dk7  sHt        |dC         dDkD  r-t        j                  dE|j                  t        |dC                t        |dC   d dD d/      D ]  \  }}||dFt        |      z   <     y )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   zUnknown subnet type 'z' found for interface ''r   r   r   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 @	6IAv **V,K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6@	6r)   c                    |dk(  ry t        |t        |j                              D ]6  \  }}|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   |d<   dD ]"  \  }
}|
|v s| |j                   }||
   ||<   $ |xj                  dz  c_         9 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   )netmaskr   )r,   r   ro   )r1  r"   r   rK   r
   r0   r	   rr   rs   r   r   rq   )r  r  	route_cfgr5  r   _r7  r9  r.   is_ipv6r	  new_namer  s                r'   _render_subnet_routeszRenderer._render_subnet_routese  s   
 V"7#i6H6H2IJ 5	,IAv **V,KHb1 3, **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(.3Ho	(+
. 	@) #e+)1
93E3E2F&GG16wIg.	@ &&!+&g3,5	,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 )NrE  -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    	%(%6%6 		!Xy!8#3#3C#=>I% u$!&xJ!*udm<%(XXj%9
$$Y*%=>		 
 4788I3F	/0 -0HHY,?	.) r)   c                    t         j                  }|j                  |      D ]\  }|d   }|j                  dg       }||   }|j                  }	| j                  |||j                  |       | j                  ||	||       ^ y )Nr   r5  )r   filter_by_physicaliter_interfacesrK   r   rA  r6  rH  )
r  network_stateiface_contentsr   physical_filterr  r   iface_subnetsr  rD  s
             r'   _render_physical_interfacesz$Renderer._render_physical_interfaces  s     #55"22?C 	Ev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   MACADDRr5  zBONDING_SLAVE_%szBONDING_SLAVE%sr   r   hotplugr   MASTERSLAVE)r   filter_by_typefilter_by_attrrX  rU  extendr   r   rK   r   rA  r6  rH  r\   r1  )r  rY  rZ  r   bond_filterslave_filterr  r   r  master_cfgs
master_cfgr\  rD  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   PHYSDEVr5  )r   rd  rX  rK   rfindr   _supported_vlan_namesr2  r  r#   r   rA  r6  rH  )r  rY  rZ  r   vlan_filterr  r   r  rr  rdev	supportedr\  rD  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 )
Nr5  r.  r,  dnsnameserversr4   r   ;r    )rX  rf  r.  dns_searchdomainsanyr"   r   
ResolvConfosr   isfiler   load_text_fileadd_nameserveradd_search_domainr(   ra   r5   )rY  existing_dns_pathfound_nameserversfound_dns_searchr  r7  r  r4   
nameservercontentsearchdomainheadercontent_strs                r'   _render_dnszRenderer._render_dns9  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                     t        j                  d      }| j                  r|j                  ddd       t	        |      dk(  ry dj                  t               ddj                  |j                               dg      }|S )Nr   mainr  r   r   r    )r   NetworkManagerConfr.  set_section_keypairr"   r#   r(   r[   )rY  r   r  outs       r'   _render_networkmanager_confz$Renderer._render_networkmanager_conf|  sk    %88< ((''v>w<1gg|~tTYYw}}-GNO
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   r`  	LLADDRESSbridge_portsz%sr   BRIDGE_PORTSr;   r  r5  )r  itemsr5   r   rd  rX  r   rK   r#   rf  r   r   rA  r6  rH  )r  rY  rZ  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\  rD  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   r5  )	r   rd  rX  r   rK   r   rA  r6  rH  )
r  rY  rZ  r   	ib_filterr  r   r  r\  rD  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 ]\  }|d   dk(  r|d   }t        |||      }|dk(  r"|j                  d       |j                  d       | j	                  |||       |||<   ^ | 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   loopbackr   r   r   r   r   r   )r   rX  r   rP   r  r]  rp  r}  r  r  r  r   rd   r   r   zipr   r   )r  ry   rY  r   r   rZ  r  r   r  contentscpathr   s               r'   _render_sysconfigzRenderer._render_sysconfig  s   
 I57"224 
	3EV}
*vJ$Z1A9MIx(v&$$UIv>)2N:&
	3 	''~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)   rY  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      rt        j"                  t$        j&                  j)                  |             t+               dg}|j,                  r"|j/                  d	       |j/                  d
       t        j                  |dj1                  |      dz   |       y y )Ni  )r   )r  T)r  modepreserve_moder   r,   zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=nor    )r   r   target_pathr   r  r   r  r   
write_filer   r  r   r  r   _render_persistent_netrK   r6   
ensure_dirr  r   dirnamer(   use_ipv6rO  r#   )rB   rY  r   target	file_modery   r   datar   resolv_contentr   nm_conf_contentnetrules_contentr   sysconfig_pathnetcfgs                   r'   render_network_statezRenderer.render_network_state  s    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OO		& 1D 8) .r)   r>   )NN)rh   ri   rj   rk   r  r  rN  rM  r   dict__annotations__rC   classmethodr  rA  rH  rU  r]  rp  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 E6 E6N ;, ;,z @ @4  ( <. <.| $ $L @ @D  & : :x  $ @D% %T %)	2#2 D>2
 
2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'   ry  ry  =  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  K  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  U  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   r2  r  r(   r0   r8   r:   rm   r   r   ry  r  r  r  r-   r)   r'   <module>r     s      	  	 	 $   F  5g!$
E
3# 3#lkI k\G9 GTFx   FRr)   