+
    ˜qgjÉ ã                   óœ  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHtHtHtHtHt ^ RIHu Hu Ht ^ RIHtH t H!t!HtH"t"H#t#H$t$H%t%H&t&H't' ^ RI(H)t)H*t* ^ RI+H,t, ^ R	I-H.t. ^ R
I/H0t0 ^ RI1H2t2 ^ RI3H4t4 ^ RI5H6t6H7t7H8t8 ^ RI9H:t: ^ RI;H<t< ^ RI=H>t> Rt?RR.RR.RR.R. R1ORRR.RRR.RR.RR.R. R2OR. R3ORR.RRR ./t@]P‚                  ! ]B4      tC. R4OtD]PŠ                  ]PŒ                  ,           R!,           tG]]]H,          ]],          ]]]H,          ,          ]]]H]]H,          3,          ,          ]]]H]]H,          ]3,          ,          3,          tI ! R" R#]J4      tK ! R$ R%]"P˜                  ] Pš                  R&7      tNR' R( ltOR) R* ltPR]'P¢                  3R+ ltRR, tSR- R. ltTR5R/ ltUR0 tVR# )6é    N)Údefaultdict)Úsuppress)ÚStringIO)
ÚAnyÚDictÚListÚMappingÚMutableMappingÚOptionalÚSetÚTupleÚTypeÚUnion)
ÚhelpersÚimporterÚ	lifecycleÚnetÚpersistenceÚssh_utilÚsubpÚ
temp_utilsÚ
type_utilsÚutil)ÚLinuxNetworkingÚ
Networking)ÚPackageManager)Úknown_package_managers)Úhosts)Ú+ALLOW_EC2_MIRRORS_ON_NON_AWS_INSTANCE_TYPES)Úlog_with_downgradable_level)Ú
activatorsÚdhcpÚ	renderers)ÚNetOps)Úparse_net_config_data©ÚRendererÚallÚalpineÚaoscÚarchÚdebianÚfreebsdÚ	dragonflyÚgentooÚcosÚnetbsdÚopenbsdÚredhatÚsuseÚ	openeulerÚOpenCloudOSÚ	TencentOSÚ-c                   ó   € ] tR t^~tRtR# )ÚPackageInstallerError© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r;   ó    Ú</usr/lib/python3/dist-packages/cloudinit/distros/__init__.pyr:   r:   ~   s   † ÛrA   r:   c                   ó  a € ] tR t^‚t o RtRtRtRtRtRt	Rt
RtR	R
.tRtRtR.t/ tRt]tRRRRRR/t]P,                  t^tRtRtRtRtR tV 3R lR ltR tV 3R lR lt V 3R lR lt!]"V 3R lR  l4       t#]"V 3R! lR" l4       t$]"V 3R# lR$ l4       t%V 3R% lR& lt&R' t'RtR( lt(RtR) lt)RtR* lt*]+R+ 4       t,]-P\                  RuR, l4       t/R-R/R. lt0R/ t1RtR0 lt2RuR1 lt3R2 t4RvV 3R3 lR4 llt5]-P\                  RtR5 l4       t6]-P\                  R6 4       t7R7 t8R8 t9]-P\                  RtR9 l4       t:]-P\                  R: 4       t;]-P\                  R; 4       t<R< t=R= t>]+R> 4       t?R? t@R@ tA]"RA 4       tBRB tCV 3RC lRD ltDRE tEV 3RF lRG ltFRH tGRI tHV 3RJ lRK ltIRL tJRvRM ltKV 3RN lRO ltLRP tMRtRQ ltNRwRR ltORtRS ltPRtRT ltQ]RRU 4       tS]RRtRV l4       tT]RRWR/V 3RX lRY ll4       tUV 3RZ lR[ ltVV 3R\ lR] ltWRxV 3R^ lR_ lltX]+V 3R` lRa l4       tY]"Rb 4       tZ]ZP¶                  Rc 4       tZ]+V 3Rd lRe l4       t\]+V 3Rf lRg l4       t]]+V 3Rh lRi l4       t^]+V 3Rj lRk l4       t_]+V 3Rl lRm l4       t`]+V 3Rn lRo l4       taV 3Rp lRq ltbV 3Rr ltcRstdV teR# )yÚDistrozpython3-pipz/usr/libz
/etc/hostsz/etc/doas.confz"/etc/sudoers.d/90-cloud-init-usersz/etc/hostnamez/etc/shadowz/var/lib/extrausers/shadowz^{username}::z^{username}:!:z/usr/share/zoneinfoz	root:rootÚserviceNÚhaltz-HÚpoweroffz-PÚrebootz-rFz/etc/resolv.confc                ó  € W0n         W n        Wn        V P                  4       V n        \
        P                  V n        \        P                  V n
        \        P                  ! V4      V n        . V n        R V n        R V n        RV n        R # )NT)Ú_pathsÚ_cfgÚnameÚnetworking_clsÚ
networkingr"   ÚALL_DHCP_CLIENTSÚdhcp_client_priorityÚiproute2ÚIproute2Únet_opsr   ÚRunnersÚ_runnerÚpackage_managersÚ_dhcp_clientÚ_fallback_interfaceÚis_linux)ÚselfrL   ÚcfgÚpathss   &&&&rB   Ú__init__ÚDistro.__init__¦   sk   € ØŒØŒ	ØŒ	Ø&*×&9Ñ&9Ó&;ˆŒÜ$(×$9Ñ$9ˆÔ!Ü×(Ñ(ˆŒÜ—’ uÓ-ˆŒØ68ˆÔØ ˆÔØ#'ˆÔ ØˆŽrA   c                ó$   <€ V ^8„  d   QhRS[ RR/# )é   Úci_pkl_versionÚreturnN)Úint)ÚformatÚ__classdict__s   "€rB   Ú__annotate__ÚDistro.__annotate__³   s   ø€ ÷ !ñ !©ð !°ñ !rA   c                ó$  € RV P                   9  g   V P                  P                   '       g   V P                  4       V n        \        V R4      '       g   RV n        \        V R4      '       g   RV n        \        V R4      '       g
   RV n        R# R# )z)Perform deserialization fixes for Distro.rN   rW   NrX   rY   T)Ú__dict__rN   rM   ÚhasattrrW   rX   rY   )rZ   ra   s   &&rB   Ú	_unpickleÚDistro._unpickle³   ss   € à˜tŸ}™}Ô,°D·O±O×4L×4LÐ4Lð #×1Ñ1Ó3ˆDŒOÜ�t˜^×,Ò,Ø $ˆDÔÜ�tÐ2×3Ò3Ø'+ˆDÔ$Ü�t˜Z×(Ò(Ø ˆDŽMñ )rA   c                ó¶   € \        V\        4      '       d   V# \        V\        \        34      '       d   \	        V4      ^8X  d   \        V4      # \        R4      h)r`   z?Invalid 'packages' yaml specification. Check schema definition.)Ú
isinstanceÚstrÚlistÚtupleÚlenÚ
ValueError)rZ   Úentrys   &&rB   Ú_validate_entryÚDistro._validate_entryÅ   sL   € Ü�eœS×!Ò!ØˆLÜ˜¤¤e˜}×-Ò-Ü�5‹z˜QŒÜ˜U“|Ð#Üð'ó
ð 	
rA   c                ób   <€ V ^8„  d   QhRS[ RS[S[S[S[,          S[3,          S[3,          /# )r`   Úpkglistrb   )ÚPackageListr   r   r   r   r   )rd   re   s   "€rB   rf   rg   Ð   s6   ø€ ÷ ;ñ ;Ù"ð;á	‰t‘D™Õ(©#Ð-Õ.±Ð3Õ	4ñ;rA   c                óÎ  € \        \        4      p\        4       pV F’  p\        V\        4      '       dZ   VP	                  4        FC  w  rVV F8  pV P                  V4      p V\        V,          ,          P                  V4       K:  	  KE  	  Kr  VP                  V P                  V4      4       K”  	  \        V4      V3#   \         d    \        P                  RT4        K—  i ; i)zrTransform the generic package list to package by package manager.

Additionally, include list of generic packages
zLCannot install packages under '%s' as it is not a supported package manager!)r   Úsetrn   ÚdictÚitemsru   r   ÚaddÚKeyErrorÚLOGÚerror)rZ   rx   Úpackages_by_managerÚgeneric_packagesrt   Úpackage_managerÚpackage_listÚ
definitions   &&      rB   Ú_extract_package_by_managerÚ"Distro._extract_package_by_managerÐ   sÏ   € ô *¬#Ó.ÐÜ #£ÐÛˆEÜ˜%¤×&Ò&Ø5:·[±[¶]Ñ1�OÛ&2˜
Ø%)×%9Ñ%9¸*Ó%E˜
ð	Ø/Ü 6°Õ Gõç!™c *žoó '3ó 6Cð !×$Ñ$ T×%9Ñ%9¸%Ó%@ÖAñ! ô" Ð'Ó(Ð*:Ð:Ð:øô  (ô ÜŸI™Ið!Cà /÷ðús   Á!#B?Â?!C$	Ã#C$	c                ó    <€ V ^8„  d   QhRS[ /# )r`   rx   )ry   )rd   re   s   "€rB   rf   rg   ì   s   ø€ ÷ 3Fñ 3F©ñ 3FrA   c                ó’  € R pV P                  V4      w  pp\        4       pV P                   Fä  pVP                  VP                  \        4       4      pWt,          pVP                  V4       VP                  4       '       g4   \        P                  RVP                  4       VP                  V4       K‰  V'       g   K“  VP                  V4      p	VP                  V	4       V	'       d   \        P                  W)4       \        V	4      V,
          pKæ  	  VP                  4        F€  w  r«V
P                  V P                   Uu. uF  qÌP                  NK  	  up9   d   K;  VP                  V
P                  V P                  V P                   4      P                  VR7      4       K‚  	  V'       d   \#        W%,          4      hR# u upi )zcFailed to install the following packages: %s. See associated package manager logs for more details.z"Package manager '%s' not available)rx   N)r‡   r{   rV   ÚgetÚ	__class__Údifference_updateÚ	availabler€   ÚdebugrL   ÚupdateÚinstall_packagesÚinfor}   Úfrom_configrU   rK   r:   )rZ   rx   Úerror_messager‚   rƒ   Útotal_failedÚmanagerÚmanager_packagesÚto_tryÚfailedÚmanager_typeÚpackagesÚps   &&           rB   r‘   ÚDistro.install_packagesì   s‡  € ðDð 	ð ×,Ñ,¨WÓ5ñ	
ØØô
 "%£ˆØ×,Ô,ˆGà2×6Ñ6Ø×!Ñ!¤3£5ó Ðð &Õ8ˆFà×*Ñ*¨6Ô2Ø×$Ñ$×&Ò&Ü—	‘	Ð>ÀÇÁÔMØ×#Ñ# FÔ+ÙßÙØ×-Ñ-¨fÓ5ˆFØ×Ñ Ô'ßÜ—‘˜Ô/ô  # 6›{Ð-=Õ=Òñ+ -ð2 ':×&?Ñ&?Ö&AÑ"ˆLØ× Ñ °T×5JÒ5JÓ$KÑ5J°§V¤VÑ5JÑ$KÔKáØ×ÑØ×(Ñ(Ø—L‘L $§)¡)óç"Ñ"¨8Ð"Ó4öñ	 'B÷ Ü'¨Õ(DÓEÐEñ ùò %Ls   ÅGc                ó4   <€ V ^8„  d   QhRS[ P                  /# ©r`   rb   )r"   Ú
DhcpClient)rd   re   s   "€rB   rf   rg   "  s   ø€ ÷ 95ñ 95™TŸ_™_ñ 95rA   c                óÊ  € V P                   '       d   V P                   # V P                  p\        P                  ! V P                  R. 4      pV'       d}   . p\
        P                  RV4       V FT  p\        P                   F'  pWEP                  8X  g   K  VP                  V4        K<  	  \
        P                  RV4       KV  	  V'       d   TpV F<  p V! 4       V n         \
        P                  RVP                  4       V P                   u # 	  \        P                  ! 4       h  \        P                  3 d%    \
        P                  RTP                  4        KŽ  i ; i)zöaccess the distro's preferred dhcp client

if no client has been selected yet select one - uses
self.dhcp_client_priority, which may be overridden in each distro's
object to eliminate checking for clients which will not be provided
by the distro
z.Using configured dhcp client priority list: %sz4Configured dhcp client %s is not supported, skippingzDHCP client selected: %szDHCP client not found: %s)ÚnetworkrP   )rW   rP   r   Úget_cfg_by_pathrK   r€   r�   r"   rO   Úclient_nameÚappendÚwarningÚNoDHCPLeaseMissingDhclientError)rZ   rP   Úconfig_priorityÚfound_clientsÚclient_configuredÚclient_classÚclients   &      rB   Údhcp_clientÚDistro.dhcp_client!  s>  € ð ××ÐØ×$Ñ$Ð$ð
  $×8Ñ8Ðô ×.Ò.Ø�I‰IÐ:¸Bó
ˆ÷ ð ˆMÜ�I‰IØ@Øôó &5Ð!Ü$(×$9Ô$9�LØ(×,DÑ,DÖDØ%×,Ñ,¨\Ô:Úñ %:ô
 —K‘KØNØ)öñ &5÷ Ø'4Ð$ó +ˆFðKÙ$*£H�Ô!Ü—	‘	Ð4°f×6HÑ6HÔIØ×(Ñ(Ò(ñ	 +ô ×2Ò2Ó4Ð4øô ×8Ñ8Ð:ô KÜ—	‘	Ð5°v×7IÑ7I×JðKús   Ã7D(Ä(6E"Å!E"c                óD   <€ V ^8„  d   QhRS[ S[P                  ,          /# rŸ   )r   r!   ÚNetworkActivator)rd   re   s   "€rB   rf   rg   ^  s   ø€ ÷ 	>ñ 	>¡4©
×(CÑ(CÕ#Dñ 	>rA   c                ót   € \         P                  ! V P                  RR4      p\        P                  ! VR7      # )z£Return the configured network activator for this environment.

:returns: The network activator class to use
:raises: NoActivatorException if no activator is found
N©Úpriority)r¢   r!   )r   r£   rK   r!   Úselect_activator)rZ   r³   s   & rB   Únetwork_activatorÚDistro.network_activator]  s3   € ô ×'Ò'Ø�I‰IÐ0°$ó
ˆô ×*Ò*°HÔ=Ð=rA   c                ó    <€ V ^8„  d   QhRS[ /# rŸ   r&   )rd   re   s   "€rB   rf   rg   j  s   ø€ ÷ 
ñ 
¡(ñ 
rA   c                óì   € \         P                  ! V P                  RR4      p\        P                  ! VR7      w  r#\
        P                  RW!4       V! V P                  P                  V4      R7      pV# )r¢   Nr²   z-Selected renderer '%s' from priority list: %s)Úconfig)r¢   r#   )	r   r£   rK   r#   Úselectr€   r�   Úrenderer_configsr‹   )rZ   r³   rL   Ú
render_clsÚrenderers   &    rB   Únetwork_rendererÚDistro.network_rendereri  sf   € ä×'Ò'Ø�I‰IÐ/°ó
ˆô %×+Ò+°XÔ>ÑˆÜ�	‰	Ø;¸Tô	
ñ  T×%:Ñ%:×%>Ñ%>¸tÓ%DÔEˆØˆrA   c                ó    <€ V ^8„  d   QhRS[ /# )r`   r½   r&   )rd   re   s   "€rB   rf   rg   v  s   ø€ ÷ 5ñ 5¹Hñ 5rA   c                ó(   € VP                  V4       R # ©N)Úrender_network_state)rZ   Únetwork_stater½   s   &&&rB   Ú_write_network_stateÚDistro._write_network_statev  s   € Ø×%Ñ% mÖ4rA   c                óÜ   € \         P                  P                  V P                  \	        V4      4      p\         P                  P                  V4      '       g   \        R V: RV: 24      hV# )zInvalid timezone z, no file found at )ÚosÚpathÚjoinÚtz_zone_dirro   ÚisfileÚIOError)rZ   ÚtzÚtz_files   && rB   Ú_find_tz_fileÚDistro._find_tz_filey  sO   € Ü—'‘'—,‘,˜t×/Ñ/´°R³Ó9ˆÜ�w‰w�~‰~˜g×&Ò&ÝÛ>@Â'ÐJóð ð ˆrA   c                ó8   € V P                   P                  W4      # rÂ   )rK   r‹   )rZ   Úopt_nameÚdefaults   &&&rB   Ú
get_optionÚDistro.get_option�  s   € Ø�y‰y�}‰}˜XÓ/Ð/rA   c                ó"   € W P                   V&   R # rÂ   )rK   )rZ   rÓ   Úvalues   &&&rB   Ú
set_optionÚDistro.set_option„  s   € Ø#�	‰	�(ÓrA   c                ó€   € V P                  W4      pV P                  W0P                  4       V P                  V4       R # rÂ   )Ú_select_hostnameÚ_write_hostnameÚhostname_conf_fnÚ_apply_hostname)rZ   ÚhostnameÚfqdnÚwriteable_hostnames   &&& rB   Úset_hostnameÚDistro.set_hostname‡  s7   € Ø!×2Ñ2°8ÓBÐØ×ÑÐ/×1FÑ1FÔGØ×ÑÐ/Ö0rA   c                 ó   € \        4       # )z?Wrapper to report whether this distro uses systemd or sysvinit.)Úuses_systemdr;   rA   rB   ræ   ÚDistro.uses_systemdŒ  s   € ô ‹~ÐrA   c                ó   € \        4       hrÂ   ©ÚNotImplementedError)rZ   ÚcommandÚargsÚpkgss   &&&&rB   Úpackage_commandÚDistro.package_command‘  s   € ô
 "Ó#Ð#rA   Úforcec               ó6  € V P                    FN  pVP                  4       '       g#   \        P                  R VP                  4       K;   VP                  VR7       KP  	  R#   \         d-   p\        P                  RTP                  T4        Rp?K†  Rp?ii ; i)z8Skipping update for package manager '%s': not available.)rð   z%Failed to update package using %s: %sN)rV   rŽ   r€   r�   rL   Úupdate_package_sourcesÚ	Exceptionr�   )rZ   rð   r–   Úes   &$  rB   rò   ÚDistro.update_package_sources˜  s€   € Ø×,Ô,ˆGØ×$Ñ$×&Ò&Ü—	‘	ØNØ—L‘Lôñ ðØ×.Ñ.°UÐ.Ö;ó -øô ô Ü—	‘	Ø;¸W¿\¹\È1÷ò ûðús   Á	A!Á!BÁ,!BÂBc                óP   € \         P                  ! 4       ^,          pVR9   d   R# V# )é   Úi386)rø   Úi486Úi586Úi686)rÈ   Úuname)rZ   r+   s   & rB   Úget_primary_archÚDistro.get_primary_arch§  s"   € Ü�xŠx‹z˜!�}ˆØÐ3Ô3ÙØˆrA   c                ól   € V P                  R . 4      pV'       g   V P                  4       p\        W!4      # )Úpackage_mirrors)rÕ   rý   Ú_get_arch_package_mirror_info)rZ   r+   Úmirror_infos   && rB   r  Ú$Distro._get_arch_package_mirror_info­  s/   € Ø—o‘oÐ&7¸Ó<ˆßØ×(Ñ(Ó*ˆDÜ,¨[Ó?Ð?rA   c                ó<   € V P                  V4      p\        W#R 7      # ))Údata_sourcer  )r  Ú_get_package_mirror_info)rZ   r+   r  Ú	arch_infos   &&& rB   Úget_package_mirror_infoÚDistro.get_package_mirror_info³  s$   € ð ×6Ñ6°tÓ<ˆ	Ü'Ø#ô
ð 	
rA   c                ó,   € \         P                  ! 4       # rÂ   )r   Úgenerate_fallback_config©rZ   s   &rB   r  ÚDistro.generate_fallback_config»  s   € Ü×+Ò+Ó-Ð-rA   c                ó    <€ V ^8„  d   QhRS[ /# rŸ   ©Úbool)rd   re   s   "€rB   rf   rg   ¾  s   ø€ ÷ ñ Áñ rA   c                ó^  € V P                   p\        WR7      pV P                  WC4       V'       d6   \        P	                  R4        V P
                  pTP                  T4       R# \        P	                  R4       R#   \        P                   d    \        P                  R4        R# i ; i)zïApply the network config.

If bring_up is True, attempt to bring up the passed in devices. If
devices is None, attempt to bring up devices returned by
_write_network_config.

Returns True if any devices failed to come up, otherwise False.
)r½   z/Bringing up newly configured network interfacesz>No network activator found, not bringing up network interfacesTz3Not bringing up newly configured network interfacesF)
r¾   r%   rÅ   r€   r�   rµ   r!   ÚNoActivatorExceptionr¦   Úbring_up_all_interfaces)rZ   Ú	netconfigÚbring_upr½   rÄ   rµ   s   &&&   rB   Úapply_network_configÚDistro.apply_network_config¾  sž   € ð ×(Ñ(ˆÜ-¨iÔKˆØ×!Ñ! -Ô:÷ Ü�I‰IÐGÔHðØ$(×$:Ñ$:Ð!ð ×5Ñ5°mÔDñ ô �I‰IÐKÔLÙøô ×2Ñ2ô Ü—‘ð)ôò ðús   ÁA> Á>*B,Â+B,c                ó   € \        4       hrÂ   ré   )rZ   ÚlocaleÚout_fns   &&&rB   Úapply_localeÚDistro.apply_localeÛ  ó   € ä!Ó#Ð#rA   c                ó   € \        4       hrÂ   ré   )rZ   rÎ   s   &&rB   Úset_timezoneÚDistro.set_timezoneß  r  rA   c                ó   € R # )z	127.0.0.1r;   r  s   &rB   Ú_get_localhost_ipÚDistro._get_localhost_ipã  s   € ÙrA   c                ó   € \        4       hrÂ   ré   r  s   &rB   Ú
get_localeÚDistro.get_localeæ  s   € Ü!Ó#Ð#rA   c                ó   € \        4       hrÂ   ré   )rZ   ÚfilenamerÔ   s   &&&rB   Ú_read_hostnameÚDistro._read_hostnameé  r  rA   c                ó   € \        4       hrÂ   ré   )rZ   rà   r(  s   &&&rB   rÝ   ÚDistro._write_hostnameí  r  rA   c                ó   € \        4       hrÂ   ré   r  s   &rB   Ú_read_system_hostnameÚDistro._read_system_hostnameñ  r  rA   c                óÔ   € \         P                  R V4        \        P                  ! RV.4       R#   \        P                   d!    \        P
                  ! \         RT4        R# i ; i)z2Non-persistently setting the system hostname to %srà   z;Failed to non-persistently adjust the system hostname to %sN)r€   r�   r   ÚProcessExecutionErrorr   Úlogexc)rZ   rà   s   &&rB   rß   ÚDistro._apply_hostnameõ  sU   € ô
 	�	‰	Ø@À(ô	
ð	Ü�IŠI�z 8Ð,Ö-øÜ×)Ñ)ô 	Ü�KŠKÜØMØ÷ð	ús   ˜2 ²1A'Á&A'c                ó’   € \         P                  ! V P                  R V P                  4      '       d   V'       d   V# V'       g   V# V# )Úprefer_fqdn_over_hostname)r   Úget_cfg_option_boolrK   Úprefer_fqdn)rZ   rà   rá   s   &&&rB   rÜ   ÚDistro._select_hostname  s@   € ô ×$Ò$Ø—	‘	Ð6¸×8HÑ8H÷ò ÷ àˆKßØˆKØˆrA   c                óž   € . pV  FD  pV\         9  d   \        R P                  V4      4      hVP                  \         V,          4       KF  	  V# )z&No distributions found for osfamily {})Ú
OSFAMILIESrs   rd   Úextend)Úfamily_listÚdistrosÚfamilys   &  rB   Úexpand_osfamilyÚDistro.expand_osfamily  sN   € àˆÛ!ˆFØœZÔ'Ü Ø<×CÑCÀFÓKóð ð �N‰Nœ: fÕ-Ö.ñ "ð ˆrA   c                ó$  € TpV P                  W4      pV'       d8   \        P                  P                  V4      '       d   V P	                  V4      pMR pV P                  4       w  rg. pV'       d   WQ8w  d   VP                  V4       V'       d   Wu8X  d   Wq8w  d   VP                  V4       V'       d(   V'       d    Wu8w  d   \        P                  RVV4       R # \        \        V U	u. uF  q™'       g   K  V	NK  	  up	4      4      p\        P                  RV\        V4      4       V F  p
 V P                  W4       K  	  Wh9   d   V P#                  V4       R # R # u up	i   \         d!    \        P                   ! \        RY4        Kc  i ; i)Nz6%s differs from %s, assuming user maintained hostname.z/Attempting to update hostname to %s in %s filesz!Failed to write hostname %s to %s)rÜ   rÈ   rÉ   Úexistsr)  r.  r¥   r€   r’   rp   r{   r�   rr   rÝ   rÍ   r   r2  rß   )rZ   rà   rá   Úprev_hostname_fnÚapplying_hostnameÚprev_hostnameÚsys_fnÚsys_hostnameÚupdate_filesÚfÚfns   &&&&       rB   Úupdate_hostnameÚDistro.update_hostname  s`  € Ø$Ðð ×(Ñ(¨Ó8ˆ÷ ¤§¡§¡Ð/?× @Ò @Ø ×/Ñ/Ð0@ÓA‰Mà ˆMð "&×!;Ñ!;Ó!=ÑˆØˆ÷
  Ô 9Ø×ÑÐ 0Ô1÷ ØÔ)¨lÔ.Fà×Ñ Ô'÷
 ŸM¨lÔ.KÜ�H‰HØHØ Øôñ
 ô
 œC©LÓ >©L q»A§ ©LÑ >Ó?Ó@ˆÜ�	‰	Ø=ØÜ�Óô	
ó ˆBðØ×$Ñ$ XÖ2ñ ð Ô!Ø× Ñ Ð!2Ö3ñ "ùò# !?øô ô Ü—’ÜÐ<¸h÷ðús   Ã*	EÃ8EÄ/E$Å$'FÆFc                óv  € R p\         P                  P                  V P                  4      '       d6   \        P
                  ! \        P                  ! V P                  4      4      pM-\        P
                  ! R 4      p\        P                  ! RR7      pV P                  4       pVP                  V4      pRpV'       g   VP                  WRV4       RpMèRpV FQ  pRp	. p
\        V4      ^8¼  d
   V^ ,          p	\        V4      ^8¼  d
   VR,          p
V	f   K?  W’8X  g   KG  W9   g   KO  RpKS  	  V'       dˆ   \        V4      pVP                  W!.4       VP                  V4       V FS  p\        V4      ^8X  d   VP                  WX^ ,          4       K-  \        V4      ^8¼  g   K?  VP                  ! V.VO5!   KU  	  V'       dv   \!        4       pV'       d   VP#                  RV,          4       VP#                  RV,          4       \        P$                  ! V P                  VP'                  4       RR	7       R# R# )
Ú Úadded©ÚbaseFTN:é   NNz%s
i¤  ©Úmode)rÈ   rÉ   rB  Úhosts_fnr   Ú	HostsConfr   Úload_text_fileÚmake_headerr"  Ú	get_entryÚ	add_entryrr   rp   r¥   Údel_entriesr   ÚwriteÚ
write_fileÚgetvalue)rZ   rà   rá   ÚheaderÚehÚlocal_ipÚ	prev_infoÚneed_changert   Ú
entry_fqdnÚentry_aliasesÚnew_entriesÚcontentss   &&&          rB   Úupdate_etc_hostsÚDistro.update_etc_hosts`  s¥  € ØˆÜ�7‰7�>‰>˜$Ÿ-™-×(Ò(Ü—’¤×!4Ò!4°T·]±]Ó!CÓD‰Bä—’ Ó$ˆBÜ×%Ò%¨7Ô3ˆFØ×)Ñ)Ó+ˆØ—L‘L Ó*ˆ	ØˆßØ�L‰L˜¨Ô2Ø‰KàˆKÛ"�Ø!�
Ø "�Ü�u“: ”?Ø!& q¥�JÜ�u“: ”?Ø$)¨"¥I�MØÔ)¨jÖ.@ØÖ0à&+šñ #÷ ä" 9›o�Ø×"Ñ" DÐ#3Ô4Ø—‘˜xÔ(Û(�EÜ˜5“z Q”ØŸ™ X°Q­xÖ8Ü˜U› qžØŸš XÐ6°Ö6ñ	 )÷
 Ü“zˆHßØ—‘˜v¨Õ0Ô1Ø�N‰N˜6 R�=Ô)Ü�OŠO˜DŸM™M¨8×+<Ñ+<Ó+>ÀU×Kñ rA   c                óf   € V P                   '       g   \        \        4      V n         V P                   # )z7Allow distro to determine the preferred ntp client list)Ú_preferred_ntp_clientsrp   ÚPREFERRED_NTP_CLIENTSr  s   &rB   Úpreferred_ntp_clientsÚDistro.preferred_ntp_clients‹  s*   € ð ×*×*Ð*Ü*.Ô/DÓ*EˆDÔ'à×*Ñ*Ð*rA   c                ó$   € V P                  R 4      # )Údefault_user)rÕ   r  s   &rB   Úget_default_userÚDistro.get_default_user“  s   € Ø�‰˜~Ó.Ð.rA   c                ó    <€ V ^8„  d   QhRS[ /# rŸ   r  )rd   re   s   "€rB   rf   rg   –  s   ø€ ÷ wñ w©$ñ wrA   c                ó‚  € \         P                  ! V4      '       d   \        P                  RV4       R# RV9   d   VP	                  R4      pMRpRV.pRV.p\         P
                  ! 4       '       d#   VP                  R4       VP                  R4       RRR	R
RRRRRRRRRRRRRRRR/
pRRRRRR /pR.pVP                  R4      p	V	'       d·   \        V	\        4      '       d   V	P                  R!4      p	\        V	\        4      '       d   \        P                  ! R"V R#2R$R%R&7       V	 U
u. uF  qªP                  4       NK  	  p	p
R!P                  V	4      VR&   VP                  R4      pV'       d   V	P                  V4       V'       dW   V	'       dO   V	 FH  p\         P                   ! V4      '       d   K!  V P#                  V4       \        P%                  R'WÁ4       KJ  	  RVP'                  4       9   d   \        VR,          4      VR&   \)        VP+                  4       4       F¾  w  rÞWÖ9   dt   V'       dl   \        V\        4      '       dV   VP-                  Wm,          V.4       WØ9   d   VP-                  Wm,          R(.4       Kc  VP-                  Wm,          V.4       K~  W×9   g   K†  V'       g   K�  VP                  W},          4       VP                  W},          4       KÀ  	  VP                  R)4      '       g   VP                  R4      '       d$   VP                  R*4       VP                  R*4       M"VP                  R+4       VP                  R+4       \        P%                  R,V4        \.        P.                  ! WER-7       R# u up
i   \0         d$   p\         P2                  ! \        R.T4       ThR/p?ii ; i)0zÁ
Add a user to the system using standard GNU tools

This should be overridden on distros where useradd is not desirable or
not available.

Returns False if user already exists, otherwise True.
z!User %s already exists, skipping.FÚcreate_groupsTÚuseraddú--extrausersÚgecosz	--commentÚhomedirz--homeÚprimary_groupz--gidÚuidz--uidÚgroupsz--groupsÚpasswdú
--passwordÚshellz--shellÚ
expiredatez--expiredateÚinactivez
--inactiveÚselinux_userz--selinux-userÚno_user_groupz--no-user-groupÚsystemz--systemÚno_log_initz--no-log-initÚ,z	The user z) has a 'groups' config value of type dictz22.3z=Use a comma-delimited string or array instead: group1,group2.©Ú
deprecatedÚdeprecated_versionÚextra_messagez created group '%s' for user '%s'ÚREDACTEDÚno_create_homez-Mz-mzAdding user %s)Ú	logstringzFailed to create user %sN)r   Úis_userr€   r’   ÚpopÚsystem_is_snappyr¥   r‹   rn   ro   Úsplitr|   r   Ú	deprecateÚstriprÊ   Úis_groupÚcreate_groupr�   ÚkeysÚsortedr}   r;  r   ró   r2  )rZ   rL   Úkwargsru  Úuseradd_cmdÚlog_useradd_cmdÚuseradd_optsÚuseradd_flagsÚredact_optsr|  Úgrz  ÚgroupÚkeyÚvalrô   s   &&,             rB   Úadd_userÚDistro.add_user–  s9  € ô �<Š<˜×ÒÜ�H‰HÐ8¸$Ô?Ùà˜fÔ$Ø"ŸJ™J Ó7‰Mà ˆMà  $Ð'ˆØ$ dÐ+ˆÜ× Ò ×"Ò"Ø×Ñ˜~Ô.Ø×"Ñ" >Ô2ð �[Ø�xØ˜WØ�7Ø�jØ�lØ�YØ˜.Ø˜ØÐ,ð
ˆð Ð.Ø�jØ˜?ð
ˆð  �jˆð —‘˜HÓ%ˆßÜ˜&¤#×&Ò&ØŸ™ cÓ*�ä˜&¤$×'Ò'Ü×#Ò#Ø!*¨4¨&ð 1#ð  #à'-ð#4õ	ñ *0Ó0© A—g‘g–i©ˆFÐ0ð  #Ÿx™x¨Ó/ˆF�8Ñà"ŸJ™J Ó7ˆMßØ—‘˜mÔ,çŸVÛ�Ü—}’} U×+Ô+Ø×%Ñ% eÔ,Ü—I‘IÐ@À%ÖNñ  ð �F—K‘K“MÔ!Ü  u¥Ó.ˆF�5‰Mô ˜vŸ|™|›~Ö.‰HˆCØÔ"§s¬z¸#¼s×/CÒ/CØ×"Ñ" LÕ$5°sÐ#;Ô<ð Ô%Ø#×*Ñ*¨LÕ,=¸zÐ+JÖKà#×*Ñ*¨LÕ,=¸sÐ+CÖDàÖ%¯#©#Ø×"Ñ" =Õ#5Ô6Ø×&Ñ& }Õ'9Ö:ñ /ð  �:‰:Ð&×'Ò'¨6¯:©:°h×+?Ò+?Ø×Ñ˜tÔ$Ø×"Ñ" 4Õ(à×Ñ˜tÔ$Ø×"Ñ" 4Ô(ô 	�	‰	Ð" DÔ)ð	Ü�IŠI�kÕ=ñ ùòg 1øô\ ô 	Ü�KŠKœÐ7¸Ô>ØˆGûð	ús   Ä-NÍ2N ÎN>ÎN9Î9N>c                ó&  € VP                  R4      pVP                  RR4      p. ROpV'       d   VP                  R4       V'       d   VP                  V4       M\        P                  RV4       \        P	                  RV4        \
        P
                  ! WURR7      w  rg\        P	                  R	Wg4       \        P                  ! V4      pVP                  R
R4      p	V	#   \         d$   p
\        P                  ! \        RT4       T
hRp
?
ii ; i)z4
Add a snappy user to the system using snappy tools
ÚsnapuserÚknownFz--knownzinvalid snap user: %szAdding snap user %sT)r�  Úcapturez snap create-user returned: %s:%sÚusernameNzFailed to create snap user %s)Úsnapzcreate-userz--sudoerz--json)
r‹   r¥   r€   r¦   r�   r   r   Ú	load_jsonró   r2  )rZ   rL   r˜  r¥  r¦  Úcreate_user_cmdÚoutÚerrÚjobjr¨  rô   s   &&,        rB   Úadd_snap_userÚDistro.add_snap_user  sá   € ð
 —:‘:˜jÓ)ˆØ—
‘
˜7 EÓ*ˆÚGˆßØ×"Ñ" 9Ô-ßØ×"Ñ" 8Õ,ä�K‰KÐ/°Ô:ô 	�	‰	Ð'¨Ô.ð		ÜŸšØÀDô‰JˆSô �I‰IÐ8¸#ÔCÜ—>’> #Ó&ˆDØ—x‘x 
¨DÓ1ˆHð
 ˆøô	 ô 	Ü�KŠKœÐ<¸dÔCØˆGûð	ús   ÂAC" Ã"DÃ-DÄDc                ó    <€ V ^8„  d   QhRS[ /# rŸ   r  )rd   re   s   "€rB   rf   rg   -  s   ø€ ÷  ñ  Áñ  rA   c           	     ó®  € \         P                  ! 4       '       d   V P                  V P                  .pMV P                  .pRP	                  V P
                   Uu. uF  pVP                  VR7      NK  	  up4      pV FÍ  p\        P                  P                  V4      '       g   K*  \         P                  ! V4      p\        P                  ! RV R2V\        P                  4      '       g   \        P                  RW4       Kˆ  \        P                  RVV4       \        P                  ! WF\        P                  4      '       g   KÌ   R# 	  R# u upi )	zƒ
Check whether username exists in shadow files with empty password.

Support reading /var/lib/extrausers/shadow on snappy systems.
Ú|)r¨  Ú^Ú:zUser %s not found in %sz0User %s found in %s. Checking for empty passwordTF)r   r�  Úshadow_extrausers_fnÚ	shadow_fnrÊ   Ú#shadow_empty_locked_passwd_patternsrd   rÈ   rÉ   rB  rW  ÚreÚfindallÚ	MULTILINEr€   r�   )rZ   r¨  Úshadow_filesÚpatternÚshadow_empty_passwd_reÚshadow_fileÚshadow_contents   &&     rB   Ú$_shadow_file_has_empty_user_passwordÚ+Distro._shadow_file_has_empty_user_password-  s  € ô × Ò ×"Ò"Ø ×5Ñ5°t·~±~ÐF‰Là ŸN™NÐ+ˆLØ!$§¡ð  $×GÒGóáG�Gð —‘¨�Ö1ÙGñó"
Ðó (ˆKÜ—7‘7—>‘> +×.Ò.ÙÜ!×0Ò0°Ó=ˆNÜ—:’:  8 *¨AÐ.°ÄÇÁ×MÒMÜ—	‘	Ð3°XÔKÙÜ�I‰IØBØØôô
 �zŠzØ&¼¿¹÷ô ò ñ (ñ  ùò+s   ÁEc                óš  € RV9   d   V P                   ! V3/ VB # V P                  ! V3/ VB '       * pRpRpRpRpRV9   d/   RpRpVR,          '       d   V P                  WR,          4       MRpRV9   d1   RpRpVR,          '       d   V P                  WR,          RR7       MRpV'       dL   V'       gC   RV9   d&   Rp\        \        R	\
        P                  R
V3R7       V P                  V4      '       * pMRV9   d   RpRpVR,          '       g   RpVP                  RR4      '       d   V P                  V4       M�V'       g	   V'       d2   V'       d   \        P                  RVV4       V P                  V4       MOV'       d%   \        \        R	\
        P                  RV3R7       M#\        \        R	\
        P                  RV3R7       RV9   d(   VR,          '       d   V P                  WR,          4       RV9   dS   VR,          '       d   V P                  WR,          4       M*VR,          RJ d   \        P                  ! RV R2RRR7       RV9   dÏ   VR,          p\!        V\"        4      '       d   V.pM/\!        V\$        4      '       d   \'        VP)                  4       4      pVeY   \!        V\*        \&        \,        34      '       g#   \        P/                  R\1        V4      4       . pM\-        V4      ;'       g    . p\2        P4                  ! \-        V4      V4       RV9   d™   VP                  R. 4      p	V	'       g!   \        P/                  RVVR,          4       R# VR,          p
\2        P6                  pVP9                  RV
4      pVP9                  RV4      p\2        P4                  ! \-        V	4      WR7       R# )a  
Creates or partially updates the ``name`` user in the system.

This defers the actual user creation to ``self.add_user`` or
``self.add_snap_user``, and most of the keys in ``kwargs`` will be
processed there if and only if the user does not already exist.

Once the existence of the ``name`` user has been ensured, this method
then processes these keys (for both just-created and pre-existing
users):

* ``plain_text_passwd``
* ``hashed_passwd``
* ``lock_passwd``
* ``doas``
* ``sudo``
* ``ssh_authorized_keys``
* ``ssh_redirect_user``
r¥  FNÚplain_text_passwdTÚhashed_passwd)Úhashedr}  z24.3z5'passwd' in user-data is ignored for existing user %s)ÚloggerÚversionÚrequested_levelÚmsgrì   Úlock_passwdzIAllowing unlocking empty password for %s based on empty '%s' in user-datazºNot unlocking blank password for existing user %s. 'lock_passwd: false' present in user-data but no existing password set and no 'plain_text_passwd'/'hashed_passwd' provided in user-dataz—Not unlocking password for user %s. 'lock_passwd: false' present in user-data but no 'passwd'/'plain_text_passwd'/'hashed_passwd' provided in user-dataÚdoasÚsudozThe value of 'false' in user z's 'sudo' configz22.2zUse 'null' instead.r‡  Ússh_authorized_keyszZInvalid type '%s' detected for 'ssh_authorized_keys', expected list, string, dict, or set.Ússh_redirect_userÚcloud_public_ssh_keysz~Unable to disable SSH logins for %s. ssh_redirect_user was set to redirect logins to %s, but no cloud public-keys are present.z$USERz$DISABLE_USER)Úoptions)r¯  r¢  Ú
set_passwdr    r€   ÚloggingÚWARNINGrÁ  r‹   rË  r�   Úunlock_passwdÚwrite_doas_rulesÚwrite_sudo_rulesr   r’  rn   ro   r|   rp   Úvaluesrq   r{   r¦   Útyper   Úsetup_user_keysÚDISABLE_USER_OPTSÚreplace)rZ   rL   r˜  Úpre_existing_userÚhas_existing_passwordÚud_blank_password_specifiedÚud_password_specifiedÚpassword_keyr–  Ú
cloud_keysÚredirect_userÚdisable_options   &&,         rB   Úcreate_userÚDistro.create_userO  sŠ  € ð, ˜ÔØ×%Ò% dÑ5¨fÑ5Ð5ð !%§¢¨dÑ =°fÑ =Ô=Ðà %ÐØ&+Ð#Ø %ÐØˆà &Ô(Ø$(Ð!Ø.ˆLØÐ)×*Ô*à—‘ Ð-@Õ&AÕBà.2Ð+à˜fÔ$Ø$(Ð!Ø*ˆLØ�o×&Ô&à—‘ ¨_Õ&=Àd�ÕKà.2Ð+çß(Ø˜vÔ%Ø#+�Lô 0Ü"Ø &Ü(/¯©ð/à"˜Wõð ×=Ñ=¸dÓCô)Ð%øð ˜6Ô!Ø(,Ð%Ø'�Ø˜h×'Ô'Ø26Ð/ð
 �:‰:�m T×*Ò*Ø×Ñ˜TÕ"ß"×&;÷ +Ü—	‘	ð)àØ ô	ð ×Ñ˜tÕ$ßô (ÜØÜ '§¡ð)ð �Wö	ô (ÜØÜ '§¡ð8ð �Wõð �VÔØ�f�~Œ~Ø×%Ñ% d°6­NÔ;ð �VÔØ�f�~Œ~Ø×%Ñ% d°6­NÕ;Ø˜• 5Ó(Ü×#Ò#Ø!>¸t¸fð E$ð  $à'-Ø"7õ	ð ! FÔ*àÐ/Õ0ˆDÜ˜$¤×$Ò$Ø�v‘Ü˜D¤$×'Ò'Ü˜DŸK™K›MÓ*�ØÒÜ! $¬´´cÐ(:×;Ò;Ü—K‘Kð1ô ˜T›
ô	ð ‘Dä˜t›9Ÿ?˜?¨�DÜ×$Ò$¤S¨£Y°Ô5Ø &Ô(ØŸ™Ð$;¸RÓ@ˆJßÜ—‘ðAð ØÐ.Õ/ôñ ð !'Ð':Õ ;�Ü!)×!;Ñ!;�Ø!/×!7Ñ!7¸ÀÓ!O�Ø!/×!7Ñ!7¸ÈÓ!N�Ü×(Ò(Ü˜
“O Tõñ rA   c                óX  € RRV.RRV.3p \        R V 4       4      p \        P                  ! T4       R	#   \         d7   p\        RT: RT Uu. uF  qU^ ,          NK  	  Mu upi up: R24      ThR	p?ii ; i  \         d$   p\
        P                  ! \        R
T4       ThR	p?ii ; i)z<
Lock the password of a user, i.e., disable password logins
r}  z-lÚusermodz--lockc              3   óp   "  € T F,  p\         P                  ! V^ ,          4      '       g   K(  Vx € K.  	  R# 5i©r   N©r   Úwhich©Ú.0Útools   & rB   Ú	<genexpr>Ú%Distro.lock_passwd.<locals>.<genexpr>
  s!   é € ÐJ©
 ´d·j²jÀÀaÅ×6I—t’t«
ùó   ‚%6¬
6zUnable to lock user account 'ú '. No tools available.   Tried: Ú.Nz&Failed to disable password for user %s©ÚnextÚStopIterationÚRuntimeErrorr   ró   r   r2  r€   )rZ   rL   Ú
lock_toolsÚcmdrô   Úcs   &&    rB   rË  ÚDistro.lock_passwd  sª   € ð
    tÐ,¨y¸(ÀDÐ.IÐJˆ
ð	ÜÑJ©
ÓJÓJˆCð	Ü�IŠI�cŽNøô ô 	Ýã"&±zÓ(B±z°!¨1¯¨²zù×(BðDóð ðûð	ûô ô 	Ü�KŠKœÐEÀtÔLØˆGûð	ús8   Œ7 ŸA; ·A8ÁA3ÁA"Á!A3Á3A8Á;B)ÂB$Â$B)c                ó    <€ V ^8„  d   QhRS[ /# )r`   rL   ©ro   )rd   re   s   "€rB   rf   rg     s   ø€ ÷ *ñ *¡#ñ *rA   c                óÌ  € RRV.RRV.3p \        R V 4       4      p \        P                  ! T^ ^.R
7      w  rgT'       d8   RRT.RRRT.3p \        R T 4       4      p \        P                  ! T4       R	# R	#   \         d7   p\        RT: RT Uu. uF  qU^ ,          NK  	  Mu upi up: R24      ThR	p?ii ; i  \         d$   p\
        P                  ! \        RT4       ThR	p?ii ; i  \         d7   p\        RT: RT Uu. uF  qU^ ,          NK  	  Mu upi up: R24      ThR	p?ii ; i  \         d$   p\
        P                  ! \        RT4       ThR	p?ii ; i)z=
Unlock the password of a user, i.e., enable password logins
r}  z-urè  z--unlockc              3   óp   "  € T F,  p\         P                  ! V^ ,          4      '       g   K(  Vx € K.  	  R# 5irê  rë  rí  s   & rB   rð  Ú'Distro.unlock_passwd.<locals>.<genexpr>  s!   é € ÐL© ¼¿
º
À4ÈÅ7×8K—t’t«ùrò  zUnable to unlock user account 'ró  rô  N)Úrcsz%Failed to enable password for user %sz-dr~  z''c              3   óp   "  € T F,  p\         P                  ! V^ ,          4      '       g   K(  Vx € K.  	  R# 5irê  rë  rí  s   & rB   rð  r  1  s%   é € ð Ù%5˜T¼¿ºÀDÈÅG×9L—D’DÓ%5ùrò  z/Unable to set blank password for user account 'z(Failed to set blank password for user %srõ  )	rZ   rL   Úunlock_toolsrú  rô   rû  Ú_r­  Úpasswd_set_toolss	   &&       rB   rÕ  ÚDistro.unlock_passwd  sz  € ð
 " 4¨Ð.°¸JÈÐ0MÐNˆð	ÜÑL©ÓLÓLˆCð	Ü—Y’Y˜s¨¨A¨Ô/‰FˆA÷ ð
 ˜4 Ð&Ø˜L¨$°Ð5ð Ðð	Üñ Ù%5óó �ðÜ—	’	˜#–ñ' øô ô 	Ýã"&±|Ó(D±|°!¨1¯¨²|ù×(DðFóð ðûð	ûô ô 	Ü�KŠKœÐDÀdÔKØˆGûð	ûô !ô Ý"ó '+¹<Ó,H¹<°a¨q¯T¨Tº<ù×,HðJóð ð	ûðûô ô Ü—’ÜÐCÀTôð �ûð	úsv   ŒA< ŸC  ÁC1 Á"D5 Á<B=ÂB8ÂB'Â&B8Â8B=Ã C.ÃC)Ã)C.Ã1D2Ã<D-Ä
DÄD-Ä-D2Ä5E#Å EÅE#c                óœ   €  \         P                   ! R RV.4       R#   \         d$   p\        P                  ! \        RT4       ThRp?ii ; i)r}  z--expirezFailed to set 'expire' for %sN)r   ró   r   r2  r€   )rZ   Úuserrô   s   && rB   Úexpire_passwdÚDistro.expire_passwdB  s@   € ð	Ü�IŠI�x ¨TÐ2Ö3øÜô 	Ü�KŠKœÐ<¸dÔCØˆGûð	ús   ‚ �A¨AÁAc                óò   € V: R V: 2pR.pV'       d   VP                  R4        \        P                  ! WTRV,          R7       R#   \         d$   p\        P                  ! \
        RT4       ThRp?ii ; i)rµ  Úchpasswdú-ezchpasswd for %s)Údatar�  zFailed to set password for %sNT)r¥   r   ró   r   r2  r€   )rZ   r	  r}  rÆ  Úpass_stringrú  rô   s   &&&&   rB   rÒ  ÚDistro.set_passwdI  sm   € Û!%¢vÐ.ˆØˆlˆçð �J‰J�tÔð	Ü�IŠIØÐ1BÀTÕ1Iõñ øô	 ô 	Ü�KŠKœÐ<¸dÔCØˆGûð	ús   §A ÁA6ÁA1Á1A6c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r`   Úplist_inrÆ  )rp   r  )rd   re   s   "€rB   rf   rg   ]  s   ø€ ÷ %ñ %¡ð %©tñ %rA   c                óœ   € R P                  R V 4       4      R ,           pR.V'       d   R.M. ,           p\        P                  ! WCR7       R# )Ú
c              3   óJ   "  € T F  w  rR P                  W.4      x € K  	  R# 5i)rµ  N©rÊ   )rî  rL   Úpasswords   &  rB   rð  Ú"Distro.chpasswd.<locals>.<genexpr>`  s!   é € ÐKÁ(±°�—‘˜4Ð*×+Ð+Ã(ùs   ‚!#r  r  )r  N)rÊ   r   )rZ   r  rÆ  Úpayloadrú  s   &&&  rB   r  ÚDistro.chpasswd]  sE   € à�I‰IÙKÁ(ÓKóð õð 	ð ˆl¯˜t™f°BÕ7ˆÜ�	Š	�#×$rA   c                óŽ  € R p\         P                  RW4       \        P                  ! W24      pV'       dz   \         P                  RVP	                  ^4      4       VP	                  ^4      V8X  d   \         P                  R4       R# \         P                  RVP	                  ^4      4       R# \         P                  R4       R# )z²^(?:permit|deny)(?:\s+(?:nolog|nopass|persist|keepenv|setenv \{[^}]+\})+)*\s+([a-zA-Z0-9_]+)+(?:\s+as\s+[a-zA-Z0-9_]+)*(?:\s+cmd\s+[^\s]+(?:\s+args\s+[^\s]+(?:\s*[^\s]+)*)*)*\s*$z3Checking if user '%s' is referenced in doas rule %rz!User '%s' referenced in doas rulez'Correct user is referenced in doas ruleTz.Incorrect user '%s' is referenced in doas ruleFz/doas rule does not appear to reference any user)r€   r�   r¹  ÚsearchrŸ  )rZ   r	  ÚruleÚrule_patternÚvalid_matchs   &&&  rB   Úis_doas_rule_validÚDistro.is_doas_rule_validj  s¥   € ðð 	ô 	�	‰	ØAÀ4ô	
ô —i’i Ó3ˆßÜ�I‰IØ3°[×5FÑ5FÀqÓ5Iôð × Ñ  Ó# tÔ+Ü—	‘	ÐCÔDÙä—	‘	ØDØ×%Ñ% aÓ(ôñ ä�I‰IÐGÔHÙrA   c                ó:  € V'       g   V P                   pV F=  pV P                  W4      '       d   K  R V: RV: R2p\        P                  V4        R# 	  RRV,          .pV F  pVP	                  RV,          4       K  	  RP                  V4      pVR,          p\        P                  P                  V4      '       gC   \        P                  ! 4       V.p \        P                  ! VRP                  V4      RR	7       R# V\        P                  ! V4      9  d    \        P                  ! W74       R# R#   \         d$   p	\        P                  ! \        R
T4       T	hRp	?	ii ; i  \         d$   p	\        P                  ! \        RT4       T	hRp	?	ii ; i)zInvalid doas rule z for user 'z'', not writing any doas rules for user!NrN  z# cloud-init User rules for %sú%sr  é   rS  zFailed to write doas file %sz Failed to append to doas file %s)Údoas_fnr!  r€   r�   r¥   rÊ   rÈ   rÉ   rB  r   rX  r]  rÍ   r2  rW  Úappend_file)
rZ   r	  ÚrulesÚ	doas_filer  rÊ  ÚlinesÚcontentrg  rô   s
   &&&&      rB   rÖ  ÚDistro.write_doas_rulesŠ  sU  € ßØŸ™ˆIãˆDØ×*Ñ*¨4×6Õ6ó @DÃTðKð ô —	‘	˜#”Úñ ð Ð5¸Õ<Ð=ˆÛˆDØ�L‰L˜ �Ö%ñ à—)‘)˜EÓ"ˆØ�4�ˆä�w‰w�~‰~˜i×(Ò(Ü×(Ò(Ó*¨GÐ4ˆHðÜ—’ 	¨4¯9©9°XÓ+>ÀU×Kð
 œd×1Ò1°)Ó<Ô<ðÜ×$Ò$ YÖ8ñ =øô	 ô Ü—’œCÐ!?ÀÔKØ�ûðûô ô Ü—K’KÜÐ?Àôð �Gûð	ús0   Ã(D; Ä!E, Ä;E)ÅE$Å$E)Å,FÅ7FÆFc                óŽ  € R pRpRp\         P                  P                  V4      '       d   \        P                  ! V4      pRpM;\         P                  P                  V4      '       d   \        P                  ! V4      pRpVP                  4        F†  pVP                  4       p\        P                  ! RV4      pV'       g   K4  VP                  ^4      P                  4       p	V	'       g   K]  \         P                  P                  V	4      p	W‘8X  g   K„  Rp M	  V'       gÚ    V'       gr   RR \        P                  ! RR7      RV,          R .p
V'       d   \        P                  R	V4       VR
P                  V
4      ,          p\        P                  ! W#R4       MIR \        P                  ! RR7      RV,          R .p
R
P                  V
4      p\        P                   ! W#4       \        P#                  RW4       \        P(                  ! VR4       R#   \$         d$   p\        P&                  ! \        RT4       ThRp?ii ; i)rN  Fz/usr/etc/sudoersTz^[#|@]includedir\s+(.*)$z?# See sudoers(5) for more information on "#include" directives:rO  rP  z#includedir %szUsing content from '%s'r  r%  zAdded '#includedir %s' to %szFailed to write %sNiè  )rÈ   rÉ   rB  r   rW  Ú
splitlinesr“  r¹  r  rŸ  ÚabspathrX  r€   r’   rÊ   r]  r'  r�   rÍ   r2  Ú
ensure_dir)rZ   rÉ   Ú	sudo_baseÚsudoers_contentsÚbase_existsÚsystem_sudo_baseÚfound_includeÚlineÚinclude_matchÚincluded_dirr*  rô   s   &&&         rB   Úensure_sudo_dirÚDistro.ensure_sudo_dir®  sÔ  € ð ÐØˆØ-ÐÜ�7‰7�>‰>˜)×$Ò$Ü#×2Ò2°9Ó=ÐØ‰KÜ�W‰W�^‰^Ð,×-Ò-Ü#×2Ò2Ð3CÓDÐØˆØ$×/Ñ/Ö1ˆDØ—:‘:“<ˆDÜŸIšIÐ&AÀ4ÓHˆMß ÙØ(×.Ñ.¨qÓ1×7Ñ7Ó9ˆLßÙÜŸ7™7Ÿ?™?¨<Ó8ˆLØÖ#Ø $�Ùñ 2÷ ðß"ð5àÜ×(Ò(¨gÔ6Ø(¨DÕ1Øð�E÷ (ÜŸ™Ð!:Ð<LÔMØ$¨¯	©	°%Ó(8Õ8Ð$Ü—O’O IÀÕGð Ü×(Ò(¨gÔ6Ø(¨DÕ1Øð	�Eð (,§y¡y°Ó'7Ð$Ü×$Ò$ YÔAÜ—	‘	Ð8¸$ÔJô 	�Š˜˜eÖ$øô ô Ü—’œCÐ!5°yÔAØ�ûðús%   Ä%H Ä-*H ÅB%H ÈIÈ!H?È?Ic                óö  € V'       g   V P                   pR RV,          .p\        V\        \        34      '       d#   V F  pVP	                  V: RV: 24       K  	  MW\        V\
        4      '       d   VP	                  V: RV: 24       M(Rp\        V\        P                  ! V4      ,          4      hRP                  V4      pVR,          pV P                  \        P                  P                  V4      4       \        P                  P                  V4      '       gB   \        P                   ! 4       V.p \        P"                  ! VRP                  V4      R4       R# V\        P*                  ! V4      9  d    \        P,                  ! W74       R# R#   \$         d$   p	\        P&                  ! \(        RT4       T	hRp	?	ii ; i  \$         d$   p	\        P&                  ! \(        RT4       T	hRp	?	ii ; i)	rN  z# User rules for %sÚ z1Can not create sudoers rule addition with type %rr  r%  zFailed to write sudoers file %sNz#Failed to append to sudoers file %s)Úci_sudoers_fnrn   rp   rq   r¥   ro   Ú	TypeErrorr   Úobj_namerÊ   r9  rÈ   rÉ   ÚdirnamerB  r   rX  r]  rÍ   r2  r€   rW  r'  )
rZ   r	  r(  Ú	sudo_filer*  r  rÊ  r+  rg  rô   s
   &&&&      rB   r×  ÚDistro.write_sudo_rulesä  sŠ  € ßØ×*Ñ*ˆIð Ø! DÕ(ð
ˆô �eœd¤E˜]×+Ò+Û�Ø—‘«ªdÐ3Ö4ò ä˜œs×#Ò#Ø�L‰L£Dª%Ð0Õ1àEˆCÜ˜C¤:×#6Ò#6°uÓ#=Õ>Ó?Ð?Ø—)‘)˜EÓ"ˆØ�4�ˆà×ÑœRŸW™WŸ_™_¨YÓ7Ô8ä�w‰w�~‰~˜i×(Ò(ä× Ò Ó"ØðˆHðÜ—’ 	¨4¯9©9°XÓ+>ÀÖFð
 œd×1Ò1°)Ó<Ô<ðÜ×$Ò$ YÖ8ñ =øô	 ô Ü—’œCÐ!BÀIÔNØ�ûðûô ô Ü—K’KÜÐBÀIôð �Gûð	ús0   Ä:'F Å?G
 ÆGÆ$GÇGÇ
G8ÇG3Ç3G8c                ó”  € R V.p\         P                  ! 4       '       d   VP                  R4       V'       g   . p\         P                  ! V4      '       d   \        P                  RV4       M- \        P                  ! V4       \        P                  RV4       \        V4      ^ 8”  dq   V Fh  p\         P                  ! V4      '       g   \        P                  RVV4       K8  \        P                  ! RRRW.4       \        P                  R	WA4       Kj  	  R
# R
#   \         d     \         P                  ! \        RT4        L«i ; i)Úgroupaddrw  z(Skipping creation of existing group '%s'zCreated new group %szFailed to create group %szCUnable to add group member '%s' to group '%s'; user does not exist.rè  z-az-GzAdded user '%s' to group '%s'N)r   r�  r¥   r”  r€   r¦   r   r’   ró   r2  rr   rŽ  )rZ   rL   ÚmembersÚgroup_add_cmdÚmembers   &&&  rB   r•  ÚDistro.create_group  s  € Ø# TÐ*ˆÜ× Ò ×"Ò"Ø× Ñ  Ô0ßØˆGô �=Š=˜×ÒÜ�K‰KÐBÀDÕIðDÜ—	’	˜-Ô(Ü—‘Ð/°Ô6ô
 ˆw‹<˜!ÔÛ!�Ü—|’| F×+Ò+Ü—K‘Kð1àØô	ñ ä—	’	˜9 d¨D°$Ð?Ô@Ü—‘Ð8¸&ÖGó "ñ øô	 ô DÜ—’œCÐ!<¸dÖCðDús   Á/,D Ä'EÅEc               óð   € R V P                   V,          .p VR8w  d   R\        V4      ,          pYB.,           pT'       d   TP	                  T4       T#   \         d   p\        RT: R24      ThRp?ii ; i)ÚshutdownÚnowz+%dz;power_state[delay] must be 'now' or '+m' (minutes). found 'z'.N)Úshutdown_options_maprc   rs   r>  r¥   )ÚclsrT  ÚdelayÚmessagerë   rô   rì   s   &$$$   rB   Úshutdown_commandÚDistro.shutdown_command-  s   € ð ˜s×7Ñ7¸Õ=Ð>ˆð	Ø˜Œ~Ø¤ E£
Õ*�ð ˜Õ ˆßØ�K‰K˜Ô Øˆøô ô 	Ýã"'ð*óð ðûð	ús   —A ÁA5ÁA0Á0A5c                ó   € R# )z@
Reload systemd startup daemon.
May raise ProcessExecutionError
Nr;   )rM  r  s   &&rB   Úreload_initÚDistro.reload_init>  s   € ñ rA   r  c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r`   ÚactionrE   Ú
extra_argsrþ  )rd   re   s   "€rB   rf   rg   G  s%   ø€ ÷ "5ñ "5Ùð"5Ù#&ð"5Ù58ñ"5rA   c               óT  € V P                   pV P                  4       '       g   RV9   d'   R.pRRV.RRV.RRV.RRV.RRV.RRV.R	R
V.RRV./pM"RVR.RVR.RVR.RVR.RVR.RVR.R	VR.RVR./pWVV,          ,           \        V4      ,           p\        P                  ! VRVR7      # )z¶
Perform the requested action on a service. This handles the common
'systemctl' and 'service' cases and may be overridden in subclasses
as necessary.
May raise ProcessExecutionError
Ú	systemctlÚstopÚstartÚenableÚdisableÚrestartÚreloadzreload-or-restartz
try-reloadztry-reload-or-restartÚstatusT)r§  r  )Úinit_cmdræ   rp   r   )rM  rV  rE   r  rW  ra  Úcmdsrú  s   &&&$*   rB   Úmanage_serviceÚDistro.manage_serviceF  s  € ð —<‘<ˆØ×Ñ×Ò °Ô!8Ø#�}ˆHà˜ Ð)Ø˜' 7Ð+Ø˜8 WÐ-Ø˜I wÐ/Ø˜I wÐ/ØÐ.°Ð8ØÐ6¸Ð@Ø˜8 WÐ-ð	‰Dð ˜ &Ð)Ø˜' 7Ð+Ø˜7 GÐ,Ø˜G VÐ,Ø˜G YÐ/Ø˜7 IÐ.Ø˜w¨	Ð2Ø˜7 HÐ-ð	ˆDð ˜f�Õ%¬¨ZÓ(8Õ8ˆÜ�yŠy˜ d°Ô4Ð4rA   c                ó2   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ /# )r`   ÚlayoutÚmodelÚvariantrÑ  rþ  )rd   re   s   "€rB   rf   rg   k  s)   ø€ ÷ (ñ (¡ð (©Sð (¹3ð (Éñ (rA   c                ó~   € V P                  4       '       d   \        P                  ! R RVVVV.4       R# \        4       h)Ú	localectlzset-x11-keymapN)ræ   r   rê   )rZ   rf  rg  rh  rÑ  s   &&&&&rB   Ú
set_keymapÚDistro.set_keymapk  s?   € Ø×Ñ×ÒÜ�IŠIàØ$ØØØØðö	ô &Ó'Ð'rA   c                ó    <€ V ^8„  d   QhRS[ /# rŸ   rþ  )rd   re   s   "€rB   rf   rg   z  s   ø€ ÷ Iñ I¡3ñ IrA   c                óÄ   € \         P                  ! R R7      p\        P                  ! VR4      '       g   V# \        P
                  P                  V P                  RR4      # )T)Ú	needs_exeÚnoexecz
cloud-initÚclouddir)r   Úget_tmp_ancestorr   Úhas_mount_optrÈ   rÉ   rÊ   Úusr_lib_exec)rZ   Útmp_dirs   & rB   Úget_tmp_exec_pathÚDistro.get_tmp_exec_pathz  sG   € Ü×-Ò-¸Ô=ˆÜ×!Ò! '¨8×4Ò4ØˆNÜ�w‰w�|‰|˜D×-Ñ-¨|¸ZÓHÐHrA   c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r`   rë   r	  Úcwd)rp   ro   )rd   re   s   "€rB   rf   rg   €  s"   ø€ ÷ 
ñ 
™Tð 
©ð 
±3ñ 
rA   c                ó¢   € V'       d   RV R2MRp\         P                   ! RRVRVR,           RP                  R	 V 4       4      ,           .3/ VB # )
a0  
Perform a command as the requested user. Behaves like subp()

Note: We pass `PATH` to the user env by using `env`. This could be
probably simplified after bionic EOL by using
`su --whitelist-environment=PATH ...`, more info on:
https://lore.kernel.org/all/20180815110445.4qefy5zx5gfgbqly@ws.net.home/T/
zcd z && rN  Úsur8   z-czenv PATH=$PATH r<  c              3   óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5irÂ   )ÚshlexÚquote)rî  Úargs   & rB   rð  ÚDistro.do_as.<locals>.<genexpr>’  s   é € Ð?±w°œ5Ÿ;š; s×+Ð+³wùs   ‚#%)r   rÊ   )rZ   rë   r	  ry  r˜  Ú	directorys   &&&&, rB   Údo_asÚDistro.do_as€  sd   € ÷ (+�c˜#˜˜d‘O°ˆ	Ü�yŠyàØØØØØ#õ$à—(‘(Ñ?±wÓ?Ó?õ@ðñ
ð ñ
ð 	
rA   c                ó>   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[ RS[/# )r`   rÉ   Ú
lease_fileÚpid_fileÚ	interfaceÚconfig_filerb   ©ro   rp   )rd   re   s   "€rB   rf   rg   ˜  sM   ø€ ÷ Nñ NÙðNáðNñ ðNñ ð	Nñ
 ðNñ 
ñNrA   c           	     óL   € V R RRVRVRR.	V'       d   RWC.,           # V.,           # )z-1z-vz-lfz-pfz-sfz	/bin/truez-cfr;   )rÉ   r…  r†  r‡  rˆ  s   &&&&&rB   Úbuild_dhclient_cmdÚDistro.build_dhclient_cmd—  sQ   € ð ØØØØØØØØð

÷ 1<ˆe�[Ð,õ
Nð 
	Nð CLÀõ
Nð 
	NrA   c                óÎ   € V P                   fM   \        P                  ! 4       V n         V P                   '       g!   \        P	                  RV P
                  4       V P                   # )zADetermine the network interface used during local network config.z0Did not find a fallback interface on distro: %s.)rX   r   Úfind_fallback_nicr€   r¦   rL   r  s   &rB   Úfallback_interfaceÚDistro.fallback_interface«  sQ   € ð ×#Ñ#Ò+Ü'*×'<Ò'<Ó'>ˆDÔ$Ø×+×+Ð+Ü—‘ØFØ—I‘Iôð ×'Ñ'Ð'rA   c                ó   € Wn         R # rÂ   )rX   )rZ   rØ   s   &&rB   r�  r�  ·  s   € à#(Ö rA   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# ©r`   Úpidrb   ©rc   r   )rd   re   s   "€rB   rf   rg   ¼  ó   ø€ ÷ ñ ™3ð ¡8©C¥=ñ rA   c                óè   € \         P                  V ^4      pVe.   \        \        4      ;_uu_ 4        \	        V4      uuRRR4       # R#   + '       g   i     M; i\
        P                  RY4       L,)ú=Return the parent pid of a process by parsing /proc/$pid/statNz&/proc/%s/stat has an invalid ppid [%s]©rD   Ú_get_proc_stat_by_indexr   rs   rc   r€   r¦   ©r”  Úmatchs   & rB   Úget_proc_ppidÚDistro.get_proc_ppid»  óS   € ô ×.Ñ.¨s°AÓ6ˆØÒÜœ*×%Õ%Ü˜5“z÷ &Ò%ñ ÷ &×%úä�K‰KÐ@À#ÕMó   ²A
Á
A	c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# r“  r•  )rd   re   s   "€rB   rf   rg   Æ  r–  rA   c                óè   € \         P                  V ^4      pVe.   \        \        4      ;_uu_ 4        \	        V4      uuRRR4       # R#   + '       g   i     M; i\
        P                  RY4       L,)r˜  Nz&/proc/%s/stat has an invalid pgid [%s]r™  r›  s   & rB   Úget_proc_pgidÚDistro.get_proc_pgidÅ  rŸ  r   c                ó<   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          /# )r`   r”  Úfieldrb   r•  )rd   re   s   "€rB   rf   rg   Ð  s&   ø€ ÷ ñ ¡Sð ±ð ¹Á#½ñ rA   c                óª  €  \         P                  ! RV ,          RR7      P                  4       p\        P                  ! RV4      pV'       g   \
        P                  RW4       R# \        VP                  V4      4      #   \         d"   p\
        P                  RY4        Rp?R# Rp?i\         d    \
        P                  RTT XX4        R# i ; i)	z³
parse /proc/$pid/stat for a specific field as numbered in man:proc(5)

param pid: integer to query /proc/$pid/stat for
param field: field number within /proc/$pid/stat to return
z/proc/%s/statT)Úquietz,^(\d+) (\(.+\)) ([RSDZTtWXxKPI]) (\d+) (\d+)z*/proc/%s/stat has an invalid contents [%s]Nz Failed to load /proc/%s/stat. %sz4Unable to match field %s of process pid=%s (%s) (%s))r   rW  r“  r¹  r  r€   r¦   rc   rŸ  rÍ   Ú
IndexError)r”  r¦  r+  rœ  rô   s   &&   rB   rš  ÚDistro._get_proc_stat_by_indexÏ  sÁ   € ð	Ü×.Ò.Ø #Õ%¨Tôç‰e‹gð ô —I’IØ?ÀóˆE÷ Ü—‘Ø@À#ôñ Ü�u—{‘{ 5Ó)Ó*Ð*øÜô 	DÜ�K‰KÐ:¸C×CÐCñ ûô ô 	Ü�K‰KØFØØØØõñ ð	ús0   ‚AB  ÁB  Á&B  Â CÂB'Â'CÂ4CÃCc                ó$   <€ V ^8„  d   QhRS[ RR/# )r`   Údevicerb   Nrþ  )rd   re   s   "€rB   rf   rg   ñ  s   ø€ ÷ ñ ™Cð  Dñ rA   c                óî   € R p\         P                  ! R4      '       d   RV .pM;\         P                  ! R4      '       d   RRV .pM\         P                  ! RRRR7      h\         P                   ! V4       R # )NÚejectz/lib/udev/cdrom_idz--eject-mediaÚeject_media_cmdzeject command not foundz.neither eject nor /lib/udev/cdrom_id are found)rú  ÚdescriptionÚreason)r   rì  r1  )r¬  rú  s   & rB   Úeject_mediaÚDistro.eject_mediað  se   € àˆÜ�:Š:�g×ÒØ˜FÐ#‰CÜ�ZŠZÐ,×-Ò-Ø'¨¸&ÐA‰Cä×,Ò,Ø%Ø5ØGôð ô
 	�	Š	�#ŽrA   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# )r`   Úblockdevrb   )ro   r   )rd   re   s   "€rB   rf   rg      s   ø€ ÷ ñ ¡Cð ©H±S­Mñ rA   c                ó¢   € \         P                  P                  V 4      pVP                  R4      '       d   \        P                  RW4       V# R# )zôReturns underlying block device for a mapped device.

If it is mapped, blockdev will usually take the form of
/dev/mapper/some_name

If blockdev is a symlink pointing to a /dev/dm-* device, return
the device pointed to. Otherwise, return None.
z/dev/dm-z$%s is a mapped device pointing to %sN)rÈ   rÉ   ÚrealpathÚ
startswithr€   r�   )rµ  r·  s   & rB   Úget_mapped_deviceÚDistro.get_mapped_deviceÿ  sD   € ô —7‘7×#Ñ# HÓ-ˆØ×Ñ˜z×*Ò*Ü�I‰IØ6¸ôð ˆOÙrA   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r`   Údevpathrb   )ro   rq   )rd   re   s   "€rB   rf   rg     s   ø€ ÷ !"ñ !"¡#ð !"©%ñ !"rA   c                óH  € \         P                  P                  V 4      p\         P                  P                  V4      pRV,          p\         P                  P	                  V4      '       g   \        V : RV: R24      h\         P                  P                  VR4      p\         P                  P	                  V4      '       g   \        RV ,          4      h\        P                  ! V4      P                  4       p\         P                  P                  V4      p\         P                  P                  V4      p\        P                  ! \         P                  P                  VR4      4      P                  4       p\         P                  P                  RV,          4      p	W•3# )z£convert an entry in /dev/ to parent disk and partition number

input of /dev/vdb or /dev/disk/by-label/foo
rpath is hopefully a real-ish path in /dev (vda, sdb..)
z/sys/class/block/%sz had no syspath (Ú)Ú	partitionz%s not a partitionÚdevz/dev/block/%s)rÈ   rÉ   r·  ÚbasenamerB  rs   rÊ   r>  r   rW  Úrstripr@  )
r¼  ÚrpathÚbnameÚsyspathÚptpathÚptnumÚrsyspathÚdisksyspathÚ
diskmajminÚdiskdevpaths
   &         rB   Údevice_part_infoÚDistro.device_part_info  s$  € ô —‘× Ñ  Ó)ˆä—‘× Ñ  Ó'ˆØ'¨%Õ/ˆä�w‰w�~‰~˜g×&Ò&Ü»Ã'ÐJÓKÐKä—‘—‘˜g {Ó3ˆÜ�w‰w�~‰~˜f×%Ò%ÜÐ0°7Õ:Ó;Ð;ä×#Ò# FÓ+×2Ñ2Ó4ˆô —7‘7×#Ñ# GÓ,ˆÜ—g‘g—o‘o hÓ/ˆä×(Ò(Ü�G‰G�L‰L˜ eÓ,ó
ç
‰&‹(ð 	ô —g‘g×&Ñ& ¸Õ'CÓDˆð
 Ð!Ð!rA   c                ó   <€ V ^8„  d   QhRR/# )r`   rb   Nr;   )rd   re   s   "€rB   rf   rg   5  s   ø€ ÷ ñ  $ñ rA   c                ó   € R# )aI  Ensure that cloud-init has network connectivity.

For most distros, this is a no-op as cloud-init's network service is
ordered in boot to start after network connectivity has been achieved.
As an optimization, distros may opt to order cloud-init's network
service immediately after cloud-init's local service, and only
require network connectivity if it has been deemed necessary.
This method is a hook for distros to implement this optimization.
It is called during cloud-init's network stage if it was determined
that network connectivity is necessary in cloud-init's network stage.
Nr;   r  s   &rB   Úwait_for_networkÚDistro.wait_for_network5  s   ‚ rA   c                óê   <€ V ^8„  d   Qh/ S[ S[,          ;R&   S[S[S[S[S[3,          3,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[;R&   S[S[,          ;R&   S[S[,          ;R&   # )r`   ra  r»   rM   rS   ÚosfamilyÚdhclient_lease_directoryÚdhclient_lease_file_regex)	r   ro   r	   r
   r   r   r   r$   r   )rd   re   s   "€rB   rf   rg   ‚   s‰   ø‡ ‚ ñ ‘3�iÑ%ñ ñ ™c¡>±#±s°(Õ#;Ð;Õ<ÑAñ ñ  ™Õ$Ñ6ñ! ñ( ‘&�\Ñ-ñ) ñ4 �Mñ5 ñ< '¡s�mÑ2ñ= ñD  (©�}Ñ3òE rA   )rK   rW   rX   rJ   rk  rU   rP   rY   rL   rS   rN   rV   rÂ   )NN)F)z/etc/sudoers)rN  )fr<   r=   r>   r?   Úpip_package_namert  rU  r&  r=  rÞ   r·  r¶  r¸  rË   Údefault_ownerra  r»   rk  r   rM   rL  rQ   rR   rS   Ú_ci_pkl_versionr7  Úresolve_conf_fnrÔ  rÕ  r]   rk   ru   r‡   r‘   Úpropertyr­   rµ   r¾   rÅ   rÐ   rÕ   rÙ   rã   Ústaticmethodræ   ÚabcÚabstractmethodrî   rò   rý   r  r  r  r  r  r  r"  r%  r)  rÝ   r.  rß   rÜ   r?  rK  rh  rm  rq  r¢  r¯  rÁ  rå  rË  rÕ  r
  rÒ  r  r!  rÖ  r9  r×  r•  ÚclassmethodrP  rS  rc  rk  rv  r‚  r‹  r�  Úsetterr�  r£  rš  r²  r¹  rÌ  rÐ  Ú__annotate_func__r@   Ú__classdictcell__)re   s   @rB   rD   rD   ‚   sí  ø‡ € Ø$ÐØ€LØ€HØ€GØ8€MØ&ÐØ€IØ7Ðà+:Ð<LÐ*MÐ'Ø'€KØ€MØ$˜+€HØ?AÐØ!ÐØ'6€Nð # D¨*°d¸HÀdÐKÐØ$×-Ñ-€Gà€OØ€KØ(€Oð /3Ðð 04Ðò÷!ð !ò$	
÷;ð ;÷83Fð 3Fðj ÷95ó ð95ðv ÷	>ó ð	>ð ÷
ó ð
÷5ð 5òô0ô$ô1ð
 ñó ðð 	×Ñó$ó ð$ð¨eô òô@ô
ò.÷ò ð: 	×Ñó$ó ð$ð 	×Ññ$ó ð$òò$ð 	×Ñó$ó ð$ð 	×Ññ$ó ð$ð 	×Ññ$ó ð$òò"ð ñó ðò?4òB)LðV ñ+ó ð+ò/÷wð wòr÷< ð  òDròh÷&*ð *òXô÷(%ð %òô@"ôH4%ôl'ôRHð@ ñó ðð  óó ðð ð"5Ø>B÷"5ñ "5ó ð"5÷H(ð (÷Ið I÷
ò 
ð. ÷Nó ðNð& ñ	(ó ð	(ð ×Ññ)ó ð)ð ÷ó ðð ÷ó ðð ÷ó ðð@ ÷ó ðð ÷ó ðð" ÷!"ó ð!"÷Fð ÷g- ƒ rA   rD   )Ú	metaclassc                ó0   € V ^8„  d   QhR\         R\        /# )r`   ÚurlÚtransformationsr‰  )rd   s   "rB   rf   rf   C  s   € ÷ (Fñ (F´ð (FÄdñ (FrA   c                óp  €  \         P                  P                  V 4      pTP                  pTf   R# T F  pT! T4      pTe   K  T u # 	  TpTP
                  e   RP                  YRP
                  4      p\         P                  P                  TP                  TR7      4      #   \         d     R# i ; i)ag  
Apply transformations to a URL's hostname, return transformed URL.

This is a separate function because unwrapping and rewrapping only the
hostname portion of a URL is complex.

:param url:
    The URL to operate on.
:param transformations:
    A list of ``(str) -> Optional[str]`` functions, which will be applied
    in order to the hostname portion of the URL.  If any function
    (regardless of ordering) returns None, ``url`` will be returned without
    any modification.

:return:
    A string whose value is ``url`` with the hostname ``transformations``
    applied, or ``None`` if ``url`` is unparsable.
Nz{}:{})Únetloc)	ÚurllibÚparseÚurlsplitrs   rà   Úportrd   Ú
urlunsplitÚ_replace)rä  rå  ÚpartsÚnew_hostnameÚtransformationÚ
new_netlocs   &&    rB   Ú&_apply_hostname_transformations_to_urlrò  C  s©   € ð&Ü—‘×%Ñ% cÓ*ˆð —>‘>€LØÒñ ã)ˆÙ% lÓ3ˆØÔð ŠJñ *ð €JØ‡z�zÒØ—^‘^ J·
±
Ó;ˆ
Ü�<‰<×"Ñ" 5§>¡>¸ >Ó#DÓEÐEøô' ô âðús   ‚B& Â&B5Â4B5c                ó$   € V ^8„  d   QhR\         /# )r`   rä  rþ  )rd   s   "rB   rf   rf   n  s   € ÷ 8Hñ 8Hœcñ 8HrA   c                óN   a€ \         R,           oR R V3R lR .p\        W4      # )aÔ  
Given a mirror URL, replace or remove any invalid URI characters.

This performs the following actions on the URL's hostname:
  * Checks if it is an IP address, returning the URL immediately if it is
  * Converts it to its IDN form (see below for details)
  * Replaces any non-Letters/Digits/Hyphen (LDH) characters in it with
    hyphens
  * Removes any leading/trailing hyphens from each domain name label

Before we replace any invalid domain name characters, we first need to
ensure that any valid non-ASCII characters in the hostname will not be
replaced, by ensuring the hostname is in its Internationalized domain name
(IDN) representation (see RFC 5890).  This conversion has to be applied to
the whole hostname (rather than just the substitution variables), because
the Punycode algorithm used by IDNA transcodes each part of the hostname as
a whole string (rather than encoding individual characters).  It cannot be
applied to the whole URL, because (a) the Punycode algorithm expects to
operate on domain names so doesn't output a valid URL, and (b) non-ASCII
characters in non-hostname parts of the URL aren't encoded via Punycode.

To put this in RFC 5890's terminology: before we remove or replace any
characters from our domain name (which we do to ensure that each label is a
valid LDH Label), we first ensure each label is in its A-label form.

(Note that Python's builtin idna encoding is actually IDNA2003, not
IDNA2008.  This changes the specifics of how some characters are encoded to
ASCII, but doesn't affect the logic here.)

:param url:
    The URL to operate on.

:return:
    A sanitized version of the URL, which will have been IDNA encoded if
    necessary, or ``None`` if the generated string is not a parseable URL.
rô  c                 óB   € \         P                  ! V 4      '       d   R # T # rÂ   )r   Úis_ip_address©rà   s   &rB   Ú<lambda>Ú&_sanitize_mirror_url.<locals>.<lambda>˜  s   € ¤×!2Ò!2°8×!<Ò!<˜ÐJÀ(ÐJrA   c                 óB   € V P                  R 4      P                  R4      # )ÚidnaÚascii)ÚencodeÚdecoder÷  s   &rB   rø  rù  ›  s   € ˜Ÿ™¨Ó0×7Ñ7¸Ô@rA   c                 ó:   <€ R P                  V3R lV  4       4      # )rN  c              3   ó8   <"  € T F  qS9   d   TMR x € K  	  R# 5i©r8   Nr;   )rî  rû  Úacceptable_charss   & €rB   rð  Ú9_sanitize_mirror_url.<locals>.<lambda>.<locals>.<genexpr>�  s   øé € ð !
Ù9A°AÐ&Ô&‰A¨CÔ/»ùs   ƒr  )rà   r  s   &€rB   rø  rù  �  s   ø€ ˜Ÿ™ô !
Ù9Aó!
ô 
rA   c                 óP   € R P                  R V P                  R 4       4       4      # )rô  c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5ir  )r“  )rî  Úparts   & rB   rð  r  ¡  s   é € ð "
Ù(; �J‰J�s�OˆOÓ(;ùs   ‚)rÊ   r‘  r÷  s   &rB   rø  rù  ¡  s#   € ˜Ÿ™ñ "
Ø(0¯©°sÔ(;ó"
ô 
rA   )ÚLDH_ASCII_CHARSrò  )rä  rå  r  s   & @rB   Ú_sanitize_mirror_urlr  n  s;   ø€ ôL '¨Õ,Ðñ 	Kñ 	Aô	
ñ	
ð€Oô" 2°#ÓGÐGrA   c                 ó2  € V '       g   / p / pV'       dŽ   VP                   '       d|   VP                   VR &   \        P                  ! RVP                   4      '       dF   VP                   ^ R	 p\        '       d   RV,          VR&   MVP                  R8X  d   RV,          VR&   V'       d"   VP
                  '       d   VP
                  VR&   / pV P                  R/ 4      P                  4        F	  w  rgWuV&   K  	  V P                  R/ 4      P                  4        FQ  w  rh. p	V F.  p
 W£,          p\        T4      pTf   K  T	P                  T4       K0  	  V! V	4      pV'       g   KM  WµV&   KS  	  \        P                  RV4       V#   \         d     Kr  i ; i)
Úavailability_zonez#^[a-z][a-z]-(?:[a-z]+-)+[0-9][a-z]$r$  Ú
ec2_regionÚec2ÚregionÚfailsafer  zfiltered distro mirror info: %séÿÿÿÿ)r
  r¹  rœ  r   Úplatform_typer  r‹   r}   r   r  r¥   r€   r�   )r  r  Úmirror_filterÚsubstr  ÚresultsrL   ÚmirrorÚ
searchlistÚmirrorsÚtmplÚfounds   &&&         rB   r  r  ©  s~  € ÷ Øˆà€Eß�{×4×4Ð4Ø%0×%BÑ%BˆÐ!Ñ"ô �8Š8Ø1Ø×)Ñ)÷
ò 
ð %×6Ñ6°q¸Ð<ˆJç:Ó:Ø&*¨ZÕ&7��lÒ#Ø×*Ñ*¨eÔ3Ø&*¨ZÕ&7��lÑ#ç�{×)×)Ð)Ø%×,Ñ,ˆˆh‰à€GØ#Ÿ™¨
°BÓ7×=Ñ=Ö?‰ˆØ�‹ñ @ð (ŸO™O¨H°bÓ9×?Ñ?ÖAÑˆØˆÛˆDðØ��ô *¨&Ó1ˆFØÔ!Ø—‘˜vÖ&ñ ñ ˜gÓ&ˆß‰5Ø!�D‹Mñ Bô  ‡I�IÐ/°Ô9à€Nøô ô Úðús   Ä'FÆFÆFc                 óh   € R pV  F)  pVP                  R4      pW9   d   Vu # RV9   g   K'  TpK+  	  V# )NÚarchesrÔ   )r‹   )r   r+   rÔ   Úitemr  s   &&   rB   r  r  á  s=   € à€GÛˆØ—‘˜(Ó#ˆØŒ>ØŠKØ˜ÖØŠGñ  ð €NrA   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r`   rL   rb   )ro   r   rD   )rd   s   "rB   rf   rf   í  s   € ÷ ñ ”ð œœV�ñ rA   c                 óD  € \         P                  ! V R \        .R.4      w  rV'       g2   \         P                  ! V P                  RR4      R \        .R.4      w  rV'       g   \	        RV : RV: R24      h\         P
                  ! V^ ,          4      p\        VR4      pV# )rN  rD   r8   r  z!No distribution found for distro z (searched r¾  )r   Úfind_moduler<   rÜ  ÚImportErrorÚimport_moduleÚgetattr)rL   ÚlocsÚlooked_locsr  ÚmodrM  s   &     rB   Úfetchr%  í  s�   € Ü ×,Ò,¨T°B¼°>ÀHÀ:ÓNÑ€Dßä×&Ò&Ø�L‰L˜˜cÓ" R¬ N°X°Jó
‰ˆ÷ Ýã“[ð"ó
ð 	
ô ×
 Ò
   a¥Ó
)€CÜ
�#�xÓ
 €CØ€JrA   c                 óÀ  € \         P                  ! V\        V 4      P                  4       R ,           4       V'       d¡   V'       d™   \        P
                  P                  V4      pV'       g&   \        P
                  P                  V4      '       g7   V'       d   \         P                  ! V4       \        P                  ! W4       R# \         P                  ! W4       R# )r  N)r   r]  ro   rÂ  rÈ   rÉ   ÚislinkrB  Údel_fileÚsymlinkÚcopy)rÎ   rÏ   Útz_confÚtz_localr'  s   &&&& rB   Úset_etc_timezoner-  þ  s   € ô 	‡O‚O�GœS ›WŸ^™^Ó-°Õ4Ô5ç—Gä—‘—‘ Ó)ˆßœŸ™Ÿ™¨×1Ò1ßÜ—’˜hÔ'Ü�JŠJ�wÔ)ñ ô �IŠI�gÔ(Ù
rA   c                  ó”   €  \         P                  ! R 4      p \        P                  ! V P                  4      #   \
         d     R# i ; i)z/run/systemd/systemF)rÈ   ÚlstatÚstatÚS_ISDIRÚst_moderó   )Úress    rB   ræ   ræ     s;   € ðÜ�hŠhÐ,Ó-ˆÜ�|Š|˜CŸK™KÓ(Ð(øÜô Úðús   ‚58 ¸AÁA)r,   Úubuntuzraspberry-pi-os)Ú	almalinuxÚamazonÚ
azurelinuxÚcentosÚ
cloudlinuxÚ	eurolinuxÚfedoraÚmarinerÚmiraclelinuxÚopenmandrivaÚphotonÚrhelÚrockyÚ	virtuozzo)Úopensusezopensuse-leapzopensuse-microoszopensuse-tumbleweedÚsle_hpcz	sle-microÚslesr4   )Úchronyzsystemd-timesyncdÚntpÚntpdate)Nz/etc/timezonez/etc/localtime)WrÜ  rÓ  rÈ   r¹  r}  r0  ÚstringÚurllib.parserè  Úcollectionsr   Ú
contextlibr   Úior   Útypingr   r   r   r	   r
   r   r   r   r   r   Úcloudinit.net.netops.iproute2r   ÚnetopsrQ   Ú	cloudinitr   r   r   r   r   r   r   r   r   Úcloudinit.distros.networkingr   r   Ú4cloudinit.distros.package_management.package_managerr   Ú*cloudinit.distros.package_management.utilsr   Úcloudinit.distros.parsersr   Úcloudinit.featuresr   Úcloudinit.lifecycler    Úcloudinit.netr!   r"   r#   Úcloudinit.net.netopsr$   Úcloudinit.net.network_stater%   Úcloudinit.net.rendererr'   ÚALL_DISTROSr:  Ú	getLoggerr<   r€   rl  Úascii_lettersÚdigitsr  ro   ry   ró   r:   ÚCloudInitPickleMixinÚABCMetarD   rò  r  Úsearch_for_mirrorr  r  r%  r-  ræ   r;   rA   rB   Ú<module>rc     sÏ  ðó Û Û 	Û 	Û Û Û Û Ý #Ý Ý ÷÷ ÷ ÷ 1Ó 0÷÷ ÷ ÷ EÝ OÝ MÝ +Ý JÝ ;ß 5Ñ 5Ý 'Ý =Ý +ð €ð ˆxˆjØ
ˆVˆHØ
ˆVˆHØÒ5Ø�	˜;Ð'Øˆx˜ÐØˆxˆjØ�	ˆ{Øò ð  ò 	ð �+�Ø�M ;Ð/ðI%€
ðN ×Ò˜Ó!€ò JÐ ð ×&Ñ&¨¯©Õ6¸Õ<€ð Øˆ…IØˆ…MØˆˆc�…OØˆˆs�D˜•Iˆ~Õ	ÕØˆˆs�D˜•I˜wÐ&Õ	'Õ(ð	*õ€ô	˜Iô 	ô~ˆ[×-Ñ-¸¿¹õ ~õB.(FõV8Hðx "°×1GÑ1Gô5òp	õô"ô"rA   