
    ܍~c
                     L   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	 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j!                  Z!d Z"ddZ#dS )    N)MappingOptional)log)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openmandrivarhelrockysuse	virtuozzo#c                     ddg}t          dt          |                    D ]!}||         r| dz   ||         z   ||<   | ||<   "d                    |          S )NzBCreated by cloud-init on instance boot automatically, do not edit. r    
)rangelenjoin)seplinesis      9/usr/lib/python3/dist-packages/cloudinit/net/sysconfig.py_make_headerr(   &   sq    L
E 1c%jj!!  8 	Sy58+E!HHE!HH99U    c                 2    d}| d         dk    o	| d         |v S )N)z::z0.0.0.0prefixr   network )routedefault_netss     r'   _is_default_router0   3   s%    $L?aDE)$4$DDr)   c                     t          j        d|           r1|                     d          r|                     d          r| S d| z  S | S )Nz\s"z"%s")research
startswithendswith)values    r'   _quote_valuer8   8   sS    	y C   	"U^^C%8%8 	"LE>!r)   c                   X    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dS )	ConfigMapz!Sysconfig like dictionary object.yesno)TFc                     i | _         d S N_confselfs    r'   __init__zConfigMap.__init__L   s    


r)   c                     || j         |<   d S r>   r?   )rB   keyr7   s      r'   __setitem__zConfigMap.__setitem__O   s    
3r)   c                     | j         |         S r>   r?   rB   rE   s     r'   __getitem__zConfigMap.__getitem__R   s    z#r)   c                 6    | j                             |          S r>   )r@   getrH   s     r'   rK   zConfigMap.getU   s    z~~c"""r)   c                     || j         v S r>   r?   rH   s     r'   __contains__zConfigMap.__contains__X   s    dj  r)   c                 <    | j                             |d            d S 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__^   s    4:r)   c                     dS )z6Skip the pair key, value if it matches a certain rule.Fr-   rB   rE   vals      r'   skip_key_valuezConfigMap.skip_key_valuea   s    ur)   c                 @   t          j                    }|                    t                                 | j        r|                    d           t          | j                                                  D ]}| j        |         }|                     ||          r&t          |t                    r| j
        |         }t          |t                    st          |          }|                    |dt          |          d           |                                S )Nr    =)ioStringIOwriter(   r@   sortedkeysrV   
isinstancebool	_bool_mapstrr8   getvalue)rB   bufrE   r7   s       r'   	to_stringzConfigMap.to_stringe   s    kmm		,..!!!: 	IIdOOO$*//++,, 	> 	>CJsOE""3.. %&& .u-eS)) #E

II333U(;(;(;(;<====||~~r)   c                 :    | j                             |           d S r>   )r@   update)rB   updatess     r'   rf   zConfigMap.updateu   s    
'"""""r)   N)__name__
__module____qualname____doc__r`   rC   rF   rI   rK   rM   rP   rR   rV   rd   rf   r-   r)   r'   r:   r:   C   s        ++  I
         # # #! ! !" " "       # # # # #r)   r:   c                   b     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| _        || _        || _        || _        || _	        d S )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__|   s\    eT##%%%$)!$)!%!1!)!)r)   c                     t          | 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   sb    """	
 
 *//##]
!%!:!%!:r)   c                 0    | j         | j        | j        dz  S N)basename)rv   ru   rt   rA   s    r'   	path_ipv4zRoute.path_ipv4   #    %+T5EFF
 	
r)   c                 0    | 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)   ipv4c                    |dvrt          dt          |          z            t          j                    }|                    t                                 | j        r|                    d           d}t          | j                                                  D ]0}d|vr|	                    dd          }t          | j        |                   }t          | j        d|z                      }|dk    rE| 
                    |          s/t          | j        d	|z                      }|d
z   }|                    dt          |          z   dt          |          d           |                    dt          |          z   dt          |          d           |                    d	t          |          z   dt          |          d           d|z   }	|	| j        v rUt          | j        d|z                      }
|                    dt          |          z   dt          |
          d           |dk    r| 
                    |          rtt          | j        d|                    }d|z   | j        v r dt          | j        d|z                      z   nd}
|                    |d|d|d|
d| j        d
           2|                                S )N)r   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   s   (((4E

CDDDkmm		,..!!!: 	IIdOOO $*//++,, 5	 5	C##KK	2..E
300M
9u+< =>>M t'9'9-'H'H #DJy5/@$A B B!A+		 3w<<///m1L1L1L1LN   		 3w<<///m1L1L1L1LN   		 3w<<///m1L1L1L1LN   &-
++#&tz(U2B'C#D#DLII#c'll222L4N4N4N4NP   &T%7%7%F%F"4:.>u.>.>#?@@  %'4:55 DJx%/?$@ A AAA 
 		 &$%$(((	 	 	 ||~~r)   )r   )rh   ri   rj   rk   rC   r~   propertyr   r   r   rd   __classcell__r|   s   @r'   rm   rm   y   s        ++* * * * *   
 
 X

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

  B B B B B B B 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vlanr   c                    t          t          |                                            g | _        || _        | j                            d          }t          |||                    d          |                    d                    | _        | j                            d          | _        || _	        || _
        || j        d<   || _        d S )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!!**,,,"N&&'899	]]6**]]6**	
 
 
 !N../@AA	%)
8!1r)   c                     | j         S r>   )r   rA   s    r'   r   zNetInterface.name  s    r)   c                 (    || _         || j        d<   d S )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
    zr)   c                 n    || j         vrt          |          || _        | j         |         | j        d<   d S )NTYPE)iface_typesr   r   r@   )rB   r   s     r'   r   zNetInterface.kind  s?    t'''T"""
!-d3
6r)   c                 0    | j         | j        | j        dz  S r   )r   ru   r   rA   s    r'   pathzNetInterface.path  s"     +TY??
 	
r)   Fc                    t          | j        | j        | j        | j                  }| j                                        |_        |rt          | j                  |_        |r| j	                                        |_	        |S )N)r   )
r   r   ru   r   r   r@   r~   listr   r   )rB   copy_childrencopy_routescs       r'   r~   zNetInterface.copy   sx    It-t~DJ
 
 
 *//## 	-dm,,AJ 	*{''))AHr)   c                 "    |dk    r|dk    rdS dS )Nr   r   TFr-   rT   s      r'   rV   zNetInterface.skip_key_value+  s    &==SF]]4ur)   )r   )FF)rh   ri   rj   rk   r   rC   r   r   setterr   r   r~   rV   r   r   s   @r'   r   r      s       OO " K =G2 2 2 2 2 2(     X  
[* * [*   X 
[4 4 [4 
 
 X

	 	 	 	      r)   r   c                      e Zd ZU dZd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dS )+Rendererz7Renders network information in a /etc/sysconfig format.TFnone)ONBOOTUSERCTLNM_CONTROLLED	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                    |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   )rK   r   r   r   r   r   r   )rB   confignm_conf_paths      r'   rC   zRenderer.__init__n  s     	F!::m_EE#ZZG
 
 

:/@AAE(.

&)
 )
% zz),,%zz*;<<%zz*;<<
 

 jj622r)   c                 x   t          j        | j                            |i                     }|                    |           dD ]Q}|                    |          }|8|dk    r|d         dvr*| j        |                             |          }|r|||<   Rd|v r|d         r|d         dk    rd|d<   d S d S d S d S )	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(JKK))): 	3 	3G		'**I$m++f F 1 1 *6266w?? 3)2Ig& 5  k" !f++(/In%%%	 !   ++r)   c           	      	   |dk    r$d|d<   d|v rd|d<   |                     d           nd|d<   t          |t          |j                            D ]U\  }}d}|                    d	          }|d
k    s|dk    rR|dk    r|d         dk    rd|d<   nd
|d<   d|d<   n|dk    r|dk    rd|d<   d|d<   d|d<   d|d<   nd|d<   d|d<   n|dk    r:|dk    r|d         dk    rd|d<   nd
|d<   d|d<   nd|d<   d|d<   d|d<   d|d<   no|dk    r0|dk    r|d         dk    rd|d<   nd
|d<   d|d<   nEd|d<   d|d<   n9|dv r&|d         }	d|d<   |dk    r|dk    r|	d
k    rd|d<   n|dv rt          |          r|dk    rd}d|d<   d|v rt          ||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<   nK|d k    r*|dk    rt          
                    d!|           n#||v |d"<   nt          d#|d$|j	        d%          |                    d&          d k    r|dk    rd |d'<   Pd|d"<   Wd(}d(}t          |t          |j                            D ]\  }}|                    d	          }d)|v r|dk    r|d)         |d*<   |d+v r|dk    r|r|d         dk    rd|d,<   N|t          v rX|dv rt          |          rk|d-z   }|d.         d/|d0         }|d1k    r|dk    r||d2<   n||d3<   n|d-k    r|dk    r||d4<   nn||d5<   nh|dk    r	||d6|z  <   nY|d5xx         d7|z   z  cc<   nE|d-z   }|d1k    rd8nt          |          }|d.         |d9|z   <   t          |d0                   |d:|z   <   d;|v r7|dk    r1d|d<<   t          |d;                   r|d;         |d=<   n|d;         |d><   d?|v r$|dk    rd7                    |d?                   |d@<   dA|v r|dk    rt          |dA                   dBk    r4t          
                    dC|j	        t          |dA                              t          |dA         d dB         d-          D ]\  }}||dDt          |          z   <   d S )ENr   r   r   BRIDGEdhcpr   startr   r   dhcp6zipv6_dhcpv6-statefuldhcp4managedDHCLIENT6_MODEr   TDHCPV6CIPV6INITFIPV6_AUTOCONFzipv6_dhcpv6-statelessinfoz-SDHCPV6C_OPTIONS
ipv6_slaac)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  sa    V%-Ik"9$$)/	+&x(((%+Ik" #7#i6H2I2IJJJ u	0 u	0IAvG **V,,Kg%%8N)N)NV## -8817	+.. 29	+.2;I.// f$$8N)N)N-3Ik*+/Ii(,0Ij)16Io..,0Ij)+/Ii(( 777V## -8817	+.. 29	+.28I.//,0Ij) 26Io.+/Ii( 48I/00,,V## -8817	+.. 29	+.28I.//,0Ij)15Io.. 111(5)/	+&V##w(>(> $w..18	+. 555 "&)) 1f.>.>(G,0Ij)F??#'9, @"5MYw-??$ $L $ J%N%g."5M   &f-- ;!V++ !17Ig..-3E]	'*!&)) 7f.>.>8=I4516Io.((V##II@+NNNN +2Y*>Ih'' j"{{INNN4   zz)$$00V##-5Ik***/Ih' 

"7#i6H2I2IJJJ @	6 @	6IAv **V,,K6!!V##*0*:Ih'/// V##( HY{-Cv-M-MBG	">? 222 555!&)) !+aJ+1)+<+<+<fX>N>N OI!Q!V++3<Ii004=Ij11#q!V++5>Ik22@II&<==!V++CLIlZ&?@@%&<=== #i==== ",aJ!+q22c*ooD17	1BIho.2Ix(3 3Ii$./ &&6V+;+;,0Ij)&vi'899 A6<Y6G	"233/5i/@	),6))f.>.>*-((6,3G*H*HIh'$..6V3C3C6"345599		/%N'8 9::	   !*&1B*CBQB*G K K 6 6145	%#a&&.11A@	6 @	6r)   c                    |dk    rd S t          |t          |j                            D ]H\  }}|                    d          }|                    dg           D ]}|                    d          pt	          |d                   }	t          |          r|t          vr|                    d          r|j        s|                    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 r|d         |d<   dD ]\  }
}|
|v r| |j         }||
         ||<    |xj        dz  c_        Jd S )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_routesc  s   
 VF"7#i6H2I2IJJJ 5	, 5	,IAv **V,,KHb11 3, 3, **V,, )$1 1 &e,,,,#+=== 

6**/8/M 

6** 09/M
 )=@IP   -1Ij) -1BBBBF	">? E))" B:?	:JI&67=AI::383CIi0=AI:5((.3Ho	(+
. 	@ 	@) #e++)1&G93E&G&GG16wIg.&&!+&&&g3,5	, 5	,r)   c                    g }| j         D ]y\  }}||                    dd          g}|D ]Y}||v rS||         }t          |t          t          f          rd                    |          }|                    ||z              nZz|r:|dk    rd                    |          |d<   d S d                    |          |d<   d S d S )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 		 		!Xy!8#3#3C#=#=>I%  u$$!&xJ!*udm<< :%(XXj%9%9
$$Y*%=>>>E %  	@
 4788I3F3F	/000 -0HHY,?,?	.)))	@ 	@r)   c                    t           j        }|                    |          D ]d}|d         }|                    dg           }||         }|j        }	|                     |||j        |           |                     ||	||           ed S )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"22?CC 	 	EvJ!IIi44M&z2I!(I/	   %%9mV   	 	r)   c                 v   t          j        d          }t          j        d          }|                    |          D ]x}|d         |         }|                     |||           |g}|                    |j                   |D ]}	d|	d<   |dk    rd|	_        |                    d          r7|dk    r|                    d          |d<   n|                    d          |d	<   |                    d
g           }
|j	        }| 
                    ||
|j        |           |                     |||
|           t          fd|                    |          D                       }t          |          D ]>\  }}|dk    rd|z  }nd|z  }|||<   ||         }|dk    rd|d<   d|d<   4|d<   d|d<   ?zd S )Nr   bond-masterr   TBONDING_MASTERr   r   r   MACADDRr5  c                 8    g | ]}|d          k    |d         S )r_  r   r-   ).0slave_ifacer   s     r'   
<listcomp>z4Renderer._render_bond_interfaces.<locals>.<listcomp>  s=       # #=1Z??	  ' @??r)   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  master_cfgs
master_cfgr\  rD  bond_slavesr   
bond_slaveslavestr	slave_cfgr   s                    @r'   _render_bond_interfacesz Renderer._render_bond_interfaces  sR   -f55.}=="22;?? 9	. 9	.EvJ&z2I$$Yv>>> %+Ky1222) - -
/3
+,V##&,JOyy'' DV##*/))M*B*BIh''+099]+C+CIi(!IIi44M!(I/	   %%9mV   !   '4'D'D$( (   K &/{%;%; . .!zV##1E9HH058H&0	(#*:6	V##-3Ik*-6Ik***4Ih')-Ig&&.Y9	. 9	.r)   c           	      r   t          j        d          }|                    |          D ]}|d         }||         }|dk    r=|                    d          }|r||d<   |d |                    d                   |d<   ncd|d	<   d|_        |d
         }	t          |	|d                   }
||
vr0t                              d||	d	                    |
                     |	|d<   |                    dg           }|j
        }|                     |||j        |           |                     ||||           d S )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   ri  rX  rK   rfindr   _supported_vlan_namesr2  r  r#   r   rA  r6  rH  )r  rY  rZ  r   vlan_filterr  r   r  rv  rdev	supportedr\  rD  s                r'   _render_vlan_interfacesz Renderer._render_vlan_interfaces  s   -f55"22;?? "	 "	EvJ&z2I))I.. 3+2Ii(+56M
8H8H8M8M6M+N	-(($(	&!!'	./1$i8HII	Y..HH1"++   (,	)$!IIi44M!(I/	   %%9mV   A"	 "	r)   c                    t          t          | j                  t          | j                  g          sd S t	          j        d          }|rEt          j                            |          r&t	          j        t          j
        |                    }| j        D ]}|                    |           | j        D ]}|                    |           t          d          }t          |          }|                    |          s|dz   |z   }|S )Nr   ;r    )anyr"   r.  dns_searchdomainsr	   
ResolvConfosr   isfiler   	load_fileadd_nameserveradd_search_domainr(   ra   r5   )rY  existing_dns_pathcontent
nameserversearchdomainheadercontent_strs          r'   _render_dnszRenderer._render_dns7  s    M122M344
 
 	 4(,, 	P0A!B!B 	P!,T^<M-N-NOOG'7 	/ 	/J"":....); 	4 	4L%%l3333c""'ll%%f-- 	6 4-+5Kr)   c                 (   t          j        d          }| j        r|                    ddd           t	          |          dk    rd S d                    t                      dd                    |                                          dg          }|S )Nr   maindnsr   r   r    )r   NetworkManagerConfr.  set_section_keypairr"   r#   r(   r[   )rY  r   r  outs       r'   _render_networkmanager_confz$Renderer._render_networkmanager_confN  s    %8<<
 ( 	?''v>>>w<<14gg|~~tTYYw}}-G-GNOO
r)   c                    d | j         |                                         D             }t          j        d          }|                    |          D ]}|d         }||         }|dk    rd|_        |                                D ]\  }	}
|	|v r||	         ||
<   |dk    r$d|v r |                    d          rd|d<   nd|d<   |                    d          r"d	}|dk    rd
}|                    d          ||<   |dk    rD|                    dg           r.dd                    |                    d                    z  |d<   |                    dg           D ];}||         }|g}|                    |j	                   |D ]}|}|dk    rd}||d<   <|                    dg           }|j
        }|                     |||j        |           |                     ||||           d S )Nc                 D    i | ]\  }}|                     d           ||S )r   )r5   )rc  old_knew_ks      r'   
<dictcomp>z6Renderer._render_bridge_interfaces.<locals>.<dictcomp>_  sB     
 
 
u))
5
 
 
r)   r   r   r   r   onoffr   ra  	LLADDRESSbridge_portsz%sr   BRIDGE_PORTSr;   r  r5  )r  itemsr   ri  rX  r   rK   r#   rk  r   r   rA  r6  rH  )r  rY  rZ  r   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]  s   
 
 # 0 8 > > @ @
 
 

 !/99"22=AA 2	 2	EvJ&z2I!)	$2$8$8$:$: 8 8 e##).wIg&9,, }}\22 826	,//27	,/yy'' :V##%C!&=!9!9	#99^R00 04sxx		.118 8 1In- ',ii&C&C 
8 
8" --?@ +}##K$8999". 8 8J#-L''',+7Jx((	8 "IIi44M!(I/	   %%9mV   a2	 2	r)   c                 0   t          j        d          }|                    |          D ]k}|d         }||         }d|_        |                    dg           }|j        }	|                     |||j        |           |                     ||	||           ld S )Nr   r   r5  )	r   ri  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9	"229== 	 	EvJ&z2I)IN!IIi44M!(I/	   %%9mV   	 	r)   c                    |s| j         }i }|                                D ]t}|d         dk    r|d         }t          |||          }|dk    r*|                    d           |                    d           |                     |||           |||<   u|                     |||           |                     |||           |                     |||           |                     |||           | 	                    |||           i }	|
                                D ]\  }}|s|j        rD|                                |	|j        <   |j        D ] }|r|                                |	|j        <   !|j        rOt          |j        j        |j        j        gddg          D ]&\  }
}|
|	vr|j                            |          |	|
<   '|	S )	z3Given state, return /etc/sysconfig files + contentsr   loopbackr   r   r   r   r   r   )r   rX  r   rP   r  r]  rt  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4 
	3 
	3EV}
**vJ$Z1A9MMIx(((v&&&$$UIv>>>)2N:&&''~vNNN##M>6JJJ##M>6JJJ%%m^VLLL!!-HHH%3%9%9%;%; 	L 	L!J	 II. I+4+>+>+@+@(!*!3 I II  I3<3F3F3H3H0 L$'%/1A1KLV$% % L LLE5 H,,*3*:*D*DU*K*Kr)   rY  returnc                 x   |s| j         }d}t          j        || j                  }|                     ||| j        |                                          D ]\  }}t          j        |||           | j	        rIt          j        || j	                  }| 
                    ||          }	|	rt          j        ||	|           | j        rHt          j        || j                  }
|                     ||          }|rt          j        |
||           | j        rE|                     |          }t          j        || j                  }t          j        |||           t          j        ||                    d                    }|                    d          rt          j        t$          j                            |                     t+                      dg}|j        r*|                    d           |                    d           t          j        |d	                    |          d	z   |           d S d S )
Ni  )r   )r  r   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	+FD4DEE00mT[I 1 
 

%''	3 	3JD$ OD$	2222= 	E'>>H!-- .  N  E.)DDD( 	J+5 L #>>y O  JoyIII 	H#::=II ,VT5GHHMOM+;YGGG)&)--	2J2JKK""9-- 	OBGOON;;<<<"nn&67F% 234440111O		& 1 1D 8)    	 	r)   r>   )NN)rh   ri   rj   rk   r  r  rN  rM  r   dict__annotations__rC   classmethodr  rA  rH  rU  r]  rt  r  staticmethodr  r  r  r  r  r   r   r  r-   r)   r'   r   r   1  s}        AA "	
 
 'V<< N 0%!'#
 
 '0!2#
 
 L* E	
 	
 	
 M( It3 3 3 3& 0 0 [02 E6 E6 [E6N ;, ;, [;,z @ @ [@4   [( <. <. [<.| $ $ [$L    \,    \ : : [:x   [$ @D% % % [%T %)	- -#- D>-
 
- - - - - -r)   r   c                 $      fddD             S )ziReturn list of supported names for vlan devices per RHEL doc
    11.5. Naming Scheme for VLAN Interfaces.c                 X    g | ]&}|                     t                               'S )r  vid)formatint)rc  vr  r  s     r'   re  z)_supported_vlan_names.<locals>.<listcomp>  s?        	
dC))  r)   )z{rdev}{vid:04}z{rdev}{vid}z{rdev}.{vid:04}z{rdev}.{vid}r-   r  s   ``r'   r}  r}    s6        
   r)   c                    t          j                    d         t          vrdS ddg}ddg}|D ]}t          j        |||           s dS dd	g}|D ]7}t
          j                            t          j        | |                    r d
S 8dS )NvariantFifupifdownz/sbinz	/usr/sbin)r4   r  z/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)	r   system_infoKNOWN_DISTROSr   whichr  r   r  r  )r  expectedr4   pexpected_pathss        r'   	availabler    s    i(M99u!H{#F  z!F6::: 	55	 	:N   7>>$*615566 	44	5r)   )r   r>   )$r~   rY   r  r3   typingr   r   	cloudinitr   loggingr   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   r}  r  r-   r)   r'   <module>r     s)    				 				 				 $ $ $ $ $ $ $ $ $ $ $ $ $ $                 F F F F F F F F              5 4 4 4 4 4g!!   
 
 
 
E E E
  3# 3# 3# 3# 3# 3# 3# 3#lk k k k kI k k k\G G G G G9 G G GTQ Q Q Q Qx  Q Q Qh       r)   