
    x[hF)              
       @   U d Z 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
mZ ddlmZ ddlm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egeg dZeed<    ej<                  e      Z de!de"de!fdZ#dede"de"fdZ$defdZ%de"dedede!ddf
dZ&ddZ'y)zFSet Passwords: Set user passwords and enable/disable SSH password auth    N)List)features	lifecyclesubputil)Cloud)Config)
MetaSchema)ALL_DISTROSDistroug_util)log_util)PER_INSTANCE)update_ssh_configcc_set_passwords)iddistros	frequencyactivate_by_schema_keysmeta
users_listpw_typereturnc                     | sg S | D cg c].  }|j                  dd      |k(  r|d   |j                  dd      f0 c}S c c}w )zDeither password or type: RANDOM is required, user is always requiredtypehashnamepasswordRANDOM)get)r   r   items      C/usr/lib/python3/dist-packages/cloudinit/config/cc_set_passwords.pyget_users_by_typer#   #   sZ      	
 #
xx'72 &\488J9:

s   3?distroservice
extra_argsc                     	  | j                   d|g|  t        j                  d       y # t        j                  $ r }t        j                  d|       Y d }~y d }~ww xY w)NrestartzRestarted the SSH daemon.zm'ssh_pwauth' configuration may not be applied. Cloud-init was unable to restart SSH daemon due to error: '%s')manage_serviceLOGdebugr   ProcessExecutionErrorwarning)r$   r%   r&   es       r"   _restart_ssh_daemonr/   0   sZ    
i>:>		-.%% 
>	
 	

s   ), AAAc                    |j                  dd      }d}t        | t              rt        j                  ddd       t        j                  |       rd}nct        j                  |       rd	}nKd
| d}| | j                         dk(  rt        j                  d||        yt        j                  d||        yt        ||i      }|st        j                  d|       y|j                         rTt        j                  ddddd|g      j                  j!                         }|j                         dv rt#        ||d       yyt#        ||       y)zApply sshd PasswordAuthentication changes.

    @param pw_auth: config setting from 'pw_auth'.
                    Best given as True, False, or "unchanged".
    @param distro: an instance of the distro class for the target distribution

    @return: Nonessh_svcnamesshPasswordAuthenticationz-Using a string value for the 'ssh_pwauth' key22.2z&Use a boolean value with 'ssh_pwauth'.
deprecateddeprecated_versionextra_messageyesnozLeaving SSH config 'z' unchanged.N	unchangedz%s ssh_pwauth=%sz$%s Unrecognized value: ssh_pwauth=%sz/No need to restart SSH service, %s not updated.	systemctlshowz
--propertyActiveStatez--value)active
activating	reloadingz--job-mode=ignore-dependencies)
get_option
isinstancestrr   	deprecater   is_trueis_falselowerr*   r+   r-   r   uses_systemdr   stdoutstripr/   )pw_authr$   r%   cfg_namecfg_valbmsgupdatedstates           r"   handle_ssh_pwauthrR   <   sF    u5G'H'3F%B	

 ||G	w	%hZ|<?gmmo<II($8 	 KK>gN7 34G		CXN			
 & 	 ;;=AA  !A B" 	FG,    r   cfgcloudargsc                 	   |j                   }|r|d   }d|v r%d|d   v r|d   d= nt        j                  |dd       }d}g }g }d|v r|d   }	t        j                  |	dg       }d|	v r|	d   rt	        j
                  dd	d
       t        |	d   t              r-t        j                  d       t        j                  |	d|      }nUt	        j
                  ddd       t        j                  d       t        j                  |	d      }
|
r|
j                         }t        j                  |	d|      }|sU|sS|rQt        j                  ||      \  }}t        j                  |      \  }}|r	|d|g}nt        j                  d       g }|s|rAt!        |d      }|D cg c]  \  }}|	 }}}t!        |d      }|D cg c]  \  }}|	 }}}g }t!        |d      D ]I  \  }}t#               }|j%                  |       |j%                  ||f       |j%                  | d|        K t'        j(                  d      }|D ]  }|j+                  dd      \  }}|j-                  |      )d|vr%|j%                  ||f       |j%                  |       R|dk(  s|dk(  r t#               }|j%                  |d|       |j%                  ||f       |j%                  |        |r*	 t        j                  d|       |j/                  |d       |r*	 t        j                  d|       |j/                  |d       t5        |      r.d d!j7                  |      f}t9        j:                  d"|z  dd#       |r[|}t<        j>                  r||z  }g }|D ]%  }	 |jA                  |       |j%                  |       ' |rt        j                  d%|       tC        |jE                  d&      |       t5        |      r$t        j                  d't5        |             |d(   y c c}}w c c}}w # t0        $ r7}|j%                  |       t        j2                  t        d|       Y d }~Td }~ww xY w# t0        $ r7}|j%                  |       t        j2                  t        d|       Y d }~kd }~ww xY w# t0        $ r7}|j%                  |       t        j2                  t        d$|       Y d }~Xd }~ww xY w))Nr   chpasswdlistr   Tusers)defaultzConfig key 'lists'z22.3zUse 'users' instead.r5   z$Handling input for chpasswd as list.zThe chpasswd multiline stringr4   zUse string type instead.z0Handling input for chpasswd as multiline string.expire:z2No default or defined user to change password for.textr   r   z\$(1|2a|2y|5|6)(\$.+){2}   RzChanging password for %s:F)hashedz,Failed to set passwords with chpasswd for %szSetting hashed password for %s:z3Failed to set hashed passwords with chpasswd for %sz%Set the following 'random' passwords

z%s
%s
)stderrfallback_to_stdoutzFailed to set 'expire' for %szExpired passwords for: %s users
ssh_pwauthz+%s errors occurred, re-raising the last one)#r$   r   get_cfg_option_strget_cfg_option_listr   rE   rC   rY   r*   r+   
splitlinesget_cfg_option_boolr   normalize_users_groupsextract_defaultr-   r#   rand_user_passwordappendrecompilesplitmatchrX   	Exceptionlogexclenjoinr   	multi_logr   EXPIRE_APPLIES_TO_HASHED_USERSexpire_passwdrR   r    )r   rT   rU   rV   r$   r   r\   plistr   chfg	multilinerZ   _groupsuser_user_configerrorsplist_in_hashed_plist_inhashed_usersrandlistproglineupr.   blurbusers_to_expireexpired_userss                                r"   handler   ~   s   \\F73z?!:J'**3
DAFEJS:--dGRH
T>d6l/#)4
 $v,-		@A00vuE##>'-"<
 		LM 33D&A	%002E))$&A%X"99#vF&66u=| $h/0EKKLMF
 %Z8%-.'$..+J?,;<q<<(X> 	2GD!)+HLLOOT8,-OOtfAhZ01		2 zz56 	 D::c1%DAqzz!}(S\&&1v.##A& 8qH}*,AOOq!$45A'Q	  		5u=7 			;\J= x=8		(#E U"5U #O66</M$ II((+!((+I 		;]Kcggl+V4
6{		?VMRj ] /<@  a G   a I  4 ! IMM!$KK%DaHHIsT    P P!%)P' )Q* "R-'	Q'0,Q""Q'*	R*3,R%%R*-	S-6,S((S-c           
      z   | dk  rt        d      t        j                  t        j                        t        j                  t        j
                        t        j                  t        j                        t        j                  t        j                        g}|j                  t        t        j                  | t        |      z
  t        j                  t        j
                  z   t        j                  z   t        j                  z                      t        j                  |       dj                  |      S )N   z.Password length must be at least 4 characters.)select_from )
ValueErrorrandomchoicestringdigitsascii_lowercaseascii_uppercasepunctuationextendrY   r   rand_strru   shufflerv   )pwlenres_rand_lists     r"   rm   rm     s    qyIJJ 	fmm$f,,-f,,-f(()	M MMM**"MM(()(() $$%	

 NN=!77=!!rS   )   )(__doc__loggingr   ro   r   typingr   	cloudinitr   r   r   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   cloudinit.distrosr   r   r   cloudinit.logr   cloudinit.settingsr   cloudinit.ssh_utilr   r   __annotations__	getLogger__name__r*   rY   rD   r#   r/   rR   r   rm    rS   r"   <module>r      s    M   	   5 5 ! # . : : " + 0 }!	j  g!
$ 
 
 
	
 	
 	
3 	
?-v ?-DE E6 E% Et E EP"rS   