Ë
    x[h"  ã                   óÒ   — d dl Z d dlZd dlZd dlmZ d dlZd dlmZmZ d dl	m
Z
 d dlmZmZ  e j                  e«      Z G d„ dej"                  j$                  j&                  «      Zy)é    N)ÚStringIO)ÚsubpÚutil)ÚFreeBSDNetworking)Ú
PER_ALWAYSÚPER_INSTANCEc                   ó$  — e Zd ZdZeZdZdZdZdZ	g d¢Z
ddgZdd	gZdd
gZddgZdZdZdZdZg d¢Zed,d„«       Zeddœdededefd„«       Zd„ Zdefd„Zd„ Zd-d„Zd„ Zd„ Zd,d „Zd!„ Z dd"œd#„Z!e"d$ed%ed&ed'ed(ede#fd)„«       Z$e"d*eddfd+„«       Z%y).ÚDistrozY
    Distro subclass for FreeBSD.

    (N.B. DragonFlyBSD inherits from this class.)
    z/usr/local/libz/etc/login.confz/etc/login.conf.origz,/usr/local/etc/sudoers.d/90-cloud-init-users)ÚpwÚgroupÚaddÚpkgÚinstallÚremoveÚupdateÚupgradeTz	/usr/homez/var/dbzdhclient.leases.\w+)z^{username}::z^{username}:\*:z^{username}:\*LOCKED\*:Nc                 ó¦   — t         j                  j                  d«      }|€t        j	                  d«       yt        j
                  dd|gd|¬«      S )z¬
        Tell rc to reload its configuration
        Note that this only works while we're still in the process of booting.
        May raise ProcessExecutionError
        ÚRC_PIDNz0Unable to reload rc(8): no RC_PID in EnvironmentÚkillz-SIGALRMT©ÚcaptureÚrcs)ÚosÚenvironÚgetÚLOGÚwarningr   )Úclsr   Úrc_pids      ú;/usr/lib/python3/dist-packages/cloudinit/distros/freebsd.pyÚreload_initzDistro.reload_init7   sE   € ô —‘—‘ Ó)ˆØˆ>Ü�K‰KÐJÔKØä�y‰y˜& *¨fÐ5¸tÈÔMÐMó    )r   ÚactionÚserviceÚ
extra_argsc                óÀ   — | j                   }|dg|dg|dg|dg|dg|dg|dg|dg|dg|dg|d	g|d
gdœ}|||   z   t        |«      z   }t        j                  |d|¬«      S )a  
        Perform the requested action on a service. This handles FreeBSD's
        'service' case. The FreeBSD 'service' is closer in features to
        'systemctl' than SysV init's 'service', so we override it.
        May raise ProcessExecutionError
        ÚstopÚstartÚenableÚenabledÚdisableÚonestartÚonestopÚrestartÚstatusÚ	onestatus)r'   r(   r)   r*   r+   r,   r-   r.   Úreloadz
try-reloadr/   r0   Tr   )Úinit_cmdÚlistr   )r   r#   r$   r   r%   r2   ÚcmdsÚcmds           r    Úmanage_servicezDistro.manage_serviceE   s¡   € ð —<‘<ˆà˜fÐ%Ø˜wÐ'Ø Ð)Ø Ð+Ø Ð+Ø  *Ð-Ø Ð+Ø Ð+Ø 	Ð*Ø" IÐ.Ø Ð)Ø! ;Ð/ñ
ˆð ˜˜f™Ñ%¬¨ZÓ(8Ñ8ˆÜ�y‰y˜ d°Ô4Ð4r"   c                 ó   — ddd|d|gS )Nr   Úusermodú-nú-G© )ÚselfÚmember_nameÚ
group_names      r    Ú_get_add_member_to_group_cmdz#Distro._get_add_member_to_group_cmda   s   € Ø�i  {°D¸*ÐEÐEr"   Úreturnc                 óÆ  — t        j                  |«      rt        j                  d|«       yddd|g}ddd|g}dddd	d
dddœ}ddddœ}|j	                  «       D ]q  \  }}||v r8|r6t        |t        t        f«      r |j                  ||   t        |«      g«       ŒB||v sŒG|sŒJ|j                  ||   «       |j                  ||   «       Œs d|v sd|v r#|j                  d«       |j                  d«       nk|j                  d| j                  › d|› �«      }	|j                  d|	z   «       |j                  d«       |j                  d|	z   «       |j                  d«       t        j                  d|«       	 t        j                  ||¬«       |j                  dd«      }
|
�| j                  ||
d¬«       y# t        $ r t        j                  t        d|«       ‚ w xY w)z~
        Add a user to the system using standard tools

        Returns False if user already exists, otherwise True.
        z!User %s already exists, skipping.Fr   Úuseraddr9   z-dú-cz-gr:   z-sz-Ez-u)ÚhomedirÚgecosÚprimary_groupÚgroupsÚshellÚinactiveÚuidz--no-user-groupz--systemz--no-log-init)Úno_user_groupÚsystemÚno_log_initÚno_create_homerL   z-d/nonexistentrD   ú/z-mzAdding user %s)Ú	logstringzFailed to create user %sÚpasswdNT)Úhashed)r   Úis_userr   ÚinfoÚitemsÚ
isinstanceÚstrÚintÚextendÚappendr   Úhome_dirr   Ú	ExceptionÚlogexcÚ
set_passwd)r<   ÚnameÚkwargsÚpw_useradd_cmdÚlog_pw_useradd_cmdÚpw_useradd_optsÚpw_useradd_flagsÚkeyÚvalrD   Ú
passwd_vals              r    Úadd_userzDistro.add_userd   sú  € ô �<‰<˜ÔÜ�H‰HÐ8¸$Ô?Øà 	¨4°Ð6ˆØ" I¨t°TÐ:Ðð ØØ!ØØØØñ
ˆð /Ø Ø*ñ
Ðð Ÿ™›ò 	A‰HˆC�Ø�oÑ%©#´*¸SÄ3ÌÀ*Ô2MØ×%Ñ% °sÑ';¼SÀ»XÐ&FÕGàÐ(Ò(ªSØ×%Ñ%Ð&6°sÑ&;Ô<Ø"×)Ñ)Ð*:¸3Ñ*?Õ@ð	Að ˜vÑ%¨°VÑ);Ø×!Ñ!Ð"2Ô3Ø×%Ñ%Ð&6Õ7à—j‘j ¨t¯}©}¨o¸Q¸t¸fÐ,EÓFˆGØ×!Ñ! $¨¡.Ô1Ø×!Ñ! $Ô'Ø×%Ñ% d¨W¡nÔ5Ø×%Ñ% dÔ+ô 	�‰Ð! 4Ô(ð	Ü�I‰I�nÐ0BÕCð —Z‘Z ¨$Ó/ˆ
ØÐ!Ø�O‰O˜D *°TˆOÔ:ð øô ò 	Ü�K‰KœÐ7¸Ô>Øð	ús   Å:F: Æ:&G c                 óŒ   — 	 t        j                   dd|ddg«       y # t        $ r t        j                  t        d|«       ‚ w xY w)Nr   r8   ú-pz01-Jan-1970z"Failed to set pw expiration for %s©r   r\   r   r]   r   )r<   Úusers     r    Úexpire_passwdzDistro.expire_passwd¢   sA   € ð	Ü�I‰I�t˜Y¨¨d°MÐBÕCøÜò 	Ü�K‰KœÐAÀ4ÔHØð	úó	   ‚ �&AFc                 ó¦   — |rd}nd}	 t        j                   dd||dg|d|z  ¬«       y # t        $ r t        j                  t        d|«       ‚ w xY w)	Nz-Hz-hr   r8   Ú0zchpasswd for %s)ÚdatarP   zFailed to set password for %srk   )r<   rl   rQ   rR   Úhash_opts        r    r^   zDistro.set_passwd©   s^   € ÙØ‰HàˆHð	Ü�I‰IØ�y $¨°#Ð6ØØ+¨dÑ2öøô
 ò 	Ü�K‰KœÐ<¸dÔCØð	ús	   ‰ * ª&Ac                 óŒ   — 	 t        j                   dd|ddg«       y # t        $ r t        j                  t        d|«       ‚ w xY w)Nr   r8   z-wÚnoz)Failed to lock password login for user %srk   ©r<   r_   s     r    Úlock_passwdzDistro.lock_passwd¹   sA   € ð	Ü�I‰I�t˜Y¨¨d°DÐ9Õ:øÜò 	Ü�K‰KœÐHÈ$ÔOØð	úrn   c                 ó0   — t         j                  d|«       y )NzRDragonfly BSD/FreeBSD password lock is not reversible, ignoring unlock for user %s)r   Údebugru   s     r    Úunlock_passwdzDistro.unlock_passwdÀ   s   € Ü�	‰	ð*àõ	
r"   c                 ó8  — t        «       }t        j                  | j                  «      j	                  «       D ]<  }|j                  t        j                  dd|z  |«      «       |j                  d«       Œ> t        j                  | j                  | j                  «       t        j                  | j                  |j                  «       «       	 t        j                  d|«       t        j                  d| j                  g«       y # t        j                  $ r~ t        j                   t        d|«       	 t        j                  | j                  | j                  «       Y y # t"        $ r) t        j                   t        d| j                  «       Y Y y w xY ww xY w)Nz	^default:zdefault:lang=%s:ú
zRunning cap_mkdb for %sÚcap_mkdbzFailed to apply locale %szFailed to restore %s backup)r   r   Úload_text_fileÚlogin_conf_fnÚ
splitlinesÚwriteÚreÚsubÚcopyÚlogin_conf_fn_bakÚ
write_fileÚgetvaluer   rx   r   ÚProcessExecutionErrorr]   ÚIOError)r<   ÚlocaleÚout_fnÚnewconfÚlines        r    Úapply_localezDistro.apply_localeÇ   s6  € ä“*ˆÜ×'Ñ'¨×(:Ñ(:Ó;×FÑFÓHò 	 ˆDØ�M‰MÜ—‘�|Ð%8¸6Ñ%AÀ4ÓHôð �M‰M˜$Õð		 ô 	�	‰	�$×$Ñ$ d×&<Ñ&<Ô=ô 	�‰˜×*Ñ*¨G×,<Ñ,<Ó,>Ô?ð	Ü�I‰IÐ/°Ô8Ü�I‰I�z 4×#5Ñ#5Ð6Õ7øÜ×)Ñ)ò 	ä�K‰KœÐ8¸&ÔAðÜ—	‘	˜$×0Ñ0°$×2DÑ2DÖEøÜò Ü—‘ÜÐ6¸×8JÑ8J÷ðúð	ús*   Ã7D Ä.FÄ7*E#Å#.FÆFÆFÆFc                 ó
   — ddiS )zJReturn environment vars used in FreeBSD package_command
        operationsÚASSUME_ALWAYS_YESÚYESr;   )r<   s    r    Ú_get_pkg_cmd_environzDistro._get_pkg_cmd_environã   s   € ð $ UÐ+Ð+r"   )Úforcec                ó|   — | j                   j                  d| j                  dg|rt        ¬«       y t        ¬«       y )Nzupdate-sourcesr   )Úfreq)Ú_runnerÚrunÚpackage_commandr   r   )r<   r’   s     r    Úupdate_package_sourceszDistro.update_package_sourcesè   s>   € Ø�‰×ÑØØ× Ñ ØˆJÙ$”ð	 	õ 	
ô +7ð	 	õ 	
r"   ÚpathÚ
lease_fileÚpid_fileÚ	interfaceÚconfig_filec                 ó*   — | d|d|g|rd||gz   S |gz   S )Nz-lrj   rC   r;   )r™   rš   r›   rœ   r�   s        r    Úbuild_dhclient_cmdzDistro.build_dhclient_cmdð   s7   € ð �d˜J¨¨hÐ7Ù.9ˆT�; 	Ð*ñ
ð 	
Ø@I¸{ñ
ð 	
r"   Údevicec                 ó4   — t        j                   dd| g«       y )NÚ
camcontrolÚeject)r   )r    s    r    Úeject_mediazDistro.eject_mediaü   s   € ä�	‰	�< ¨&Ð1Õ2r"   )N)F)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Únetworking_clsÚusr_lib_execr~   r„   Úci_sudoers_fnÚgroup_add_cmd_prefixÚpkg_cmd_install_prefixÚpkg_cmd_remove_prefixÚpkg_cmd_update_prefixÚpkg_cmd_upgrade_prefixÚprefer_fqdnr[   Údhclient_lease_directoryÚdhclient_lease_file_regexÚ#shadow_empty_locked_passwd_patternsÚclassmethodr!   rW   r6   r?   Úboolrh   rm   r^   rv   ry   r�   r‘   r˜   Ústaticmethodr3   rŸ   r¤   r;   r"   r    r
   r
      sc  „ ñð '€NØ#€LØ%€MØ.ÐØB€MÚ1ÐØ# YÐ/ÐØ" HÐ-ÐØ" HÐ-ÐØ# YÐ/ÐØ€KØ€Hð  )ÐØ 6Ðò+Ð'ð òNó ðNð à>Bò5Øð5Ø#&ð5Ø58ò5ó ð5ò6Fð<¨$ó <ò|óò ò
óò8,ð
 /4ô 
ð ð	
Øð	
àð	
ð ð	
ð ð		
ð
 ð	
ð 
ò	
ó ð	
ð ð3˜Cð 3 Dò 3ó ñ3r"   r
   )Úloggingr   r�   Úior   Úcloudinit.distros.bsdÚ	cloudinitr   r   Úcloudinit.distros.networkingr   Úcloudinit.settingsr   r   Ú	getLoggerr¥   r   ÚdistrosÚbsdÚBSDr
   r;   r"   r    ú<module>rÂ      sQ   ðó Û 	Û 	Ý ã ß  Ý :ß 7à€g×Ñ˜Ó!€ôj3ˆY×Ñ×"Ñ"×&Ñ&õ j3r"   