U
    ӇgZ                     @   s   d dl Z d dlZd dlZd dlmZmZ d dlm  m  m	Z	 d dl
mZmZmZmZmZ d dlmZmZ d dlmZ e eZG dd dejZdS )    N)ListOptional)distroshelpersnetsubputil)PackageList	bsd_utils)BSDNetworkingc                       s^  e Zd ZU eZdZdZdZdZddddZ	g Z
ee ed< g Zee ed	< g Zee ed
< dZeee  ed< dZeee  ed< ejZ fddZedd fddZdd Zd5ddZdd Zdd Zd6ddZdd Zedd d!Z d"d# Z!d7d$d%Z"d&d' Z#d8d(d)Z$e%e&d*d+d,Z'e(d-d. Z)e(eee d/d0d1Z*e(ee+d2d3d4Z,  Z-S )9BSD/etc/rc.confz/etc/master.passwdz
root:wheelz-H-pz-r)ZhaltZpoweroffZrebootgroup_add_cmd_prefixpkg_cmd_install_prefixpkg_cmd_remove_prefixNpkg_cmd_update_prefixpkg_cmd_upgrade_prefixc                    sL   t  ||| t|| _d|d< d|d< t  | _t	j
| _d| _d S )NZsshdZssh_svcnameZrsyslogdZrsyslog_svcnameF)super__init__r   ZRunnersZ_runnerplatformsystemlowerZosfamily
bsd_netops	BsdNetOpsnet_opsis_linux)selfnameZcfgpaths	__class__ 7/usr/lib/python3/dist-packages/cloudinit/distros/bsd.pyr   "   s    zBSD.__init__)ci_pkl_versionreturnc                    s   t  | d| _d S )NF)r   	_unpickler   )r   r$   r    r"   r#   r&   .   s    zBSD._unpicklec                 C   s   |  | j}| j|fS N)_read_hostnamehostname_conf_fn)r   Zsys_hostnamer"   r"   r#   _read_system_hostname4   s    zBSD._read_system_hostnamec                 C   s
   t dS )Nhostname)r
   Zget_rc_config_value)r   filenamedefaultr"   r"   r#   r(   8   s    zBSD._read_hostnamec                 C   s   t dd S )Nz&Return list cmd to add member to groupNotImplementedError)r   member_nameZ
group_namer"   r"   r#   _get_add_member_to_group_cmd;   s    z BSD._get_add_member_to_group_cmdc                 C   s   t jd|dd d S )Nr+   r   )fn)r
   Zset_rc_config_value)r   r+   r,   r"   r"   r#   _write_hostname>   s    zBSD._write_hostnamec              
   C   s   t |rtd| nJ| j|g }zt| td| W n" tk
r`   t td| Y nX |sjg }|D ]h}t 	|std|| qnz$t| 
|| td|| W qn tk
r   t td|| Y qnX qnd S )Nz(Skipping creation of existing group '%s'zCreated new group %szFailed to create group %szCUnable to add group member '%s' to group '%s'; user does not exist.zAdded user '%s' to group '%s'z%Failed to add user '%s' to group '%s')r   Zis_groupLOGZwarningr   r   info	ExceptionZlogexcZis_userr1   )r   r   membersZgroup_add_cmdmemberr"   r"   r#   create_groupA   s8    


   zBSD.create_groupc                 C   sB   g dd}t   D ]&\}}|d d||ddigd q|S )N   )configversionr;   ZphysicaltypeZdhcp)r=   r   Zmac_addressZsubnets)r   Zget_interfaces_by_macitemsappend)r   ZnconfZmacr   r"   r"   r#   generate_fallback_config_   s    
zBSD.generate_fallback_config)pkglistc                 C   s   |    | jd|d d S )Ninstall)pkgs)Zupdate_package_sourcespackage_command)r   rA   r"   r"   r#   install_packagesl   s    zBSD.install_packagesc                 C   s   t ddS )z?Return environment vars used in *BSD package_command operationsz(BSD subclasses return a dict of env varsNr.   )r   r"   r"   r#   _get_pkg_cmd_environp   s    zBSD._get_pkg_cmd_environc                 C   s   |d krg }|dkr| j }nH|dkr,| j}n8|dkrF| js>d S | j}n|dkr`| jsXd S | j}ng }|r~t|tr~|| n|rt|tr|| t	
d|}|| tj||  dd d S )NrB   removeupdateZupgradez%s-%sF)Z
update_envZcapture)r   r   r   r   
isinstancestrr?   listextendr   Zexpand_package_listr   rF   )r   ZcommandargsrC   cmdrA   r"   r"   r#   rD   t   s,    

zBSD.package_commandc                 C   s   t j|| |d d S )N)tzZtz_file)r   Zset_etc_timezoneZ_find_tz_file)r   rO   r"   r"   r#   set_timezone   s    zBSD.set_timezonec                 C   s   t d d S )NzCannot set the locale.)r4   debug)r   ZlocaleZout_fnr"   r"   r#   apply_locale   s    zBSD.apply_locale)plist_inhashedc                 C   s"   |D ]\}}| j |||d qd S )N)rT   )Z
set_passwd)r   rS   rT   r   Zpasswordr"   r"   r#   chpasswd   s    zBSD.chpasswdc                 C   s&   t  dddt| g\}}t| S )zC
        Return the parent pid of a process by checking ps
        Zpsz-oppid=r   )r   rJ   intstrip)pidZppid_r"   r"   r#   get_proc_ppid   s    zBSD.get_proc_ppid)blockdevr%   c                 C   s   d S r'   r"   )r[   r"   r"   r#   get_mapped_device   s    zBSD.get_mapped_device)devpathr%   c                 C   sL   t | }|r8d| }td|}|r8|d |d fS td|  dd S )Nz/dev/z/^(?P<dev>/dev/.+)[sp](?P<part_slice>\d+[a-z]*)$ZdevZ
part_slicezInvalid value for devpath: '')r   Zfind_freebsd_partresearch
ValueError)r]   partZfpartmr"   r"   r#   device_part_info   s    

 zBSD.device_part_info)N)N)NN)N).__name__
__module____qualname__r   Znetworking_clsr)   Z
rc_conf_fnZ	shadow_fnZdefault_ownerZshutdown_options_mapr   r   rJ   __annotations__r   r   r   r   r   r   r   r   r   rV   r&   r*   r(   r1   r3   r9   r@   r	   rE   rF   rD   rP   rR   rK   boolrU   staticmethodrZ   r\   tuplerd   __classcell__r"   r"   r    r#   r      s@   





r   )Zloggingr   r_   typingr   r   Zcloudinit.net.netops.bsd_netopsr   Znetopsr   Z	cloudinitr   r   r   r   Zcloudinit.distrosr	   r
   Zcloudinit.distros.networkingr   Z	getLoggerre   r4   ZDistror   r"   r"   r"   r#   <module>   s   
