o
    x[h"  ã                   @   s|   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  e¡ZG dd„ dejjjƒZdS )é    N)ÚStringIO)ÚsubpÚutil)ÚFreeBSDNetworking)Ú
PER_ALWAYSÚPER_INSTANCEc                   @   s&  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d9dd„ƒZeddœdededefdd„ƒZdd„ Zdefdd„Zdd „ Zd:d"d#„Zd$d%„ Zd&d'„ Zd9d(d)„Zd*d+„ Z d!d,œd-d.„Z!e"d/ed0ed1ed2ed3ede#fd4d5„ƒZ$e"d6eddfd7d8„ƒZ%dS );Ú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                 C   s8   t j d¡}|du rt d¡ dS tjdd|gd|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_pid© r   ú;/usr/lib/python3/dist-packages/cloudinit/distros/freebsd.pyÚreload_init7   s
   
zDistro.reload_init)r   ÚactionÚserviceÚ
extra_argsc                G   sx   | 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œ}|||  t|ƒ }tj|d|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+   r,   Tr   )Úinit_cmdÚlistr   )r   r    r!   r   r"   r.   ÚcmdsÚcmdr   r   r   Úmanage_serviceE   s    
ôzDistro.manage_servicec                 C   s   ddd|d|gS )Nr	   Úusermodú-nú-Gr   )ÚselfÚmember_nameÚ
group_namer   r   r   Ú_get_add_member_to_group_cmda   s   z#Distro._get_add_member_to_group_cmdÚreturnc                 K   s’  t  |¡rt d|¡ dS ddd|g}ddd|g}dddd	d
dddœ}ddddœ}| ¡ D ]1\}}||v rJ|rJt|ttfƒrJ| || t|ƒg¡ q-||v r^|r^| 	|| ¡ | 	|| ¡ q-d|v sgd|v rr| 	d¡ | 	d¡ n$| 
d| j› d|› �¡}	| 	d|	 ¡ | 	d¡ | 	d|	 ¡ | 	d¡ t d|¡ z	tj||d� W n ty´   t  td|¡ ‚ w | 
dd¡}
|
durÇ| j||
dd� dS )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	   Úuseraddr4   z-dú-cz-gr5   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_homerE   z-d/nonexistentr=   ú/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)r6   ÚnameÚkwargsÚpw_useradd_cmdÚlog_pw_useradd_cmdÚpw_useradd_optsÚpw_useradd_flagsÚkeyÚvalr=   Ú
passwd_valr   r   r   Úadd_userd   sV   
ù
ý€


þzDistro.add_userc                 C   ó:   zt   dd|ddg¡ W d S  ty   t td|¡ ‚ w )Nr	   r3   ú-pz01-Jan-1970z"Failed to set pw expiration for %s©r   rU   r   rV   r   )r6   Úuserr   r   r   Úexpire_passwd¢   ó   þzDistro.expire_passwdFc                 C   sR   |rd}nd}zt j dd||dg|d| d� W d S  ty(   t td|¡ ‚ w )	Nz-Hz-hr	   r3   Ú0zchpasswd for %s)ÚdatarI   zFailed to set password for %srd   )r6   re   rJ   rK   Úhash_optr   r   r   rW   ©   s   ýþzDistro.set_passwdc                 C   rb   )Nr	   r3   z-wÚnoz)Failed to lock password login for user %srd   ©r6   rX   r   r   r   Úlock_passwd¹   rg   zDistro.lock_passwdc                 C   s   t  d|¡ d S )NzRDragonfly BSD/FreeBSD password lock is not reversible, ignoring unlock for user %s)r   Údebugrl   r   r   r   Úunlock_passwdÀ   s   ýzDistro.unlock_passwdc                 C   sâ   t ƒ }t | j¡ ¡ D ]}| t dd| |¡¡ | d¡ qt | j| j	¡ t 
| j| ¡ ¡ zt d|¡ t d| jg¡ W d S  tjyp   t td|¡ zt | j	| j¡ W Y d S  tyo   t td| j¡ Y Y d S w 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   rn   r   ÚProcessExecutionErrorrV   ÚIOError)r6   ÚlocaleÚout_fnÚnewconfÚliner   r   r   Úapply_localeÇ   s*   ÿÿÿûzDistro.apply_localec                 C   s   ddiS )zJReturn environment vars used in FreeBSD package_command
        operationsÚASSUME_ALWAYS_YESÚYESr   )r6   r   r   r   Ú_get_pkg_cmd_environã   s   zDistro._get_pkg_cmd_environ)Úforcec                C   s$   | j jd| jdg|rtntd� d S )Nzupdate-sourcesr   )Úfreq)Ú_runnerÚrunÚpackage_commandr   r   )r6   r†   r   r   r   Úupdate_package_sourcesè   s   

üzDistro.update_package_sourcesÚpathÚ
lease_fileÚpid_fileÚ	interfaceÚconfig_filec                 C   s$   | d|d|g|rd||g S |g S )Nz-lrc   r<   r   )rŒ   r�   rŽ   r�   r�   r   r   r   Úbuild_dhclient_cmdð   s
   ÿÿzDistro.build_dhclient_cmdÚdevicec                 C   s   t   dd| g¡ d S )NÚ
camcontrolÚeject)r   )r’   r   r   r   Úeject_mediaü   s   zDistro.eject_media)N)F)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Únetworking_clsÚusr_lib_execrs   ry   Úci_sudoers_fnÚgroup_add_cmd_prefixÚpkg_cmd_install_prefixÚpkg_cmd_remove_prefixÚpkg_cmd_update_prefixÚpkg_cmd_upgrade_prefixÚprefer_fqdnrT   Údhclient_lease_directoryÚdhclient_lease_file_regexÚ#shadow_empty_locked_passwd_patternsÚclassmethodr   rP   r2   r9   Úboolra   rf   rW   rm   ro   r‚   r…   r‹   Ústaticmethodr/   r‘   r•   r   r   r   r   r      sj    ÿÿÿÿ>

ÿþýüûúr   )Úloggingr   rv   Úior   Úcloudinit.distros.bsdÚ	cloudinitr   r   Úcloudinit.distros.networkingr   Úcloudinit.settingsr   r   Ú	getLoggerr–   r   ÚdistrosÚbsdÚBSDr   r   r   r   r   Ú<module>   s   
