o
    x[hi*  ã                   @   s¶   d dl Z d dlZd dlmZ d dl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 e  e¡ZdZd	ZG d
d„ dejƒZddd„Zedfdd„Z	ddd„Zddd„ZdS )é    N)ÚList)ÚdistrosÚsubpÚutil)ÚApt)ÚPackageManager)ÚHostnameConf)ÚCLOUDINIT_NETPLAN_FILEa8  # This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
z/etc/default/localec                       sÎ   e Zd ZdZdedœZed edœed eddœdœZd	Zd
Z	‡ fdd„Z
dd„ Zd+dd„Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd,dd„Zdd„ Zdd „ Zd-d!d"„Zd#d$„ Zd%ed&ed'ed(efd)d*„Z‡  ZS ).ÚDistroz/etc/hostnamez'/etc/network/interfaces.d/50-cloud-init)ÚeniÚnetplanr   )Úeni_pathÚ
eni_headerr   T)Únetplan_pathÚnetplan_headerÚpostcmdsz/var/lib/dhcpzdhclient\.\w+\.leasesc                    s@   t ƒ  |||¡ d| _d| _d | _t | j|¡| _| jg| _	d S )NÚdebianzC.UTF-8)
ÚsuperÚ__init__ÚosfamilyÚdefault_localeÚsystem_localer   Úfrom_configÚ_runnerÚaptÚpackage_managers)ÚselfÚnameÚcfgÚpaths©Ú	__class__© ú:/usr/lib/python3/dist-packages/cloudinit/distros/debian.pyr   7   s   zDistro.__init__c                 C   s    | j stƒ | _ | j r| j S | jS )z9Return the default locale if set, else use default locale)r   Úread_system_localer   ©r   r"   r"   r#   Ú
get_localeB   s   
ÿÿzDistro.get_localeNÚLANGc           	      C   sÌ   |st }|s
tdƒ‚|  ¡ }tj |¡}| j }|r#t dt | j	¡ nt d| jt ¡ | 
¡ | 
¡ kp7| p7|}| p>|p>|}|rKt|||| jd� n	t d|| j|¡ |rdt|||| jd� d| _dS dS )zeApply specified locale to system, regenerate if specified locale
        differs from system default.zFailed to provide locale value.zVSystem locale not found in %s. Assuming system locale is %s based on hardcoded defaultzSystem locale set to %s via %s)ÚkeynameÚinstall_functionz9System has '%s=%s' requested '%s', skipping regeneration.N)ÚLOCALE_CONF_FNÚ
ValueErrorr&   ÚosÚpathÚexistsr   ÚLOGÚdebugr   ÚlowerÚregenerate_localeÚinstall_packagesÚupdate_locale_conf)	r   ÚlocaleÚout_fnr(   Údistro_localeÚconf_fn_existsÚsys_locale_unsetÚ
need_regenÚ	need_confr"   r"   r#   Úapply_localeM   s\   üýÿýüüü
øzDistro.apply_localec                    s   t ƒ  tƒ j|i |¤ŽS ©N)Ú_maybe_remove_legacy_eth0r   Ú_write_network_state)r   ÚargsÚkwargsr    r"   r#   r?   ˆ   s   zDistro._write_network_statec                 C   sx   d }z|   |¡}W n ty%   t | jdd¡}|rnt d¡ Y d S Y nw |s,tdƒ}| |¡ t 	|t
|ƒd¡ d S )NÚcreate_hostname_fileTz8create_hostname_file is False; hostname file not createdÚ é¤  )Ú_read_hostname_confÚIOErrorr   Úget_cfg_option_boolÚ_cfgr/   Úinfor   Úset_hostnameÚ
write_fileÚstr)r   ÚhostnameÚfilenameÚconfrB   r"   r"   r#   Ú_write_hostnameŒ   s&   ÿÿûû
zDistro._write_hostnamec                 C   s   |   | j¡}| j|fS r=   )Ú_read_hostnameÚhostname_conf_fn)r   Úsys_hostnamer"   r"   r#   Ú_read_system_hostname¢   s   
zDistro._read_system_hostnamec                 C   s   t t |¡ƒ}| ¡  |S r=   )r   r   Úload_text_fileÚparse)r   rN   rO   r"   r"   r#   rE   ¦   s   zDistro._read_hostname_confc                 C   s8   d }z
|   |¡}|j}W n	 ty   Y nw |s|S |S r=   )rE   rM   rF   )r   rN   ÚdefaultrM   rO   r"   r"   r#   rQ   «   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 j||  |¡d� d S )N)ÚtzÚtz_file)r   Úset_etc_timezoneÚ_find_tz_file)r   rY   r"   r"   r#   Úset_timezoneº   s   zDistro.set_timezonec                 C   s(   |dkrt d|› d�ƒ‚| j d¡ d S )NÚupgradezUnable to handle z command)ÚRuntimeErrorr   Úrun_package_command)r   Úcommandr@   Úpkgsr"   r"   r#   Úpackage_command½   s   zDistro.package_commandc                 C   s   t  ¡ S r=   )r   Úget_dpkg_architecturer%   r"   r"   r#   Úget_primary_archÄ   s   zDistro.get_primary_archÚlayoutÚmodelÚvariantÚoptionsc                 C   s^   d  ddd|› d�d|› d�d|› d�d|› d�dd	dg	¡}tjd
|ddd� |  dd¡ d S )NÚ
z'# This file was generated by cloud-initrC   z
XKBMODEL="ú"zXKBLAYOUT="zXKBVARIANT="zXKBOPTIONS="zBACKSPACE="guess"z/etc/default/keyboardrD   Úw)rN   ÚcontentÚmodeÚomodeÚrestartzconsole-setup)Újoinr   rK   Úmanage_service)r   rf   rg   rh   ri   Úcontentsr"   r"   r#   Ú
set_keymapÇ   s&   



÷ÿüzDistro.set_keymap)Nr'   r=   )NN)Ú__name__Ú
__module__Ú__qualname__rR   r	   Únetwork_conf_fnÚNETWORK_FILE_HEADERÚrenderer_configsÚdhclient_lease_directoryÚdhclient_lease_file_regexr   r&   r<   r?   rP   rT   rE   rQ   rX   r]   rc   re   rL   rt   Ú__classcell__r"   r"   r    r#   r
   !   s8    þþýû
;

"r
   ú"/etc/network/interfaces.d/eth0.cfgc                 C   s’   t j | ¡sdS d}z(t | ¡}ddg}dd„ | ¡ D ƒ}||kr+t | ¡ d|  }n|d|   }W n tyA   |d	|   }Y nw t 	|¡ dS )
aO  Ubuntu cloud images previously included a 'eth0.cfg' that had
    hard coded content.  That file would interfere with the rendered
    configuration if it was present.

    if the file does not exist do nothing.
    If the file exists:
      - with known content, remove it and warn
      - with unknown content, leave it and warn
    Nz(Dynamic networking config may not apply.z	auto eth0ziface eth0 inet dhcpc                 S   s   g | ]}|  d ¡s| ¡ ‘qS )ú#)Ú
startswithÚstrip)Ú.0Úfr"   r"   r#   Ú
<listcomp>ü   s
    
ÿÿz-_maybe_remove_legacy_eth0.<locals>.<listcomp>zremoved %s with known contentsz* '%s' exists with user configured content.z" %s exists, but could not be read.)
r,   r-   r.   r   rU   Ú
splitlinesÚdel_fileÚ	Exceptionr/   Úwarning)r-   Úbmsgrs   Úknown_contentsÚlinesÚmsgr"   r"   r#   r>   ê   s$   
ÿ

€ÿr>   r'   c                 C   sD   d}| s
t d|  ƒ‚tj | ¡r t | ¡}t |¡}| |d¡}|S )z.Read system default locale setting, if presentrC   zInvalid path: %s)r+   r,   r-   r.   r   rU   Úload_shell_contentÚget)Úsys_pathr(   Úsys_valÚlocale_contentÚsys_defaultsr"   r"   r#   r$   
  s   

r$   c                 C   sH   t  d||| ¡ t d¡s|dgƒ tjdd| d|| f gdd� dS )	zUpdate system locale configz%Updating %s with locale setting %s=%szupdate-localeÚlocalesz--locale-file=z%s=%sF©ÚcaptureN)r/   r0   r   Úwhich©r5   r�   r(   r)   r"   r"   r#   r4     s   ÿ


ý
úr4   c                 C   sT   |   ¡ dv rt d|| ¡ dS t d¡s|dgƒ t d| ¡ tjd| gdd� dS )	z�
    Run locale-gen for the provided locale and set the default
    system variable `keyname` appropriately in the provided `sys_path`.

    )Úczc.utf-8Úposixz$%s=%s does not require rengenerationNz
locale-genr“   zGenerating locales for %sFr”   )r1   r/   r0   r   r–   r—   r"   r"   r#   r2   +  s   

r2   )r~   )r'   N)Úloggingr,   Útypingr   Ú	cloudinitr   r   r   Ú(cloudinit.distros.package_management.aptr   Ú4cloudinit.distros.package_management.package_managerr   Ú"cloudinit.distros.parsers.hostnamer   Úcloudinit.net.netplanr	   Ú	getLoggerru   r/   ry   r*   r
   r>   r$   r4   r2   r"   r"   r"   r#   Ú<module>   s$   	
 
J 
ÿ