
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me                 @   sx   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 e jeZG dd dejjjZdS )    N)StringIO)subputil)FreeBSDNetworking)PER_INSTANCEc               @   s   e Zd ZdZeZdZdZdZdZ	dddgZ
d	d
gZd	dgZd	dgZd	dgZdZdZed+ddZeddeeedddZdd Zdd Zdd Zd,ddZd d! Zd-d"d#Zd$d% Zd&d' Zeeeeeeed(d)d*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addZpkgZinstallremoveupdateZupgradeTz	/usr/homeNc             C   s8   t jjd}|dkr"tj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
        ZRC_PIDNz0Unable to reload rc(8): no RC_PID in Environmentkillz-SIGALRMT)capturercs)osenvirongetLOGZwarningr   )clsr   Zrc_pid r   /usr/lib/python3.6/freebsd.pyreload_init(   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$   T)r   r   )init_cmdlistr   )r   r   r   r   r   r&   Zcmdscmdr   r   r   manage_service6   s    
zDistro.manage_servicec             C   s   ddd|d|gS )Nr   usermodz-nz-Gr   )selfmember_nameZ
group_namer   r   r   _get_add_member_to_group_cmdR   s    z#Distro._get_add_member_to_group_cmdc       
      K   s  t j|rtjd| dS ddd|g}ddd|g}dddd	d
ddd}dddd}xn|j D ]b\}}||kr|rt|ttfr|j|| t|g q\||kr\|r\|j	||  |j	||  q\W d|ksd|kr|j	d |j	d n@|j	dj
| j|d |j	d |j	dj
| j|d |j	d tjd| ytj||d W n& tk
rl   t jtd|  Y nX |jdd }	|	d k	r| j||	dd d S )Nz!User %s already exists, skipping.Fr   Zuseraddz-nz-dz-cz-gz-Gz-sz-Ez-u)ZhomedirZgecosZprimary_groupgroupsshellZinactiveZuidz--no-user-groupz--systemz--no-log-init)Zno_user_groupsystemZno_log_initZno_create_homer0   z-d/nonexistentz-d{home_dir}/{name})home_dirnamez-mzAdding user %s)	logstringzFailed to create user %spasswdT)hashed)r   Zis_userr   infoitems
isinstancestrintextendappendformatr1   r   	Exceptionlogexcr   
set_passwd)
r+   r2   kwargsZpw_useradd_cmdZlog_pw_useradd_cmdZpw_useradd_optsZpw_useradd_flagskeyvalZ
passwd_valr   r   r   add_userU   sN    




zDistro.add_userc             C   sB   yt j dd|ddg W n$ tk
r<   tjtd|  Y nX d S )Nr   r*   z-pz01-Jan-1970z"Failed to set pw expiration for %s)r   r>   r   r?   r   )r+   userr   r   r   expire_passwd   s
    zDistro.expire_passwdFc             C   sZ   |r
d}nd}y"t j dd||dg|d| d W n$ tk
rT   tjtd|  Y nX d S )	Nz-Hz-hr   r*   0zchpasswd for %s)datar3   zFailed to set password for %s)r   r>   r   r?   r   )r+   rE   r4   r5   Zhash_optr   r   r   r@      s    zDistro.set_passwdc             C   sB   yt j dd|ddg W n$ tk
r<   tjtd|  Y nX d S )Nr   r*   z-wnoz)Failed to lock password login for user %s)r   r>   r   r?   r   )r+   r2   r   r   r   lock_passwd   s
    zDistro.lock_passwdc             C   s   t  }x:tj| jj D ]&}|jtjdd| | |jd qW tj| j| j	 tj
| j|j  y tjd| tjd| jg W n^ tjk
r   tjtd| ytj| j	| j W n$ tk
r   tjtd| j Y nX Y nX d S )Nz	^default:zdefault:lang=%s:
zRunning cap_mkdb for %sZcap_mkdbzFailed to apply locale %szFailed to restore %s backup)r   r   Z	load_filelogin_conf_fn
splitlineswriteresubcopylogin_conf_fn_bakZ
write_filegetvaluer   debugr   ZProcessExecutionErrorr?   IOError)r+   ZlocaleZout_fnZnewconfliner   r   r   apply_locale   s"    zDistro.apply_localec             C   s   t jj }d|d< |S )zJReturn environment vars used in FreeBSD package_command
        operationsZYESZASSUME_ALWAYS_YES)r   r   rQ   )r+   er   r   r   _get_pkg_cmd_environ   s    
zDistro._get_pkg_cmd_environc             C   s   | j jd| jdgtd d S )Nzupdate-sourcesr   )Zfreq)Z_runnerZrunZpackage_commandr   )r+   r   r   r   update_package_sources   s
    zDistro.update_package_sources)path
lease_filepid_file	interfaceconfig_filereturnc             C   s"   | d|d|g|rd||gn|g S )Nz-lz-pz-cr   )r[   r\   r]   r^   r_   r   r   r   build_dhclient_cmd   s    zDistro.build_dhclient_cmd)N)F)N) __name__
__module____qualname____doc__r   Znetworking_clsZusr_lib_execrL   rR   Zci_sudoers_fnZgroup_add_cmd_prefixZpkg_cmd_install_prefixZpkg_cmd_remove_prefixZpkg_cmd_update_prefixZpkg_cmd_upgrade_prefixZprefer_fqdnr1   classmethodr   r9   r)   r-   rD   rF   r@   rJ   rW   rY   rZ   staticmethodr'   ra   r   r   r   r   r      s@   
:

r   )Zloggingr   rO   ior   Zcloudinit.distros.bsdZ	cloudinitr   r   Zcloudinit.distros.networkingr   Zcloudinit.settingsr   Z	getLoggerrb   r   ZdistrosZbsdZBSDr   r   r   r   r   <module>   s   
