
    }fv\                         d dl Z d dlZ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
mZmZmZ d dlmZ d dlmZmZ  e j&                  e      ZdZ G d d	e
j.                        Zy)
    N)datetime)AnyDictOptional)distroshelperssubputil)HostnameConf)
PER_ALWAYSPER_INSTANCEa7  # 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}

c                   Z    e Zd ZdZdZdZdZdZdeediZ	dZ
d	Zd
 Zd Zd.dZdej                   fdZd Zd Zd Zd.dZd ZdedededefdZd Zd/dZdddZed        Z fd Z fd!Z fd"Z d. fd#	Z!d0d$Z"e#d%        Z$e%dd&d'ed(ed)efd*       Z&e#d+ed,e'e   fd-       Z( xZ)S )1Distrozpy3-pipz/usr/share/bkeymaps/z&/etc/profile.d/50-cloud-init-locale.shz/etc/network/interfacesz/etc/shadoweni)eni_path
eni_headerz/var/lib/dhcpzdhclient\.leasesc                     t         j                  j                  | |||       t        j                  |      | _        d| _        d| _        d|d<   y )NzC.UTF-8alpinesshdssh_svcname)r   r   __init__r   Runners_runnerdefault_localeosfamily)selfnamecfgpathss       :/usr/lib/python3/dist-packages/cloudinit/distros/alpine.pyr   zDistro.__init__.   sE    dC7 u-' #M    c                     | j                   S )zgThe default locale for Alpine Linux is different than
        cloud-init's DataSource default.
        )r   r   s    r    
get_localezDistro.get_locale8   s     """r!   Nc                     |s| j                   }|s| j                  }ddddd|z  ddg}t        j                  |dj	                  |      d       y )	N#z?# This file is created by cloud-init once per new instance bootzexport CHARSET=UTF-8zexport LANG=%szexport LC_COLLATE=C 
  )r   locale_conf_fnr
   
write_filejoin)r   localeout_fnliness       r    apply_localezDistro.apply_locale>   s^     ((F((F M"v%!
 			% 0%8r!   pkglistc                 J    | j                          | j                  d|       y )Nadd)pkgs)update_package_sourcespackage_command)r   r1   s     r    install_packageszDistro.install_packagesQ   s!    ##%U1r!   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 createdr'   r)   )_read_hostname_confIOErrorr
   get_cfg_option_bool_cfgLOGinfor   set_hostnamer+   str)r   hostnamefilenameconfr9   s        r    _write_hostnamezDistro._write_hostnameU   s    	 ++H5D #D(##d)U3  
	#'#;#;		14$  $N  
	s   A ABBc                 T    | j                  | j                        }| j                  |fS N)_read_hostnamehostname_conf_fn)r   sys_hostnames     r    _read_system_hostnamezDistro._read_system_hostnamek   s)    **4+@+@A%%|44r!   c                 b    t        t        j                  |            }|j                          |S rG   )r   r
   load_text_fileparse)r   rC   rD   s      r    r:   zDistro._read_hostname_confo   s%    D//9:

r!   c                 l    d }	 | j                  |      }|j                  }|s|S |S # t        $ r Y w xY wrG   )r:   rB   r;   )r   rC   defaultrB   rD   s        r    rH   zDistro._read_hostnamet   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!   layoutmodelvariantoptionsc                    |s"d}t         j                  |       t        |      t        j                  j                  | j                  |      }t        j                  j                  |      s%d|z  }t         j                  |       t        |      |s"d}t         j                  |       t        |      t        j                  j                  |d|z        }t        j                  j                  |      s%d|z  }t         j                  |       t        |      |rt         j                  d       |rt         j                  d       t        j                  d||g       y )	NzKeyboard layout not specified.z,Keyboard layout directory %s does not exist.zKeyboard variant not specified.z
%s.bmap.gzz(Keyboard variant file %s does not exist.z+Keyboard model is ignored for Alpine Linux.z.Keyboard options are ignored for Alpine Linux.zsetup-keymap)r>   errorRuntimeErrorospathr,   keymap_pathisdirisfilewarningr	   )r   rT   rU   rV   rW   msgkeymap_layout_pathkeymap_variant_paths           r    
set_keymapzDistro.set_keymap   s   2CIIcNs##WW\\$*:*:FCww}}/0>$%  IIcNs##3CIIcNs## ggllw 6
 ww~~12:%&  IIcNs##KKEFKKHI		>6734r!   c                 P    t        j                  || j                  |             y )N)tztz_file)r   set_etc_timezone_find_tz_file)r   rf   s     r    set_timezonezDistro.set_timezone   s      B0B0B20FGr!   c                    |g }dg}|j                  d       |r"t        |t              r|j                  |       n#|r!t        |t              r|j	                  |       |r|j                  |       |dk(  r|j	                  ddg       t        j                  d|      }|j	                  |       t        j                  |d       y )	Napkz--quietupgradez--update-cachez--availablez%s-%sF)capture)append
isinstancerA   listextendr
   expand_package_listr	   )r   commandargsr4   cmdr1   s         r    r6   zDistro.package_command   s    <Dg

9JtS)JJtjt,JJtJJwiJJ(-89**7D9

7 			#u%r!   F)forcec                |    | j                   j                  d| j                  dg|rt               y t               y )Nzupdate-sourcesupdate)freq)r   runr6   r   r   )r   rw   s     r    r5   zDistro.update_package_sources   s>      J$	 	 	
 +7	 	 	
r!   c                 D    | j                   s	ddg| _         | j                   S )z7Allow distro to determine the preferred ntp client listchronyntp)_preferred_ntp_clientsr#   s    r    preferred_ntp_clientszDistro.preferred_ntp_clients   s&     **+3U*;D'***r!   c                 R
   t        j                  |      rt        j                  d|       yd|v rt        j	                  d       |d= t        j                  d      rt        |    |fi |S |j                  dd      }dd	g}d
ddddd}ddi}|j                  d      }|rt        |t              r|j                  d      }n,t        |t              rt        j                  d| ddd       |D cg c]  }|j!                          }}dj#                  |      |d<   |j                  d      r|j%                  |d          |rG|rE|D ]@  }	t        j&                  |	      r| j)                  |	       t        j+                  d|	|       B d|v rt        |d         |d<   g dddd}
t-        |j/                               D ]  \  }}||v r)|r't        |t              r|j1                  ||   |g       3||
v r2|r0t        |t              r |dk(  r|j                  d      |
|<   c||
|<   i||v sn|sq|j%                  ||           |j                  d      s|j                  d      r|j%                  d       |j%                  |       t        j+                  d|       	 t        j
                  |       |
d   D ]1  }t        j+                  d!|       	 t        j
                  d"||g       3 |
d$   rt        | m  ||
d$   d%       |
d&   }|
d'   }d}| j8                  }	 t        j:                  |      }d}|j?                         D ]  }|j                  d)      }|d*   |k(  s|} n |rd+}d+d,<   d+|d-<   d+|d.<   d/}|RtA        jB                  |      tA        jB                  d0      z
  jD                  }t        |      |d1<   |d+k7  r|d2z   }|d3z   }|||d4<   |d+k7  r|d2z   }|d5z   }|jG                  |d)j#                  |            }t        j+                  d6||       	 t        jH                  ||d7d8       yt        j4                  t        d:||       yc c}w # t
        j2                  $ r}t        j	                  d |       |d}~ww xY w# t
        j2                  $ r#}t        j4                  t        d#||       |d}~ww xY w# t<        $ r}t        j	                  d(|       |d}~ww xY w# tJ        $ r"}t        j4                  t        d9|       |d}~ww xY w);z
        Add a user to the system using standard tools

        On Alpine this may use either 'useradd' or 'adduser' depending
        on whether the 'shadow' package is installed.
        z!User %s already exists, skipping.Nselinux_userz0Ignoring selinux_user parameter for Alpine Linuxuseraddcreate_groupsTadduserz-Dz-gz-hz-Gz-sz-u)gecoshomedirprimary_groupshelluidsystemz-Sgroups,z	The user z) has a 'groups' config value of type dictz22.3z=Use a comma-delimited string or array instead: group1,group2.)
deprecateddeprecated_versionextra_messager   z created group '%s' for user '%s'r   )r   
expiredateinactivepasswdno_create_homez-HzAdding user %szFailed to create user %szAdding user to group %saddgroupz!Failed to add user %s to group %sr   )hashedr   r   &Failed to read %s file, file not found:r   r'            zpassword agingz
1970-01-01   z & zacct expiration date   zinactivity periodzUpdating %s for user %swomodepreserve_modeFailed to update %s filezFailed to update %s for user %s)&r
   is_userr>   r?   r`   r	   whichsuperadd_userpopgetrp   rA   splitdict	deprecatestripr,   ro   is_groupcreate_groupdebugsorteditemsrr   ProcessExecutionErrorlogexc
set_passwd	shadow_fnrM   FileNotFoundError
splitlinesr   fromisoformatdaysreplacer+   r;   )r   r   kwargsr   adduser_cmdadduser_optsadduser_flagsr   ggroupunsupported_busybox_valueskeyvale
addn_groupr   r   shadow_contentsshadow_fileoriginal_linelinenew_line_partsupdate_typer   	__class__s                           r    r   zDistro.add_user   sv    <<HH8$?V#KKJK~& ::i 7#D3F33

?D9 $' !
 "4( H%&#&c*FD)!*4& 1#  #'-#4	 *00Aaggi0F0  #xx/F8zz/*f_56V O}}U+%%e,II@%NO F?u.F5M 	6
" v||~. 	7HCl"sz#s/C""L$5s#;<11sC( (?69iin.s369.s3%#""=#56	7& ::&'6::h+?t$ 	4  			"D)	IIk" 5
 
	J II/<		:tZ89
	 &h/ G0:4  & 0=
-j9nn	"11+>O #..0 	D!ZZ_Na D( $		 K !#N1 "N1 "N1*K% **:6,,\:;$  %(Iq!"$"-"5K),BB#$,q!"$"-"5K),?? .55sxx7O II/dC4 KK6Ty 1l )) 	KK2D9G	 -- <dJ 	F ! 	KK@+NG	b  C!;[Isf   6Q!(Q& R)S *S; &R9RRS,S

S	S8S33S8;	T&T!!T&c                 r   t         j                  j                  d      rdt        j                  d      vrt        |   |      S dd|g}	 t        j                  |ddg      \  }}t        j                  d|      ry	y# t        j                  $ r"}t        j                  t        d
|       |d}~ww xY w)zL
        Lock the password of a user, i.e., disable password logins
        /usr/bin/passwdbbsuidr   z-lr      rcszis already lockedTz&Failed to disable password for user %sN)r[   r\   islinkreadlinkr   lock_passwdr	   researchr   r
   r   r>   )r   r   rv   _outerrr   r   s         r    r   zDistro.lock_passwd  s     ww~~
R[[):;;7&t,,t$	))CaV4KT3yy-s3 4)) 	KKEtLG	s   2B B6B11B6c                 B   t         j                  j                  d      rdt        j                  d      vrt        |   |      S d }| j                  }	 t        j                  |      }d }|j                         D ]5  }|j                  d      }|d   |k(  st        j                  d|       |} n |rwd   dk7  rXd|d<   |j                  |dj!                  |      d	      }t        j                  d
|       	 t        j"                  ||dd       y t        j                  d|       y t        j&                  t        d|       y # t        $ r}t        j                  d|       |d }~ww xY w# t$        $ r"}t        j&                  t        d|       |d }~ww xY w)Nr   r   r   r   r   z'Found /etc/shadow line matching user %s   0r   zExpiring password for user %sr   Tr   r   z'Password for user %s is already expiredzFailed to set 'expire' for %s)r[   r\   r   r   r   expire_passwdr   r
   rM   r   r>   r`   r   r   r   r   r,   r+   r;   r   )	r   userr   r   r   r   r   r   r   s	           r    r   zDistro.expire_passwd  s    ww~~
R[[):;;7(.. nn	"11+>O #..0 	D!ZZ_Na D(		CTJ $	 
 a C' %(q!"1"9"9!388N#;Q# 		94@	OO#'!&*	 		CTJKK<dCQ ! 	KK@+NG	D  KK%?MGs0   E
 =E3 
	E0E++E03	F<FFc                 \   t        j                  d      rt        |   ||      S d|g}|sg }t	        j
                  |      rt        j                  d|       n,	 t        j                   |       t        j                  d|       t        |      dkD  rd|D ]^  }t	        j                  |      st        j                  d||       0t        j                   d||g       t        j                  d||       ` y y # t         j                  $ r t	        j                  t        d|       Y w xY w)	Ngroupaddr   z(Skipping creation of existing group '%s'zCreated new group %szFailed to create group %sr   zCUnable to add group member '%s' to group '%s'; user does not exist.zAdded user '%s' to group '%s')r	   r   r   r   r
   r   r>   r`   r?   r   r   lenr   )r   r   membersgroup_add_cmdmemberr   s        r    r   zDistro.create_group  s    ::j!7'g66#T*G ==KKBDID		-(/6
 w<!! H||F+KK1	 		:vt458&$GH 	 -- DC!<dCDs   +C: :.D+*D+c                     |dg}|dk(  r|dgz  }|S 	 |j                  t        t        |      dz               |S # t        $ r}t	        d|d      |d }~ww xY w)Nz-dnowr   <   z;power_state[delay] must be 'now' or '+m' (minutes). found 'z'.)ro   rA   int
ValueError	TypeError)r   modedelaymessagert   r   s         r    shutdown_commandzDistro.shutdown_command  sz     , E>uG s3u:?34   &+. s   &; 	AAAc                       y)z1
        Alpine uses OpenRC, not systemd
        FrR   rR   r!   r    uses_systemdzDistro.uses_systemd7  s    
 r!   r   actionservice
extra_argsc          
      T   ddg}ddg}t        |      |dgz   t        |      |dgz   t        |      d|gz   t        |      d|gz   t        |      |dgz   t        |      |dgz   t        |      |dgz   t        |      |d	gz   d
}t        ||         }t        j                  |d|      S )a<  
        Perform the requested action on a service. This handles OpenRC
        specific implementation details.

        OpenRC has two distinct commands relating to services,
        'rc-service' and 'rc-update' and the order of their argument
        lists differ.
        May raise ProcessExecutionError
        z
rc-servicez	--nocolorz	rc-updatestopstartdelr3   restartstatus)r   r   disableenabler   reloadz
try-reloadr   T)rn   r   )rq   r	   )	r   r   r   r   r   init_cmd
update_cmdcmdsrv   s	            r    manage_servicezDistro.manage_service>  s     !+.!;/
Ngv%66(^w&88J'5'*:::&%)99H~)(<<8n';;x.GY+??8n'::	
 4< yyd44r!   blockdevreturnc                    t         j                  j                  |       }| j                  d      rt        j                  t        j
                  |       j                        }t        j                  t        j
                  |       j                        }t        j                  d      5 }|D ]  }|j                  j                  d      s t        j                  |j                        }t        j                  |j                        s_t        j                  t        j
                  |j                        j                        |k(  st        j                  t        j
                  |j                        j                        |k(  st         j                  j                  |j                        } n ddd       |j                  d      rt        j                  d| |       |S y# 1 sw Y   4xY w)a  Returns underlying block device for a mapped device.

        If it is mapped, blockdev will usually take the form of
        /dev/mapper/some_name

        If blockdev is a symlink pointing to a /dev/dm-* device, return
        the device pointed to. Otherwise, return None.
        z/dev/mapperz/dev/zdm-Nz/dev/dm-z$%s is a mapped device pointing to %s)r[   r\   realpath
startswithmajorstatst_rdevminorscandirr   lstatS_ISBLKst_moder>   r   )r  r  r  r	  itdeventryress          r    get_mapped_devicezDistro.get_mapped_deviceZ  sb    77##H-}- HHRWWX.667EHHRWWX.667E G$ & " &H}}//6 hhx}}5<<4 ")?)G)G H#(!)$&HHRWWX]]-C-K-K$L#(%) ,.77+;+;HMM+J %&& z*II6( O'& &s$   +"G,>G,?G,?G,,G,,G5rG   )NN)poweroffr   N)*__name__
__module____qualname__pip_package_namer]   r*   network_conf_fnr   NETWORK_FILE_HEADERrenderer_configsdhclient_lease_directorydhclient_lease_file_regexr   r$   r0   r   PackageListr7   rE   rK   r:   rH   rS   rA   rd   rj   r6   r5   propertyr   r   r   r   r   r   staticmethodr   classmethodr   r   r  __classcell__)r   s   @r    r   r       sK    (K=N/OIO;NO
  / 3$#9&2(;(; 24,5
	 5  5S  53  5  5DH&2 /4 
 + +Sj87Dr!HF4   ?C55$'5695 56 (C (HSM ( (r!   r   )loggingr[   r   r  r   typingr   r   r   	cloudinitr   r   r	   r
   "cloudinit.distros.parsers.hostnamer   cloudinit.settingsr   r   	getLoggerr  r>   r  r   rR   r!   r    <module>r'     sT     	 	   & & 2 2 ; 7g! c	W^^ c	r!   