U
    Ӈg"                     @   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	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dZdZdddgZed7ddZeddeeedddZdd Zeddd Zd!d" Zd8d$d%Zd&d' Zd(d) Zd9d*d+Zd,d- Z d#d.d/d0Z!e"eeeeee#d1d2d3Z$e"edd4d5d6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/homez/var/dbzdhclient.leases.\w+z^{username}::z^{username}:\*:z^{username}:\*LOCKED\*:Nc                 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_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)   Z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_nameZ
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 ]b\}}||kr|rt|ttfr||| t|g qZ||krZ|rZ|	||  |	||  qZd|ksd|kr|	d |	d nH|
d| j d| }	|	d|	  |	d |	d|	  |	d td| ztj||d W n& tk
rp   t td|  Y nX |
dd}
|
dk	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	   Zuseraddr.   z-d-cz-gr/   z-sz-Ez-u)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_homer8   z-d/nonexistentr5   /z-mzAdding user %s)	logstringzFailed to create user %spasswdNT)hashed)r   Zis_userr   infoitems
isinstancestrintextendappendr   home_dirr   	Exceptionlogexc
set_passwd)r0   namekwargsZpw_useradd_cmdZlog_pw_useradd_cmdZpw_useradd_optsZpw_useradd_flagskeyvalr5   Z
passwd_valr   r   r   add_userd   sR    





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   rE   r   rF   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)datar:   zFailed to set password for %srN   )r0   rO   r;   r<   Zhash_optr   r   r   rG      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 %srN   r0   rH   r   r   r   lock_passwd   s
    zDistro.lock_passwdc                 C   s   t d| d S )NzRDragonfly BSD/FreeBSD password lock is not reversible, ignoring unlock for user %s)r   debugrS   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 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_text_filelogin_conf_fn
splitlineswriteresubcopylogin_conf_fn_bakZ
write_filegetvaluer   rU   r   ZProcessExecutionErrorrF   IOError)r0   ZlocaleZout_fnZ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
        operationsZASSUME_ALWAYS_YESZYESr   )r0   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   )Zfreq)Z_runnerrunZpackage_commandr   r   )r0   rd   r   r   r   update_package_sources   s    
zDistro.update_package_sources)path
lease_filepid_file	interfaceconfig_filer3   c                 C   s"   | d|d|g|rd||gn|g S )Nz-lrM   r4   r   )rg   rh   ri   rj   rk   r   r   r   build_dhclient_cmd   s    zDistro.build_dhclient_cmd)devicer3   c                 C   s   t  dd| g d S )NZ
camcontrolZeject)r   )rm   r   r   r   eject_media   s    zDistro.eject_media)N)F)N)&__name__
__module____qualname____doc__r   Znetworking_clsZusr_lib_execrX   r^   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_fqdnrD   Zdhclient_lease_directoryZdhclient_lease_file_regexZ#shadow_empty_locked_passwd_patternsclassmethodr   r@   r,   r2   boolrL   rP   rG   rT   rV   rb   rc   rf   staticmethodr*   rl   rn   r   r   r   r   r      s^   
  >

r   )Zloggingr   r[   ior   Zcloudinit.distros.bsdZ	cloudinitr   r   Zcloudinit.distros.networkingr   Zcloudinit.settingsr   r   Z	getLoggerro   r   ZdistrosZbsdZBSDr   r   r   r   r   <module>   s   
