Ë
    x[h3  ã                   óº   — d dl Z d dl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  e j                  e«      Z G d„ d«      Z G d	„ d
e	j"                  «      Zdd„Zy)é    N)ÚOrderedDict)ÚOptional)ÚsubpÚutil)ÚrendererÚshould_add_gateway_onlink_flag)ÚNetworkStatec                   ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)Ú	CfgParserc           
      ó4   — t        g g g g g g i dœ«      | _        y )N)ÚMatchÚLinkÚNetworkÚDHCPv4ÚDHCPv6ÚAddressÚRoute)r   Ú	conf_dict)Úselfs    ú8/usr/lib/python3/dist-packages/cloudinit/net/networkd.pyÚ__init__zCfgParser.__init__   s(   € Ü$àØØØØØØñó

ˆ�ó    c                 óR  — | j                   j                  «       D ]Š  }||k(  sŒ	| j                   |   j                  |dz   t        |«      z   «       t	        t
        j                  | j                   |   «      «      | j                   |<   | j                   |   j                  «        ŒŒ y )Nú=©r   ÚkeysÚappendÚstrÚlistÚdictÚfromkeysÚsort)r   ÚsecÚkeyÚvalÚks        r   Úupdate_sectionzCfgParser.update_section    sƒ   € Ø—‘×$Ñ$Ó&ò 	)ˆAØ�C‹xØ—‘˜qÑ!×(Ñ(¨¨s©´S¸³XÑ)=Ô>ä$(¬¯©°t·~±~ÀaÑ7HÓ)IÓ$J�—‘˜qÑ!Ø—‘˜qÑ!×&Ñ&Õ(ñ	)r   c                 ó°  — | j                   j                  «       D ]¹  }||k(  sŒ	|| j                   |   vrg | j                   |   |<   | j                   |   |   j                  |dz   t        |«      z   «       t	        t
        j                  | j                   |   |   «      «      | j                   |   |<   | j                   |   |   j                  «        Œ» y)z‹
        For each route section we use rid as a key, this allows us to isolate
        this route from others on subsequent calls.
        r   Nr   )r   r#   Úridr$   r%   r&   s         r   Úupdate_route_sectionzCfgParser.update_route_section(   sÂ   € ð
 —‘×$Ñ$Ó&ò 		.ˆAØ�C‹xØ˜dŸn™n¨QÑ/Ñ/Ø-/�D—N‘N 1Ñ% cÑ*Ø—‘˜qÑ! #Ñ&×-Ñ-¨c°C©i¼#¸c»(Ñ.BÔCä)-Ü—M‘M $§.¡.°Ñ"3°CÑ"8Ó9ó*�—‘˜qÑ! #Ñ&ð —‘˜qÑ! #Ñ&×+Ñ+Õ-ñ		.r   c                 ó”  — d}t        | j                  j                  «       «      D ]Ÿ  \  }}|sŒ	|dk(  r)t        |«      D ]  }|d|z   dz   z  }||dz   z  }|dz  }Œ Œ7|dk(  r<t        |«      D ]-  }|d|z   dz   z  }t        ||   «      D ]
  }||dz   z  }Œ |dz  }Œ/ Œx|d|z   dz   z  }t        |«      D ]
  }||dz   z  }Œ |dz  }Œ¡ |S )NÚ r   ú[z]
ú
r   )Úsortedr   Úitems)r   Úcontentsr&   ÚvÚeÚns         r   Úget_final_confzCfgParser.get_final_conf8   s  € ØˆÜ˜4Ÿ>™>×/Ñ/Ó1Ó2ò 	!‰DˆAˆqÙØØ�IŠ~Ü ›ò %�AØ  a¡¨%¡Ñ/�HØ  D¡Ñ(�HØ Ñ$‘Hñ%ð �g’Ü ›ò %�AØ  a¡¨%¡Ñ/�HÜ# A a¡D›\ò -˜Ø  A¨¡HÑ,™ð-à Ñ$‘Hñ	%ð ˜C !™G e™OÑ+�Ü ›ò )�AØ  D¡Ñ(‘Hð)à˜DÑ ‘ð%	!ð( ˆr   N)Ú__name__Ú
__module__Ú__qualname__r   r'   r*   r5   © r   r   r   r      s   „ ò
ò)ò.ó r   r   c                   ó¦   — e Zd ZdZdd„Zdefd„Zdefd„Zdefd„Zdefd„Z	defd	„Z
ded
efd„Zdefd„Zd„ Z	 	 ddedee   ddfd„Zd
edefd„Zy)ÚRendererzº
    Renders network information in /etc/systemd/network

    This Renderer is currently experimental and doesn't support all the
    use cases supported by the other renderers yet.
    Nc                 óh   — |si }|j                  dd«      | _        |j                  dd«      | _        y )NÚresolve_conf_fnz/etc/systemd/resolved.confÚnetwork_conf_dirz/etc/systemd/network/)Úgetr=   r>   )r   Úconfigs     r   r   zRenderer.__init__Y   s:   € ÙØˆFØ%Ÿz™zØÐ;ó 
ˆÔð !'§
¡
ØÐ 7ó!
ˆÕr   Úcfgc                 ó”   — d}ddddœ}|sy |j                  «       D ]&  \  }}||v sŒ||   sŒ|j                  ||||   «       Œ( |d   S )Nr   ÚNameÚDriverÚ
MACAddress)ÚnameÚdriverÚmac_addressrF   )r0   r'   )r   ÚifacerA   r#   Ú
match_dictr&   r2   s          r   Úgenerate_match_sectionzRenderer.generate_match_sectionc   sj   € ØˆàØØ'ñ
ˆ
ñ Øà×$Ñ$Ó&ò 	5‰DˆAˆqØ�EŠz˜e A›hØ×"Ñ" 3¨¨5°©8Õ4ð	5ð �V‰}Ðr   c                 óˆ   — d}|sy d|v r|d   r|j                  |d|d   «       d|v r|d   r|j                  |dd«       y y y )Nr   ÚmtuÚMTUBytesÚoptionalÚRequiredForOnlineÚno)r'   )r   rI   rA   r#   s       r   Úgenerate_link_sectionzRenderer.generate_link_sectiont   sZ   € ØˆáØà�E‰>˜e EšlØ×Ñ˜s J°°e±Ô=à˜Ñ 5¨Ò#4Ø×Ñ˜sÐ$7¸Õ>ð $5Ðr   c                 ó¾   — d}ddddœ}d}d|v rdt        |d   «      z   }|j                  «       D ]+  \  }}||vrŒ|d	k(  r||z  }|j                  ||||   |«       Œ- y
)zy
        Parse a route and use rid as a key in order to isolate the route from
        others in the route dict.
        r   ÚGatewayÚDestinationÚMetric)ÚgatewayÚnetworkÚmetricr,   Úprefixú/rX   N)r   r0   r*   )	r   r)   ÚconfrA   r#   Úroute_cfg_maprZ   r&   r2   s	            r   Úparse_routeszRenderer.parse_routes€   sŠ   € ð
 ˆà Ø$Øñ
ˆð ˆØ�tÑØœ3˜t H™~Ó.Ñ.ˆFà—J‘J“Lò 	D‰DˆAˆqØ˜Ñ%ØØ�IŠ~Ø�V‘�Ø×$Ñ$ S¨#¨}¸QÑ/?ÀÕCñ	Dr   c           	      óp  — d}d}d}|j                  dg «      D �]P  }|d   }|dk(  s|dk(  r|dk(  rd}n|d	k(  rd
}n|dk(  r|dk(  rd	}n|dk(  rd
}d|v r*|d   r%|d   D ]  }| j                  d|› �||«       |dz   }Œ d|v sŒj|d   }	d|v r|	dt        |d   «      z   z  }	dddddœ}
|j                  «       D ]°  \  }}|dk(  r|j	                  d|
|   |	«       Œ"|dk(  rZ|j                  dd|› �|
|   |«       t        ||	«      r.t        j                  d||	«       |j                  dd|› �dd
«       |dz   }Œ�|dk(  s|dk(  sŒŒ|j	                  ||
|   dj                  |«      «       Œ² �ŒS |j	                  |d|«       t        |j                  d d!«      t        «      r|j	                  |d"|d    «       |S )#NrQ   r   r   ÚsubnetsÚtypeÚdhcp4ÚdhcpÚipv4Úipv6ÚyesÚdhcp6ÚroutesÚré   ÚaddressrZ   r[   r   rT   ÚDNSÚDomains)rk   rW   Údns_nameserversÚ
dns_searchrW   r   ÚazGGateway %s is not contained within subnet %s, adding GatewayOnLink flagÚGatewayOnLinkrn   ro   ú ÚDHCPz	accept-rar,   ÚIPv6AcceptRA)r?   r^   r   r0   r'   r*   r   ÚLOGÚdebugÚjoinÚ
isinstanceÚbool)r   rI   rA   rc   r#   r)   r3   ÚtÚiÚaddrÚsubnet_cfg_mapr&   r2   s                r   Úparse_subnetszRenderer.parse_subnets˜   s)  € ØˆØˆØˆØ—‘˜9 bÓ)ó 1	PˆAØ�&‘	ˆAØ�GŠ|˜q Fš{Ø˜4’<Ø!‘DØ˜V’^Ø ‘DØ�g’Ø˜4’<Ø!‘DØ˜V’^Ø �DØ˜1‰}  8¢Ø˜8™ò "�Að ×%Ñ%¨¨#¨ i°°CÔ8Ø ™'‘Cð	"ð
 ˜AŠ~Ø˜‘|�Ø˜q‘=Ø˜C¤# a¨¡kÓ"2Ñ2Ñ2�Dà(Ø(Ø',Ø"+ñ	"�ð ŸG™G›Iò P‘D�A�qØ˜I’~Ø×*Ñ*¨9°nÀQÑ6GÈÕNØ˜išð ×0Ñ0Ø# q¨¨ Y°¸qÑ0AÀ1ôô :¸!¸TÔBÜŸI™Ið!=à !Ø $ô	ð  ×4Ñ4Ø '¨1¨S¨E¨°OÀUôð " A™g™ØÐ/Ò/°1¸Ó3DØ×*Ñ*¨3°¸qÑ0AÀ3Ç8Á8ÈAÃ;ÕOò+Pð91	Pðf 	×Ñ˜3 ¨Ô-ä�e—i‘i ¨RÓ0´$Ô7Ø×Ñ˜s N°E¸+Ñ4FÔGàˆr   c                 ó  — dD ]\  }||vrŒt        ||   «      j                  «       }	 t        j                  |«      }|rdnd}|dk(  rd}nd}|j                  |d	|«       Œ^ y # t        $ r  |dk7  rt
        j                  d|«       d}Y ŒHw xY w)
N)Údhcp4domainÚdhcp6domainrf   rQ   ÚroutezInvalid dhcp4domain value - %sr€   r   r   Ú
UseDomains)r   Úcasefoldr   Útranslate_boolÚ
ValueErrorru   Úwarningr'   )r   ÚdrA   ÚitemÚretÚsections         r   Údhcp_domainzRenderer.dhcp_domain×   s¢   € Ø2ò 	;ˆDØ˜1‰}ØÜ�a˜‘g“,×'Ñ'Ó)ˆCðÜ×)Ñ)¨#Ó.�Ù"‘e¨�ð
 �}Ò$Ø"‘à"�Ø×Ñ˜w¨°cÕ:ñ	;øô ò Ø˜'’>Ü—K‘KÐ @À#ÔFØ�Cùðús   ¨A#Á#&BÂBÚnsc                 ó~  — d}|j                  d«      }|s)|j                  dk(  r|j                  |j                  dœ}n|s|j                  dk(  ry |j                  d«      r%|j	                  |ddj                  |d   «      «       |j                  d	«      r&|j	                  |d
dj                  |d	   «      «       y y )Nr   Údnsrj   )ÚsearchÚnameserversé   r�   rm   rr   r‘   rl   )r?   ÚversionÚdns_searchdomainsrn   r'   rw   )r   rI   rA   r�   r#   r�   s         r   Ú	parse_dnszRenderer.parse_dnsé   s©   € Øˆà�i‰i˜ÓˆÙ�r—z‘z Q’à×.Ñ.Ø!×1Ñ1ñ‰Cñ ˜Ÿ™ qšØà�7‰7�8ÔØ×Ñ˜s I¨s¯x©x¸¸H¹Ó/FÔGØ�7‰7�=Ô!Ø×Ñ˜s E¨3¯8©8°C¸Ñ4FÓ+GÕHð "r   c                 óî   — dddddœ}|dk(  r|j                  ddd	d
ddœ«       d|› d�|v rJ|dd|› �fv r@|d|› d�   }|j                  «       D ]#  \  }}||v sŒ|j                  d|› �|||   «       Œ% y y y )Nzuse-dnsúuse-domainszuse-hostnamezuse-ntp)ÚUseDNSrƒ   ÚUseHostnameÚUseNTPÚ4zsend-hostnameÚhostnamezroute-metriczuse-mtuz
use-routes)ÚSendHostnameÚHostnameÚRouteMetricÚUseMTUÚ	UseRoutesrc   ú
-overridesrf   ÚipvÚDHCPv)Úupdater0   r'   )	r   rA   Údevicerc   r“   Údhcp_config_mapsÚdhcp_overridesr&   r2   s	            r   Úparse_dhcp_overrideszRenderer.parse_dhcp_overridesú   sÍ   € àØ'Ø)Øñ	
Ðð �cŠ>Ø×#Ñ#à$3Ø *Ø#1Ø'Ø!-ñôð �'�˜*Ð%¨Ñ/°DØØ�'�ˆOð=
ñ 5
ð $ d¨7¨)°:Ð$>Ñ?ˆNØ(×.Ñ.Ó0ò P‘��1Ø˜Ò&Ø×&Ñ&¨¨w¨iÐ'8¸!¸^ÈAÑ=NÕOñPð5
Ð/r   c                 ó¤   — d}t         j                  d|«       |dz   |z   dz   }t        j                  ||«       t        j                  |||«       y )Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)ru   rv   r   Ú
write_fileÚchownbyname)r   Úlinkr\   Únwk_dirÚnet_fn_ownerÚnet_fns         r   Úcreate_network_filezRenderer.create_network_file  sK   € Ø(ˆä�	‰	Ð4°dÔ;àÐ+Ñ+¨dÑ2°ZÑ?ˆÜ�‰˜ Ô%Ü×Ñ˜ ¨|Õ<r   Únetwork_stateÚ	templatesÚreturnc                 óò   — | j                   }|rt        j                  |«      |z   }t        j                  |«       | j                  |«      }|j                  «       D ]  \  }}| j                  |||«       Œ y ©N)r>   r   Útarget_pathr   Ú
ensure_dirÚ_render_contentr0   r±   )r   r²   r³   ÚtargetÚnetwork_dirÚret_dictr&   r2   s           r   Úrender_network_statezRenderer.render_network_state  so   € ð ×+Ñ+ˆÙÜ×*Ñ*¨6Ó2°[Ñ@ˆKä�‰˜Ô$à×'Ñ'¨Ó6ˆØ—N‘NÓ$ò 	8‰DˆAˆqØ×$Ñ$ Q¨¨;Õ7ñ	8r   c                 ó<  — i }|j                  «       D �]…  }t        «       }| j                  ||«      }| j                  ||«       | j	                  ||«      }| j                  |||«       d}|j                  «       D ]  }| j                  d|› �||«       |dz   }Œ |j                  dk(  rÍ|d   }	|j                  d   j                  «       D ]"  \  }
}d|v sŒ|j                  d«      |	k(  sŒ |
}	 n |	|j                  d   v ru|j                  d   |	   }| j                  ||«       dD ]L  }d	|› d
�|v r.d|j                  d	|› d�i «      v r|	› d|› d|› d�}t        |«      ‚| j                  ||||«       ŒN |j                  ||j!                  «       i«       �Œˆ |S )Nr   Úcrj   r’   rF   Ú	ethernetszset-name)r›   Ú6rc   Údomainr—   r¢   z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)Úiter_interfacesr   rK   rR   r~   r•   Úiter_routesr^   r“   r@   r0   r?   rŒ   ÚRuntimeErrorr©   r¥   r5   )r   r�   r¼   rI   rA   r­   rc   r)   r‚   rF   Údev_nameÚdev_cfgr¦   r“   Ú	exceptions                  r   r¹   zRenderer._render_content/  sî  € ØˆØ×'Ñ'Ó)ó 4	:ˆEÜ“+ˆCà×.Ñ.¨u°cÓ:ˆDØ×&Ñ& u¨cÔ2Ø×%Ñ% e¨SÓ1ˆDØ�N‰N˜5 # rÔ*àˆCØŸ™Ó)ò �ð ×!Ñ! A c U )¨U°CÔ8Ø˜A‘g‘ð	ð �z‰z˜QŠØ&+¨F¡m�ð *,¯©°;Ñ)?×)EÑ)EÓ)Gò "Ñ%�H˜gØ! WÒ,Ø"Ÿ;™; zÓ2°dÓ:Ø#+˜DÙ!ð	"ð
 ˜2Ÿ9™9 [Ñ1Ñ1ØŸY™Y {Ñ3°DÑ9�Fð ×$Ñ$ V¨SÔ1Ø#-ò N˜à" 7 )¨6Ð2°fÑ<Ø -Ø%Ÿz™z¨D°°	¸Ð*DÀbÓIñ!Jð $( &¨°w°ið @,Ø,3¨9ð 57ð!8ð &ô
 #/¨yÓ"9Ð9à×1Ñ1°#°v¸tÀWÕMðNð �O‰O˜T 3×#5Ñ#5Ó#7Ð8Ö9ði4	:ðl ˆr   r¶   )NN)r6   r7   r8   Ú__doc__r   r   rK   rR   r^   r~   rŒ   r	   r•   r©   r±   r   r    r½   r¹   r9   r   r   r;   r;   Q   s´   „ ñó
ð°ó ð"
?°	ó 
?ðD¨9ó Dð0<¨	ó <ð~; )ó ;ð$I Ið I°<ó Ið"P¨	ó Pò8=ð %)Øñ	8à#ð8ð ˜D‘>ð8ð
 
ó8ð 8 ,ð 8°4ô 8r   r;   c                 óV   — ddg}ddg}|D ]  }t        j                  ||| ¬«      rŒ y y)NÚipÚ	systemctlz	/usr/sbinz/bin)r�   rº   FT)r   Úwhich)rº   Úexpectedr�   Úps       r   Ú	availablerÐ   j  s=   € Ø�kÐ"€HØ˜6Ð"€FØò ˆÜ�z‰z˜! F°6Ö:Ùðð r   r¶   )ÚloggingÚcollectionsr   Útypingr   Ú	cloudinitr   r   Úcloudinit.netr   r   Úcloudinit.net.network_stater	   Ú	getLoggerr6   ru   r   r;   rÐ   r9   r   r   ú<module>rØ      sP   ðó Ý #Ý ç  ß BÝ 4à€g×Ñ˜Ó!€÷<ñ <ô~Vˆx× Ñ ô Vôrr   