
    f(                         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 j                   e      ZdZd	Zd
Z G d dej,                        ZddZedfdZddZddZy)    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}
'/etc/network/interfaces.d/50-cloud-initz/etc/default/localec                        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Z
d ZddZ fdZd Zd Zd ZddZd Zd ZddZd ZdedededefdZ xZS )Distroz/etc/hostnamer   )eninetplanr   )eni_path
eni_headerr   T)netplan_pathnetplan_headerpostcmdsz/var/lib/dhcpzdhclient\.\w+\.leasesc                     t         |   |||       d| _        d| _        d | _        t        j                  | j                  |      | _        | j                  g| _	        y )NdebianzC.UTF-8)
super__init__osfamilydefault_localesystem_localer   from_config_runneraptpackage_managers)selfnamecfgpaths	__class__s       :/usr/lib/python3/dist-packages/cloudinit/distros/debian.pyr   zDistro.__init__8   sQ    sE* !'!??4<<57;xxj    c                     | j                   st               | _         | j                   r| j                   S | j                  S )z9Return the default locale if set, else use default locale)r   read_system_localer   r    s    r%   
get_localezDistro.get_localeC   s>     !!!3!5D #'"4"4D	
:>:M:M	
r&   c                 @   |st         }|st        d      | j                         }t        j                  j                  |      }| j                   }|r&t        j                  dt         | j                         n%t        j                  d| j                  t                |j                         |j                         k7  xs | xs |}| xs |xs |}|rt        |||       n"t        j                  d|| j                  |       |rt        |||       d| _        yy)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)keynamez9System has '%s=%s' requested '%s', skipping regeneration.N)LOCALE_CONF_FN
ValueErrorr*   ospathexistsr   LOGdebugr   lowerregenerate_localeupdate_locale_conf)	r    localeout_fnr,   distro_localeconf_fn_existssys_locale_unset
need_regen	need_confs	            r%   apply_localezDistro.apply_localeN   s    #F>?? )/#111IIJ##	 II0"" LLNm1133  !!  	
 '&H*H8H	ffg>IIK""	 vvw?!%D r&   c                 6    t                t        |   |i |S N)_maybe_remove_legacy_eth0r   _write_network_state)r    argskwargsr$   s      r%   rB   zDistro._write_network_state   s    !#w+T<V<<r&   c                 <   d }	 | j                  |      }|st        d      }|j                  |       t        j                  |t        |      d       y # t        $ r> t        j                  | j                  dd      }|rnt
        j                  d       Y y Y w xY w)Ncreate_hostname_fileTz8create_hostname_file is False; hostname file not created   )_read_hostname_confIOErrorr   get_cfg_option_bool_cfgr2   infor	   set_hostname
write_filestr)r    hostnamefilenameconfrF   s        r%   _write_hostnamezDistro._write_hostname   s    	 ++H5D #D(##d)U3  
	#'#;#;		14$  $N  
	s   A ABBc                 T    | j                  | j                        }| j                  |fS r@   )_read_hostnamehostname_conf_fn)r    sys_hostnames     r%   _read_system_hostnamezDistro._read_system_hostname   s)    **4+@+@A%%|44r&   c                 b    t        t        j                  |            }|j                          |S r@   )r	   r   load_text_fileparse)r    rR   rS   s      r%   rI   zDistro._read_hostname_conf   s%    D//9:

r&   c                 l    d }	 | j                  |      }|j                  }|s|S |S # t        $ r Y w xY wr@   )rI   rQ   rJ   )r    rR   defaultrQ   rS   s        r%   rV   zDistro._read_hostname   sH    	++H5D}}H N	  		s   ' 	33c                      y)Nz	127.0.1.1 r)   s    r%   _get_localhost_ipzDistro._get_localhost_ip   s    r&   c                 P    t        j                  || j                  |             y )N)tztz_file)r   set_etc_timezone_find_tz_file)r    rc   s     r%   set_timezonezDistro.set_timezone   s      B0B0B20FGr&   c                 b    |dk7  rt        d| d      | j                  j                  d       y )NupgradezUnable to handle z command)RuntimeErrorr   run_package_command)r    commandrC   pkgss       r%   package_commandzDistro.package_command   s3     i!27)8DEE$$Y/r&   c                 *    t        j                         S r@   )r   get_dpkg_architecturer)   s    r%   get_primary_archzDistro.get_primary_arch   s    ))++r&   layoutmodelvariantoptionsc                     dj                  ddd| dd| dd| dd| ddd	dg	      }t        j                  d
|dd       | j                  dd       y )N
z'# This file was generated by cloud-initrG   z
XKBMODEL=""zXKBLAYOUT="zXKBVARIANT="zXKBOPTIONS="zBACKSPACE="guess"z/etc/default/keyboardrH   w)rR   contentmodeomoderestartzconsole-setup)joinr   rO   manage_service)r    rr   rs   rt   ru   contentss         r%   
set_keymapzDistro.set_keymap   s     999UG1%fXQ'wiq)wiq)#

 	,		
 	I7r&   )NLANGr@   )NN)__name__
__module____qualname__rW   r
   network_conf_fnNETWORK_FILE_HEADERrenderer_configsdhclient_lease_directorydhclient_lease_file_regexr   r*   r>   rB   rT   rY   rI   rV   ra   rg   rn   rq   rP   r   __classcell__)r$   s   @r%   r   r   "   s    &8)O (.-

 ,I61

  / 8	A	
/&b=4,5
	H0, 8  8S  83  8  8r&   r   c                    t         j                  j                  |       syd}	 t        j                  |       }ddg}|j                         D cg c]$  }|j                  d      r|j                         & }}||k(  rt        j                  |        d| z  }n|d| z  z   }t        j                  |       yc c}w # t        $ r |d| z  z   }Y .w xY w)	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 dhcp#zremoved %s with known contentsz* '%s' exists with user configured content.z" %s exists, but could not be read.)r/   r0   r1   r   r[   
splitlines
startswithstripdel_file	Exceptionr2   warning)r0   bmsgr   known_contentsflinesmsgs          r%   rA   rA      s     77>>$5DA&&t,%'=>'224
ALL<MAGGI
 
 N"MM$2T9CELLC KK
  A9D@@As)   +B= B8&B88*B= 8B= =CCr   c                     d}| st        d| z        t        j                  j                  |       r<t	        j
                  |       }t	        j                  |      }|j                  |d      }|S )z.Read system default locale setting, if presentrG   zInvalid path: %s)r.   r/   r0   r1   r   r[   load_shell_contentget)sys_pathr,   sys_vallocale_contentsys_defaultss        r%   r(   r(     sb    G+h677	ww~~h,,X6..~>""7B/Nr&   c                 x    t         j                  d|||        t        j                  dd|z   |d| gd       y)zUpdate system locale configz%Updating %s with locale setting %s=%szupdate-localez--locale-file==FcaptureN)r2   r3   r   r7   r   r,   s      r%   r6   r6     sB    II/7F 	IIx''	

 r&   c                     | j                         dv rt        j                  d||        yt        j                  d|        t        j                  d| gd       y)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Generating locales for %sz
locale-genFr   )r4   r2   r3   r   r   s      r%   r5   r5     sK     ||~22		8'6J II)62II|V$e4r&   )z"/etc/network/interfaces.d/eth0.cfg)r   )loggingr/   typingr   	cloudinitr   r   r   (cloudinit.distros.package_management.aptr   4cloudinit.distros.package_management.package_managerr   "cloudinit.distros.parsers.hostnamer	   cloudinit.net.netplanr
   	getLoggerr   r2   r   NETWORK_CONF_FNr-   r   rA   r(   r6   r5   r`   r&   r%   <module>r      sw     	  ) ) 8 O ; 8g!  <&|8W^^ |8~@ !/ 5r&   