
    x[h"                         S SK r S SKrS SKrS SKJr  S SKrS SKJrJr  S SK	J
r
  S SKJrJr  \ R                  " \5      r " S S\R"                  R$                  R&                  5      rg)    N)StringIO)subputil)FreeBSDNetworking)
PER_ALWAYSPER_INSTANCEc                   >   \ rS rSrSr\rSrSrSr	Sr
/ SQrSS	/rSS
/rSS/rSS/rSrSrSrSr/ SQr\S.S j5       r\SS.S\S\S\4S jj5       rS rS\4S jrS rS/S jrS rS  rS.S! jr S" r!SS#.S$ jr"\#S%\S&\S'\S(\S)\S\$4S* j5       r%\#S+\SS4S, j5       r&S-r'g)0Distro   zM
Distro subclass for FreeBSD.

(N.B. DragonFlyBSD inherits from this class.)
z/usr/local/libz/etc/login.confz/etc/login.conf.origz,/usr/local/etc/sudoers.d/90-cloud-init-users)pwgroupaddpkginstallremoveupdateupgradeTz	/usr/homez/var/dbzdhclient.leases.\w+)z^{username}::z^{username}:\*:z^{username}:\*LOCKED\*:Nc                     [         R                  R                  S5      nUc  [        R	                  S5        g[
        R
                  " SSU/SUS9$ )z
Tell rc to reload its configuration
Note that this only works while we're still in the process of booting.
May raise ProcessExecutionError
RC_PIDNz0Unable to reload rc(8): no RC_PID in Environmentkillz-SIGALRMTcapturercs)osenvirongetLOGwarningr   )clsr   rc_pids      ;/usr/lib/python3/dist-packages/cloudinit/distros/freebsd.pyreload_initDistro.reload_init7   sE     )>KKJKyy&*f5tMM    )r   actionservice
extra_argsc                    U R                   nUS/US/US/US/US/US/US/US/US/US/US	/US
/S.nXVU   -   [        U5      -   n[        R                  " USUS9$ )z
Perform the requested action on a service. This handles FreeBSD's
'service' case. The FreeBSD 'service' is closer in features to
'systemctl' than SysV init's 'service', so we override it.
May raise ProcessExecutionError
stopstartenableenableddisableonestartonestoprestartstatus	onestatus)r)   r*   r+   r,   r-   r.   r/   r0   reloadz
try-reloadr1   r2   Tr   )init_cmdlistr   )r   r%   r&   r   r'   r4   cmdscmds           r!   manage_serviceDistro.manage_serviceE   s     <<f%w')++ *-++	*"I.)!;/
 f%Z(88yyd44r$   c                     SSSUSU/$ )Nr   usermod-n-G )selfmember_name
group_names      r!   _get_add_member_to_group_cmd#Distro._get_add_member_to_group_cmda   s    i{D*EEr$   returnc                    [         R                  " U5      (       a  [        R                  SU5        gSSSU/nSSSU/nSSSS	S
SSS.nSSSS.nUR	                  5        H  u  pxXu;   aB  U(       a;  [        U[        [        45      (       a   UR                  XW   [        U5      /5        ML  Xv;   d  MS  U(       d  M\  UR                  Xg   5        UR                  Xg   5        M     SU;   d  SU;   a#  UR                  S5        UR                  S5        OkUR                  SU R                   SU 35      n	UR                  SU	-   5        UR                  S5        UR                  SU	-   5        UR                  S5        [        R                  SU5         [        R                  " X4S9  UR                  SS5      n
U
b  U R                  XSS9  g! [         a    [         R                  " [        SU5        e f = f)zf
Add a user to the system using standard tools

Returns False if user already exists, otherwise True.
z!User %s already exists, skipping.Fr   useraddr<   z-d-cz-gr=   z-sz-Ez-u)homedirgecosprimary_groupgroupsshellinactiveuidz--no-user-groupz--systemz--no-log-init)no_user_groupsystemno_log_initno_create_homerP   z-d/nonexistentrH   /z-mzAdding user %s)	logstringzFailed to create user %spasswdNT)hashed)r   is_userr   infoitems
isinstancestrintextendappendr   home_dirr   	Exceptionlogexc
set_passwd)r?   namekwargspw_useradd_cmdlog_pw_useradd_cmdpw_useradd_optspw_useradd_flagskeyvalrH   
passwd_vals              r!   add_userDistro.add_userd   s    <<HH8$?	46"ItT: !
 / *
 HC%#*S3*2M2M%%';SX&FG(SS%%&6&;<"))*:*?@ ' v%V);!!"23%%&67jjt}}oQtf,EFG!!$.1!!$'%%dWn5%%d+ 	!4(	IInC ZZ$/
!OODTO:   	KK7>	s   G (G8c                      [         R                   " SSUSS/5        g ! [         a    [        R                  " [        SU5        e f = f)Nr   r;   -pz01-Jan-1970z"Failed to set pw expiration for %sr   r`   r   ra   r   )r?   users     r!   expire_passwdDistro.expire_passwd   sA    	IItYdMBC 	KKA4H		    (AFc                     U(       a  SnOSn [         R                   " SSXS/USU-  S9  g ! [         a    [        R                  " [        SU5        e f = f)	Nz-Hz-hr   r;   0zchpasswd for %s)datarT   zFailed to set password for %srp   )r?   rq   rU   rV   hash_opts        r!   rb   Distro.set_passwd   s\    HH	IIy$#6+d2
  	KK<dC	s	   , (Ac                      [         R                   " SSUSS/5        g ! [         a    [        R                  " [        SU5        e f = f)Nr   r;   z-wnoz)Failed to lock password login for user %srp   r?   rc   s     r!   lock_passwdDistro.lock_passwd   sA    	IItYdD9: 	KKH$O	rt   c                 0    [         R                  SU5        g )NzRDragonfly BSD/FreeBSD password lock is not reversible, ignoring unlock for user %s)r   debugr|   s     r!   unlock_passwdDistro.unlock_passwd   s    		*	
r$   c                 P   [        5       n[        R                  " U R                  5      R	                  5        H>  nUR                  [        R                  " SSU-  U5      5        UR                  S5        M@     [        R                  " U R                  U R                  5        [        R                  " U R                  UR                  5       5         [        R                  SU5        [        R                  " SU R                  /5        g ! [        R                   a    [        R                   " [        SU5         [        R                  " U R                  U R                  5         g ! ["         a*    [        R                   " [        SU R                  5          g f = ff = f)Nz	^default:zdefault:lang=%s:
zRunning cap_mkdb for %scap_mkdbzFailed to apply locale %szFailed to restore %s backup)r   r   load_text_filelogin_conf_fn
splitlineswriteresubcopylogin_conf_fn_bak
write_filegetvaluer   r   r   ProcessExecutionErrorra   IOError)r?   localeout_fnnewconflines        r!   apply_localeDistro.apply_locale   s2   *''(:(:;FFHDMM|%86%A4H MM$	 I 			$$$d&<&<= 	**G,<,<,>?	II/8IIz4#5#567)) 	KK8&A		$00$2D2DE 68J8J	s*   8D 0F% +E--0F!F% F!!F%c                 
    SS0$ )zBReturn environment vars used in FreeBSD package_command
operationsASSUME_ALWAYS_YESYESr>   )r?   s    r!   _get_pkg_cmd_environDistro._get_pkg_cmd_environ   s     $U++r$   )forcec                t    U R                   R                  SU R                  S/U(       a  [        O[        S9  g )Nzupdate-sourcesr   )freq)_runnerrunpackage_commandr   r   )r?   r   s     r!   update_package_sourcesDistro.update_package_sources   s1      J$,	 	 	
r$   path
lease_filepid_file	interfaceconfig_filec                 2    U SUSU/U(       a  SXC/-   $ U/-   $ )Nz-lro   rG   r>   )r   r   r   r   r   s        r!   build_dhclient_cmdDistro.build_dhclient_cmd   s5     dJh7.9T;*
 	
@I{
 	
r$   devicec                 6    [         R                   " SSU /5        g )N
camcontroleject)r   )r   s    r!   eject_mediaDistro.eject_media   s    		<&12r$   r>   )N)F)(__name__
__module____qualname____firstlineno____doc__r   networking_clsusr_lib_execr   r   ci_sudoers_fngroup_add_cmd_prefixpkg_cmd_install_prefixpkg_cmd_remove_prefixpkg_cmd_update_prefixpkg_cmd_upgrade_prefixprefer_fqdnr_   dhclient_lease_directorydhclient_lease_file_regex#shadow_empty_locked_passwd_patternsclassmethodr"   r[   r8   rB   boolrl   rr   rb   r}   r   r   r   r   staticmethodr5   r   r   __static_attributes__r>   r$   r!   r
   r
      sc    'N#L%M.BM1#Y/"H-"H-#Y/KH  ) 6+' N N >B55#&5585 56F<$ <| 
8,
 /4 
 	
	
	
 	
 		

 	
 
	
 	
 3C 3D 3 3r$   r
   )loggingr   r   ior   cloudinit.distros.bsd	cloudinitr   r   cloudinit.distros.networkingr   cloudinit.settingsr   r   	getLoggerr   r   distrosbsdBSDr
   r>   r$   r!   <module>r      sO     	 	     : 7!j3Y""&& j3r$   