U
    Ӈg'                     @   s|   d dl Z d dlZd dlmZmZmZmZ d dlmZ d dlm	Z
 d dlmZ d dlmZmZ e eZG dd dejZdS )	    N)distroshelperssubputil)PackageList)	rhel_util)HostnameConf)
PER_ALWAYSPER_INSTANCEc                   @   s   e Zd ZdZdZdgZdZdZdZdZ	dZ
d	d
dddddddiZdd Zd/ddZedddZd0ddZdd Zdddd Zd1d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zed-d. ZdS )2Distroz/etc/sysconfig/clockz/etc/HOSTNAMEservicez/etc/sysconfig/languagez/etc/sysconfig/network/configz/etc/hostnamez/etc/locale.confz/etc/localtimeZ	sysconfigzetc/sysconfig/network/configsusez%(base)s/network/ifcfg-%(name)sz3etc/udev/rules.d/85-persistent-net-cloud-init.rulesz!%(base)s/network/ifroute-%(name)s)Zipv4Zipv6)ZcontrolZflavorZiface_templatesZnetrules_pathZroute_templatesc                 C   sT   t j| ||| t|| _d| _d | _d| _d|d< | 	 rPdg| _
d|d< d S )Nr   FZsshdZssh_svcnameZ	systemctlzsshd.service)r   r   __init__r   ZRunners_runnerZosfamilyupdate_methodread_only_rootuses_systemdinit_cmd)selfnameZcfgpaths r   </usr/lib/python3/dist-packages/cloudinit/distros/opensuse.pyr   /   s    zDistro.__init__Nc                 C   s>   |   r|s| j}d|i}n|s&| j}d|i}t|| d S )NZLANGZRC_LANG)r   systemd_locale_conf_fnlocale_conf_fnrhutilupdate_sysconfig_file)r   ZlocaleZout_fnZ
locale_cfgr   r   r   apply_locale:   s    
zDistro.apply_locale)pkglistc                 C   s   | j dd|d d S )Ninstallz--auto-agree-with-licenses)argspkgs)package_command)r   r   r   r   r   install_packagesE   s
      zDistro.install_packagesc                 C   s  |d krg }|    | jr2| jdks2td d S | jdkrFddg}nddddg}|dkr^d	}|s| jdkr|d	krd
}dddg}|dkrddg}|| |rt|tr|| n|rt|tr|	| t
d|}|	| tj|dd | jdkrtd d S )NtransactionalzUPackage operation requested but read only root without btrfs and transactional-updatazypperz--non-interactiveztransactional-updatez--drop-if-no-changepkgZupgradeupdateZuprefreshz%s-%sF)Zcapturez8To use/activate the installed packages reboot the system)_set_update_methodr   r   LOGerrorappend
isinstancestrlistextendr   Zexpand_package_listr   info)r   Zcommandr    r!   cmdr   r   r   r   r"   J   sT    




zDistro.package_commandc                 C   sZ   |  |}|  r.t| j t|| j n(dt|i}t| j	| t
|| j d S )NZTIMEZONE)Z_find_tz_filer   r   Zdel_filetz_local_fnZsym_linkr.   r   r   clock_conf_fncopy)r   ZtzZtz_fileZ	clock_cfgr   r   r   set_timezone   s    
 zDistro.set_timezoneF)forcec                C   s$   | j jd| jdg|rtntd d S )Nzupdate-sourcesr(   )Zfreq)r   runr"   r	   r
   )r   r7   r   r   r   update_package_sources   s    
zDistro.update_package_sourcesc                 C   s   |   r |dr t| S |   rJtdg\}}t|rD|S |S n6z| |}|j}W n t	k
rr   Y nX |s||S |S d S )N/previous-hostnamehostname)
r   endswithr   load_text_filestripr   len_read_hostname_confr;   IOError)r   filenamedefaultoutZ_errconfr;   r   r   r   _read_hostname   s    

zDistro._read_hostnamec                 C   s   dS )Nz	127.0.1.1r   )r   r   r   r   _get_localhost_ip   s    zDistro._get_localhost_ipc                 C   s   t t|}|  |S N)r   r   r=   parse)r   rB   rE   r   r   r   r@      s    zDistro._read_hostname_confc                 C   s$   |   r| j}n| j}|| |fS rH   )r   systemd_hostname_conf_fnhostname_conf_fnrF   )r   Zhost_fnr   r   r   _read_system_hostname   s    zDistro._read_system_hostnamec                 C   s   | j dkrtd}d}|r|\}}}tdd}|D ]8}||r:| }|d |kr^q:|d d| _ qtq:| d	krtj	
d
rd| _ qd| _ ntd d| _ dS )z7Decide if we want to use transactional-update or zypperN/ z/proc/mounts
      ZroZbtrfsz/usr/sbin/transactional-updater$   r%   z7Could not determine filesystem type of '/' using zypper)r   r   Zget_mount_infor=   split
startswithr   lowerospathexistsr*   r1   )r   resultZfs_typeZdevpthZmount_pointZmountsZmountZ
mount_infor   r   r   r)      s,    



zDistro._set_update_methodc                 C   s   t | jdd}|  r0|dr0t || n|  rj|rRtddt|g qtdddt|g nfd }z| |}W n* t	k
r   |rnt
d Y d S Y nX |std}|| t |t|d	 d S )
Ncreate_hostname_fileTr:   Zhostnamectlzset-hostnamez--transientz7create_hostname_file is False; hostname file notcreatedrN   i  )r   Zget_cfg_option_boolZ_cfgr   r<   Z
write_filer   r.   r@   rA   r*   r1   r   Zset_hostname)r   r;   rB   rY   rE   r   r   r   _write_hostname   s>      	
zDistro._write_hostnamec                 C   sx   | j srt d }|d }t|d dd }|dkr@d|ksX|dkrfd|krf|dkrfdd	d
g| _ nd
d	dg| _ | j S )z5The preferred ntp client is dependent on the version.Zdistr   rP   .   ZopenSUSE*   Zchronyzsystemd-timesyncdZntp)Z_preferred_ntp_clientsr   Zsystem_infointrR   )r   Zdistro_infor   Z	major_verr   r   r   preferred_ntp_clients  s(    zDistro.preferred_ntp_clients)N)NN)N)__name__
__module____qualname__r4   rK   r   r   Znetwork_conf_fnrJ   r   r3   Zrenderer_configsr   r   r   r#   r"   r6   r9   rF   rG   r@   rL   r)   rZ   propertyr_   r   r   r   r   r      s@   

=
&r   )ZloggingrU   Z	cloudinitr   r   r   r   Zcloudinit.distrosr   r   r   Z"cloudinit.distros.parsers.hostnamer   Zcloudinit.settingsr	   r
   Z	getLoggerr`   r*   r   r   r   r   r   <module>   s   
