Ë
    x[h¨K  ã                   ó0  — U d 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	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZ  ej*                  e«      ZeZd	Zd
Zg d¢Zdddgddddœdedgddddœdedgddddœddg ddddœddg ddddœdœZdddœd	g ddœdœdd d!d"œid#did d!d"œd$œd#did#did%œdddd&œidd'diid	ddd(œd)dgddd*œd+d,d-gd-d.d/œd0œd#did d!d"œd$œd-i id#did	ddœd1did2œd#did	ddœd1d id2œd#didd	d&œd d!d"œd2œd#did#did%œd#did	ddœd1d id2œdd'diid3œZeeef   ed4<   d5D ]
  Z ed6   ee <   Œ d7D ]
  Z ed8   ee <   Œ d9D ]
  Z ed:   ee <   Œ d;eedgd<œZ!eed=<    e"g d>¢«      Z#d?„ Z$d@efdA„Z%dLdB„Z&dMdC„Z'dD„ Z(	 	 	 	 	 	 	 	 dNdE„Z)dF„ Z*dGedHedIedJe+d@df
dK„Z,y)OzNTP: enable and configure ntpé    N)ÚDictÚMapping)ÚsubpÚ
temp_utilsÚ	templaterÚ
type_utilsÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚPER_INSTANCEz/etc/ntp.confé   )Ú	almalinuxÚalpineÚaoscÚ
azurelinuxÚcentosÚ
cloudlinuxÚcosÚdebianÚ	eurolinuxÚfedoraÚfreebsdÚmarinerÚmiraclelinuxÚopenbsdÚ	openeulerÚOpenCloudOSÚopenmandrivaÚopensuseúopensuse-microosúopensuse-tumbleweedúopensuse-leapÚphotonÚrhelÚrockyÚsle_hpcú	sle-microÚslesÚ	TencentOSÚubuntuÚ	virtuozzoÚchronydz/etc/chrony.confÚchronyzchrony.conf.{distro})Ú	check_exeÚconfpathÚpackagesÚservice_nameÚtemplate_nameÚtemplateÚntpdÚntpzntp.conf.{distro}Úntpdatez/etc/ntpd.confzntpd.conf.{distro}z/lib/systemd/systemd-timesyncdz-/etc/systemd/timesyncd.conf.d/cloud-init.confúsystemd-timesyncdztimesyncd.conf)r.   r6   r7   Úopenntpdr8   z/etc/chrony/chrony.conf)r0   r2   )r0   r1   r2   )r.   r6   z"/usr/lib/systemd/systemd-timesyncdz/etc/systemd/timesyncd.conf)r/   r0   r2   )r.   r8   )r6   r.   )r2   r0   r0   )r0   r2   r3   z/usr/local/etc/chrony.conf)r0   r1   r2   r3   z/usr/local/sbin/ntpdz/usr/local/etc/ntp.confr9   zntpd.conf.openbsd)r/   r0   r1   r2   r3   )r6   r.   r9   r/   )r.   r6   r8   )r   r   r   r   r   r   r   r   r   r   r    r$   r%   r)   r+   ÚDISTRO_CLIENT_CONFIG)r!   r"   r#   r    )r   r   r&   r%   )r'   r(   r)   Úcc_ntp)ÚidÚdistrosÚ	frequencyÚactivate_by_schema_keysÚmeta)r/   r0   r1   r2   c                 ó„   — t         }t        j                  t        «      }| |v rt        j                  |||    gd¬«      }|S )zòConstruct a distro-specific ntp client config dictionary by merging
       distro specific changes into base config.

    @param distro: String providing the distro class name.
    @returns: Dict of distro configurations for ntp clients.
    T©Úreverse)r:   ÚcopyÚNTP_CLIENT_CONFIGr	   Úmergemanydict)ÚdistroÚdcfgÚcfgs      ú9/usr/lib/python3/dist-packages/cloudinit/config/cc_ntp.pyÚdistro_ntp_client_configsrK     s?   € ô  €DÜ
�)‰)Ô%Ó
&€CØ��~Ü× Ñ  # t¨F¡|Ð!4¸dÔCˆØ€Jó    Úreturnc                 óF  — t        |j                  «      }| r-| dk7  r(t        j                  d| «       |j	                  | i «      S |j                  dd«      }i }|dk(  r›|j                  D ]Q  }|j	                  |«      }t        j                  |j	                  d«      «      sŒ9t        j                  d|«       |} n |s7|j                  d   }t        j                  d|«       |j	                  |i «      }|S t        j                  d|«       |j	                  |i «      }|S )	a  Determine which ntp client is to be used, consulting the distro
       for its preference.

    @param ntp_client: String name of the ntp client to use.
    @param distro: Distro class instance.
    @returns: Dict of the selected ntp client or {} if none selected.
    Úautoz4Selected NTP client "%s" via user-data configurationÚ
ntp_clientr/   z+Selected NTP client "%s", already installedr   z<Selected distro preferred NTP client "%s", not yet installedz1Selected NTP client "%s" via distro system config)	rK   ÚnameÚLOGÚdebugÚgetÚ
get_optionÚpreferred_ntp_clientsr   Úwhich)rP   rG   Ú
distro_cfgÚdistro_ntp_clientÚ	clientcfgÚclientrI   s          rJ   Úselect_ntp_clientr\     s%  € ô +¨6¯;©;Ó7€Jñ �j FÒ*Ü�	‰	ØBÀJô	
ð �~‰~˜j¨"Ó-Ð-ð ×)Ñ)¨,¸Ó?Ðà€IØ˜FÒ"Ø×2Ñ2ò 	ˆFØ—.‘. Ó(ˆCÜ�z‰z˜#Ÿ'™' +Ó.Õ/Ü—	‘	ØAÀ6ôð  �	Ùð	ñ Ø×1Ñ1°!Ñ4ˆFÜ�I‰IØNØôð #Ÿ™ v¨rÓ2ˆIð Ðô 	�	‰	Ø?Øô	
ð —N‘NÐ#4°bÓ9ˆ	àÐrL   c                 óJ   — t        j                  |«      ry|€dg} | |«       y)ah  Install ntp client package if not already installed.

    @param install_func: function.  This parameter is invoked with the contents
    of the packages parameter.
    @param packages: list.  This parameter defaults to ['ntp'].
    @param check_exe: string.  The name of a binary that indicates the package
    the specified package is already installed.
    Nr6   )r   rW   )Úinstall_funcr1   r/   s      rJ   Úinstall_ntp_clientr_   M  s(   € ô ‡z�z�)ÔØØÐØ�7ˆá�ÕrL   c                 óv   — t         j                  j                  | «      rt        j                  | | dz   «       yy)zŽRename any existing ntp client config file

    @param confpath: string. Specify a path to an existing ntp client
    configuration file.
    z.distN)ÚosÚpathÚexistsr	   Úrename©r0   s    rJ   Úrename_ntp_confrf   ^  s,   € ô 
‡w�w‡~�~�hÔÜ�‰�H˜h¨Ñ0Õ1ð  rL   c           	      óî   — g }| }| dk(  rd}n| dk(  s| dk(  rd}t        t        «      D ]E  }|j                  dj                  t	        |«      g|gz   dgz   D �cg c]  }|sŒ|‘Œ	 c}«      «       ŒG |S c c}w )zÛGenerate a list of server names to populate an ntp client configuration
    file.

    @param distro: string.  Specify the distro name
    @returns: list: A list of strings representing ntp servers for this distro.
    r)   r    r   r   Ú ú.zpool.ntp.org)ÚrangeÚNR_POOL_SERVERSÚappendÚjoinÚstr)rG   ÚnamesÚpool_distroÚxÚns        rJ   Úgenerate_server_namesrs   h  s‘   € ð €EØ€Kà�Òð !‰Ø	�8Ò	˜v¨Ò4ð ˆä”?Ó#ò 
ˆØ�‰Ø�H‰HÜ  ›V˜H¨ }Ñ4¸Ð7GÑGÖM�qÊ1’ÒMóõ	
ð
ð €Lùò	 Ns   ÁA2ÁA2c	                 ó(  — |sg }|sg }|sg }|sg }|s|s| dk(  ry|s;| dk(  r6|dk(  r1t        | «      }t        j                  ddj                  |«      «       n4|s2|s0t        | «      }t        j                  ddj                  |«      «       |st	        d«      ‚|s|st	        d	«      ‚||||d
œ}	|r3t        j                  dd¬«      }
|
d   }t        j                  ||¬«       t        j                  |||	«       |rt        j                  |«       yy)aÞ  Render a ntp client configuration for the specified client.

    @param distro_name: string.  The distro class name.
    @param service_name: string. The name of the NTP client service.
    @param servers: A list of strings specifying ntp servers. Defaults to empty
    list.
    @param pools: A list of strings specifying ntp pools. Defaults to empty
    list.
    @param allow: A list of strings specifying a network/CIDR. Defaults to
    empty list.
    @param peers: A list nodes that should peer with each other. Defaults to
    empty list.
    @param path: A string to specify where to write the rendered template.
    @param template_fn: A string to specify the template source file.
    @param template: A string specifying the contents of the template. This
    content will be written to a temporary file before being used to render
    the configuration file.

    @raises: ValueError when path is None.
    @raises: ValueError when template_fn is None and template is None.
    r   Nr   r5   z%Adding distro default ntp servers: %sú,z*Adding distro default ntp pool servers: %sz Invalid value for path parameterz$Not template_fn or template provided)ÚserversÚpoolsÚallowÚpeersztemplate_name-z.tmpl)ÚprefixÚsuffixé   )Úcontent)rs   rR   rS   rm   Ú
ValueErrorr   Úmkstempr	   Ú
write_filer   Úrender_to_fileÚdel_file)Údistro_namer2   rv   rw   rx   ry   rb   Útemplate_fnr4   ÚparamsÚtfiles              rJ   Úwrite_ntp_config_templater‡   …  s  € ñ@ ØˆÙØˆÙØˆÙØˆá™5 [°EÒ%9ØÙ�{ hÒ.°<À6Ò3Iô (¨Ó4ˆÜ�	‰	Ð9¸3¿8¹8ÀGÓ;LÕMÙ¡Ü% kÓ2ˆÜ�	‰	Ø8¸#¿(¹(À5»/ô	
ñ ÜÐ;Ó<Ð<á™xÜÐ?Ó@Ð@ð ØØØñ	€Fñ Ü×"Ñ"Ð*:À7ÔKˆØ˜A‘hˆÜ�‰˜¨XÕ6ä×Ñ˜[¨$°Ô7áÜ�‰�kÕ"ð rL   c                 óÎ  — g }t         j                  t        | j                  «       «      «      }|r<dj	                  t        |«      «      }|j                  dj                  |¬«      «       n<t        | j                  d«      | j                  d«      g«      s|j                  d«       t        | j                  «       «      D ]õ  \  }}d|z   }|dk(  r?t        |t        |t        «      g«      rŒ,|j                  d	j                  ||¬
«      «       ŒO|dk(  r4t        |t        «      rŒe|j                  dj                  ||¬
«      «       Œˆ|dv r7|€Œ�t        |t        «      rŒ |j                  dj                  ||¬
«      «       ŒÃt        |t        «      rŒÔ|j                  dj                  ||¬
«      «       Œ÷ |r*t        dj                  dj	                  |«      ¬«      «      ‚y)aO  Validate user-provided ntp:config option values.

    This function supplements flexible jsonschema validation with specific
    value checks to aid in triage of invalid user-provided configuration.

    @param ntp_config: Dictionary of configuration value under 'ntp'.

    @raises: ValueError describing invalid values provided.
    z, z(Missing required ntp:config keys: {keys})Úkeysr4   r3   zJEither ntp:config:template or ntp:config:template_name values are requiredzntp:config:r0   z6Expected a config file path {keypath}. Found ({value}))ÚkeypathÚvaluer1   zHExpected a list of required package names for {keypath}. Found ({value}))r4   r3   Nz5Expected a string type for {keypath}. Found ({value})z$Invalid ntp configuration:\n{errors}ú
)Úerrors)ÚREQUIRED_NTP_CONFIG_KEYSÚ
differenceÚsetr‰   rm   Úsortedrl   ÚformatÚanyrT   ÚitemsÚallÚ
isinstancern   Úlistr~   )Ú
ntp_configr�   Úmissingr‰   Úkeyr‹   rŠ   s          rJ   Úsupplemental_schema_validationr›   Ò  sÌ  € ð €FÜ&×1Ñ1´#°j·o±oÓ6GÓ2HÓI€GÙØ�y‰yœ ›Ó)ˆØ�‰Ø6×=Ñ=À4Ð=ÓHõ	
ô Ø	�‰˜
Ó	# Z§^¡^°OÓ%DÐEôð 	�‰ðô	
ô ˜Z×-Ñ-Ó/Ó0ò ‰
ˆˆUØ #Ñ%ˆØ�*ÒÜ˜œz¨%´Ó5Ð6Õ7Ø—‘ð'ß'-¡v°gÀU vÓ'Kõð �JÒÜ˜e¤TÕ*Ø—‘ð'ß'-¡v°gÀU vÓ'Kõð Ð1Ñ1Øˆ}ØÜ˜e¤SÕ)Ø—‘ð'ß'-¡v°gÀU vÓ'Kõô ˜E¤3Õ'Ø�M‰MØG×NÑNØ#¨5ð Oó õð/ñ: ÜØ3×:Ñ:Ø—y‘y Ó(ð ;ó ó
ð 	
ð rL   rQ   rI   ÚcloudÚargsc                 óÀ  — d|vrt         j                  d| «       y|d   }|€i }t        |t        «      s.t	        dj                  t        j                  |«      ¬«      «      ‚|j                  dd«      }t        j                  |«      rt         j                  d| «       yt        |j                  d	«      |j                  «      }t        j                  ||j                  d
i «      gd¬«      }t        |«       t        |j                  d«      ¬«       d}|j                  d«      s[|d   j!                  d|j                  j"                  «      }|j%                  |«      }|sd|j                  d«      z  }	t	        |	«      ‚t         j                  d|j                  d«      «       t         j                  d|j                  dg «      «       t         j                  d|j                  dg «      «       t         j                  d|j                  dg «      «       t         j                  d|j                  dg «      «       t'        |j                  j"                  |j                  d«      |j                  dg «      |j                  dg «      |j                  dg «      |j                  dg «      |j                  d«      ||j                  d«      ¬«	       t)        |j                  j*                  |d   |d   ¬«       t        j,                  «       rn|j                  d«      d k7  r:	 |j                  j/                  d!d «       	 |j                  j/                  d#d «       	 |j                  j/                  d%|d   «       	 |j                  j/                  d'|d   «       y# t0        j2                  $ r t         j5                  d"«       Y Œˆw xY w# t0        j2                  $ r t         j5                  d$«       Y Œ™w xY w# t0        j2                  $ r}
t         j7                  d&|
«       ‚ d}
~
ww xY w# t0        j2                  $ r}
t         j7                  d(|
«       ‚ d}
~
ww xY w))zEnable and configure ntp.r6   z8Skipping module named %s, not present or disabled by cfgNzL'ntp' key existed in config, but not a dictionary type, is a {_type} instead)Ú_typeÚenabledTz)Skipping module named %s, disabled by cfgrP   ÚconfigrB   r0   re   r4   r3   z{distro}z#No template found, not rendering %szservice_name: %sr2   zservers: %srv   z	pools: %srw   z	allow: %srx   z	peers: %sry   )r2   rv   rw   rx   ry   rb   r„   r4   r1   r/   )r1   r/   r5   Ústopz Failed to stop base ntpd serviceÚdisablez#Failed to disable base ntpd serviceÚenablez Failed to enable ntp service: %sÚreloadz&Failed to reload/start ntp service: %s)rR   rS   r–   ÚdictÚRuntimeErrorr’   r   Úobj_namerT   r	   Úis_falser\   rG   rF   r›   rf   ÚreplacerQ   Úget_template_filenamer‡   r_   Úinstall_packagesÚis_BSDÚmanage_servicer   ÚProcessExecutionErrorÚwarningÚ	exception)rQ   rI   rœ   r�   Úntp_cfgr    Úntp_client_configr„   r3   ÚmsgÚes              rJ   Úhandler¶     sÅ  € à�CÑÜ�	‰	ØFÈô	
ð 	Ø�%‰j€GØ€Øˆô �g¤Ô&Üð$ß$*¡F´×1DÑ1DÀWÓ1M FÓ$Nó
ð 	
ð �k‰k˜) TÓ*€GÜ‡}�}�WÔÜ�	‰	Ð=¸tÔDØô *Ø�‰�LÓ! 5§<¡<óÐô ×*Ñ*Ø	˜GŸK™K¨°"Ó5Ð6ÀôÐô #Ð#4Ô5ÜÐ.×2Ñ2°:Ó>Õ?à€KØ× Ñ  Ô,Ø)¨/Ñ:×BÑBØ˜Ÿ™×)Ñ)ó
ˆð ×1Ñ1°-Ó@ˆÙà5Ø#×'Ñ'¨Ó8ñ9ð ô ˜sÓ#Ð#ä‡I�IÐ Ð"3×"7Ñ"7¸Ó"GÔHÜ‡I�Iˆm˜WŸ[™[¨°BÓ7Ô8Ü‡I�Iˆk˜7Ÿ;™; w°Ó3Ô4Ü‡I�Iˆk˜7Ÿ;™; w°Ó3Ô4Ü‡I�Iˆk˜7Ÿ;™; w°Ó3Ô4ÜØ�‰×ÑØ&×*Ñ*¨>Ó:Ø—‘˜I rÓ*Ø�k‰k˜' 2Ó&Ø�k‰k˜' 2Ó&Ø�k‰k˜' 2Ó&Ø×"Ñ" :Ó.ØØ"×&Ñ& zÓ2õ
ô Ø�‰×%Ñ%Ø" :Ñ.Ø# KÑ0õô
 ‡{�{„}Ø× Ñ  Ó0°FÒ:ð@Ø—‘×+Ñ+¨F°FÔ;ðCØ—‘×+Ñ+¨I°vÔ>ð	Ø�L‰L×'Ñ'ØÐ+¨NÑ;ôðØ�‰×#Ñ#ØÐ'¨Ñ7õ	
øô ×-Ñ-ò @Ü—‘Ð>Ö?ð@ûô ×-Ñ-ò CÜ—‘ÐAÖBðCûô ×)Ñ)ò 	Ü�M‰MÐ<¸aÔ@Øûð	ûô ×%Ñ%ò Ü�‰Ð>ÀÔBØûðúsT   Ì&N  ÍO Í O< Î P. Î (OÏ
OÏ(O9Ï8O9Ï<P+ÐP&Ð&P+Ð.QÑQÑQ)Nr5   )N)NNNNNNNN)-Ú__doc__rD   Úloggingra   Útypingr   r   Ú	cloudinitr   r   r   r   r	   Úcloudinit.cloudr
   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.settingsr   Ú	getLoggerÚ__name__rR   r>   ÚNTP_CONFrk   r=   rE   r:   rn   Ú__annotations__rG   r@   Ú	frozensetrŽ   rK   r\   r_   rf   rs   r‡   r›   r—   r¶   © rL   rJ   ú<module>rÅ      sè  ðò $ã Û Û 	ß  ç CÕ CÝ !Ý #Ý .Ý +à€g×Ñ˜Ó!€à€	Ø€Ø€ò€ðF Ø&Ø�JØ Ø/Øñð ØØ�GØØ,Øñð ØØ�KØ!Ø,Øñð Ø$ØØØ-Øñð 6ØCØØ+Ø)ØññC)Ð ð^ 2Ø%ñ
ð
 (ØØ"ñ
ñ
ð 	Ø=Ø5ñ
ðð ˜Ið
ð >Ø5ñ
ñ	ð ˜Fð
ð ˜Ið
ñ	ð 	Ø%Ø1ñ
ðð 	ØÐ1ð
ðð (Ø"Ø0ñ
ð 5Ø!˜
Ø%Ø3ñ	
ð 0Ø1Ø#˜Ø&Ø0ñ
ñð, ˜Ið
ð >Ø5ñ
ñ	ð 	�Bðð
 ˜Ið
ð (Ø"ñ
ð
 Ð9ð
ñð ˜Ið
ð (Ø"ñ
ð
 Ð=ð
ñð ˜Ið
ð !'°OÑDà=Ø5ñ
ñ	ð ˜Fð
ð ˜Ið
ñ	ð ˜Ið
ð (Ø"ñ
ð
 Ð=ð
ñð 	ØÐ1ð
ðñII)Ð �d˜3 ˜9‘oó IðV Kò D€FØ#7¸
Ñ#CÐ˜Ò ðDð 3ò @€FØ#7¸Ñ#?Ð˜Ò ð@ð 'ò @€FØ#7¸Ñ#?Ð˜Ò ð@ð ØØØ %˜wñ	€€jó ñ %Ú9óÐ ò
ð/¨Wó /ódó"2òð> ØØ
Ø
Ø
Ø	ØØóJ#òZ:
ðz_�ð _˜6ð _¨%ð _°tð _Àô _rL   