U
    Ld                     @   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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addpkginstallremoveupdateZupgradeTz	/usr/homeNc                 C   s8   t jd}|dk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
        ZRC_PIDNz0Unable to reload rc(8): no RC_PID in Environmentkillz-SIGALRMTZcapturercs)osenvirongetLOGZwarningr   )clsr   Zrc_pid r   ;/usr/lib/python3/dist-packages/cloudinit/distros/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'   Tr   )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	   usermod-n-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 |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-d-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_homer6   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formatr7   r   	Exceptionlogexcr   
set_passwd)
r0   r8   kwargsZpw_useradd_cmdZlog_pw_useradd_cmdZpw_useradd_optsZpw_useradd_flagskeyvalZ
passwd_valr   r   r   add_userU   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-   -pz01-Jan-1970z"Failed to set pw expiration for %sr   rD   r   rE   r   )r0   userr   r   r   expire_passwd   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-Hz-hr	   r-   0zchpasswd for %s)datar9   zFailed to set password for %srL   )r0   rM   r:   r;   Zhash_optr   r   r   rF      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-   z-wZnoz)Failed to lock password login for user %srL   )r0   r8   r   r   r   lock_passwd   s
    zDistro.lock_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 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ProcessExecutionErrorrE   IOError)r0   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)r   r   rX   )r0   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   )r0   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-lrK   r3   r   )rc   rd   re   rf   rg   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_execrS   rY   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_fqdnr7   classmethodr   r?   r,   r2   rJ   rN   rF   rQ   r^   r`   rb   staticmethodr*   ri   r   r   r   r   r      sL   
  :

r   )r   rV   ior   Zcloudinit.distros.bsdZ	cloudinitr   Zloggingr   r   Zcloudinit.distros.networkingr   Zcloudinit.settingsr   Z	getLoggerrj   r   ZdistrosZbsdZBSDr   r   r   r   r   <module>   s   
