U
    Ad                     @   s|   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZm	Z	 d dl
mZ d dlmZ eeZG dd dejjjZdS )	    N)StringIO)log)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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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updateZupgradeTz	/usr/home)actionservicec              	   C   s^   | j }|dg|dg|dg|dg|dg|dg|dg|dgd}t|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disablerestartstatus)r   r   r   r   r   reloadz
try-reloadr   T)Zcapture)init_cmdlistr   )selfr   r   r   Zcmdscmd r   ;/usr/lib/python3/dist-packages/cloudinit/distros/freebsd.pymanage_service(   s    
zDistro.manage_servicec                 C   s   ddd|d|gS )Nr	   usermod-n-Gr   )r   member_nameZ
group_namer   r   r   _get_add_member_to_group_cmd=   s    z#Distro._get_add_member_to_group_cmdc           
      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 ]b\}}||kr|rt|ttfr||| t|g qZ||krZ|rZ|	||  |	||  qZd|ksd|kr|	d |	d n@|	dj
| j|d |	d |	dj
| j|d |	d td| ztj||d W n& tk
rh   t td|  Y nX |dd }	|	d k	r| j||	dd d S )Nz!User %s already exists, skipping.Fr	   Zuseraddr!   z-dz-cz-gr"   z-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_homer'   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_userLOGinfoitems
isinstancestrintextendappendformatr(   r   	Exceptionlogexcget
set_passwd)
r   r)   kwargsZpw_useradd_cmdZlog_pw_useradd_cmdZpw_useradd_optsZpw_useradd_flagskeyvalZ
passwd_valr   r   r   add_user@   sV    





zDistro.add_userc                 C   sB   zt  dd|ddg W n$ tk
r<   ttd|  Y nX d S )Nr	   r    z-pz01-Jan-1970z"Failed to set pw expiration for %sr   r6   r   r7   r-   )r   userr   r   r   expire_passwdz   s
    zDistro.expire_passwdFc                 C   sZ   |r
d}nd}z"t j dd||dg|d| d W n$ tk
rT   ttd|  Y nX d S )	Nz-H-hr	   r    0zchpasswd for %s)datar*   zFailed to set password for %sr>   )r   r?   r+   r,   Zhash_optr   r   r   r9      s    
zDistro.set_passwdc                 C   sB   zt  dd|ddg W n$ tk
r<   ttd|  Y nX d S )Nr	   r    rA   -zFailed to lock user %sr>   )r   r)   r   r   r   lock_passwd   s
    zDistro.lock_passwdNc                 C   s   t  }t| j D ]&}|tdd| | |d qt| j| j	 t
| j|  z td| td| jg W n^ tjk
r   ttd| zt| j	| j W n$ tk
r   t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ProcessExecutionErrorr7   IOError)r   ZlocaleZout_fnZnewconfliner   r   r   apply_locale   s*      zDistro.apply_localec                 C   s   t j }d|d< |S )zJReturn environment vars used in FreeBSD package_command
        operationsZYESZASSUME_ALWAYS_YES)osenvironrL   )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_runnerrunZpackage_commandr   )r   r   r   r   update_package_sources   s    zDistro.update_package_sources)F)N)__name__
__module____qualname____doc__r   Znetworking_clsZusr_lib_execrG   rM   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_fqdnr(   r1   r   r$   r=   r@   r9   rE   rR   rV   rX   r   r   r   r   r      s,   
:

r   )rS   rJ   ior   Zcloudinit.distros.bsdZ	cloudinitr   Zloggingr   r   Zcloudinit.distros.networkingr   Zcloudinit.settingsr   Z	getLoggerrY   r-   ZdistrosZbsdZBSDr   r   r   r   r   <module>   s   
