o
    fZ                     @   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                       sf  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deddf fddZdd Zd7ddZdd Zdd Zd7ddZdd Zd efd!d"Z d#d$ Z!d8d%d&Z"d'd( Z#d7d)d*Z$d+e%d,e&fd-d.Z'e(d/d0 Z)e(d1edee fd2d3Z*e(d4ede+fd5d6Z,  Z-S )9BSD/etc/rc.confz/etc/master.passwdz
root:wheelz-H-pz-r)haltpoweroff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 )Nsshdssh_svcnamersyslogdrsyslog_svcnameF)super__init__r   Runners_runnerplatformsystemlowerosfamily
bsd_netops	BsdNetOpsnet_opsis_linux)selfname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.   r1   .   s   
zBSD._unpicklec                 C   s   |  | j}| j|fS N)_read_hostnamehostname_conf_fn)r'   sys_hostnamer-   r-   r.   _read_system_hostname4   s   
zBSD._read_system_hostnamec                 C   s
   t dS )Nhostname)r
   get_rc_config_value)r'   filenamedefaultr-   r-   r.   r3   8   s   
zBSD._read_hostnamec                 C      t d)Nz&Return list cmd to add member to groupNotImplementedError)r'   member_name
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 )Nr7   r   )fn)r
   set_rc_config_value)r'   r7   r9   r-   r-   r.   _write_hostname>   s   zBSD._write_hostnamec              
   C   s   t |rtd| n$| j|g }zt| td| W n ty/   t td| Y nw |s4g }|D ]2}t 	|sEtd|| q6zt| 
|| td|| W q6 tyh   t td|| Y q6w d 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   is_groupLOGwarningr   r   info	Exceptionlogexcis_userr@   )r'   r(   members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versionrP   physicaltypedhcp)rS   r(   mac_addresssubnets)r   get_interfaces_by_macitemsappend)r'   nconfmacr(   r-   r-   r.   generate_fallback_config_   s   
zBSD.generate_fallback_configpkglistc                 C   s   |    | jd|d d S )Ninstall)pkgs)update_package_sourcespackage_command)r'   r]   r-   r-   r.   install_packagesl   s   zBSD.install_packagesc                 C   r;   )z?Return environment vars used in *BSD package_command operationsz(BSD subclasses return a dict of env varsr<   )r'   r-   r-   r.   _get_pkg_cmd_environp   s   zBSD._get_pkg_cmd_environc                 C   s   |d u rg }|dkr| j }n$|dkr| j}n|dkr#| jsd S | j}n|dkr0| js,d S | j}ng }|r?t|tr?|| n|rKt|trK|| t	
d|}|| tj||  dd d S )Nr^   removeupdateupgradez%s-%sF)
update_envcapture)r   r   r   r   
isinstancestrrY   listextendr   expand_package_listr   rc   )r'   commandargsr_   cmdr]   r-   r-   r.   ra   t   s,   

zBSD.package_commandc                 C   s   t j|| |d d S )N)tztz_file)r   set_etc_timezone_find_tz_file)r'   rq   r-   r-   r.   set_timezone   s   zBSD.set_timezonec                 C   s   t d d S )NzCannot set the locale.)rE   debug)r'   localeout_fnr-   r-   r.   apply_locale   s   zBSD.apply_localeplist_inhashedc                 C   s"   |D ]\}}| j |||d qd S )N)r{   )
set_passwd)r'   rz   r{   r(   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
        psz-oppid=r   )r   rj   intstrip)pidppid_r-   r-   r.   get_proc_ppid   s   zBSD.get_proc_ppidblockdevc                 C   s   d S r2   r-   )r   r-   r-   r.   get_mapped_device   s   zBSD.get_mapped_devicedevpathc                 C   sH   t | }|rd| }td|}|r|d |d fS td|  d)Nz/dev/z/^(?P<dev>/dev/.+)[sp](?P<part_slice>\d+[a-z]*)$dev
part_slicezInvalid value for devpath: '')r   find_freebsd_partresearch
ValueError)r   partfpartmr-   r-   r.   device_part_info   s   

zBSD.device_part_infor2   )NN).__name__
__module____qualname__r   networking_clsr4   
rc_conf_fn	shadow_fndefault_ownershutdown_options_mapr   r   rj   __annotations__r   r   r   r   r   r#   r$   r%   r   r   r1   r6   r3   r@   rC   rN   r\   r	   rb   rc   ra   ru   ry   rk   boolr~   staticmethodr   r   tupler   __classcell__r-   r-   r+   r.   r      sB   
 




r   )loggingr   r   typingr   r   cloudinit.net.netops.bsd_netopsr   netopsr#   	cloudinitr   r   r   r   cloudinit.distrosr	   r
   cloudinit.distros.networkingr   	getLoggerr   rE   Distror   r-   r-   r-   r.   <module>   s    
