a '¡Dg"ã@s|ddlZddlZddlZddlmZddlZddlmZmZddl m Z ddl m Z m Z e e¡ZGdd„dejjjƒZdS)éN)ÚStringIO)ÚsubpÚutil)ÚFreeBSDNetworking)Ú PER_ALWAYSÚ PER_INSTANCEc@seZdZdZeZdZdZdZdZ gd¢Z ddgZ dd gZ dd gZ dd gZd Zd ZdZdZgd¢Zed3dd„ƒZeddœeeedœdd„ƒZdd„Zedœdd„Zdd„Zd4d d!„Zd"d#„Zd$d%„Zd5d&d'„Zd(d)„Z dd*œd+d,„Z!e"eeeeee#d-œd.d/„ƒZ$e"edd0œd1d2„ƒZ%dS)6ÚDistrozY 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ÚupdateZupgradeTz /usr/homez/var/dbzdhclient.leases.\w+)z ^{username}::z^{username}:\*:z^{username}:\*LOCKED\*:NcCs8tj d¡}|dur"t d¡dStjdd|gd|d�S)z¬ Tell rc to reload its configuration Note that this only works while we're still in the process of booting. May raise ProcessExecutionError ZRC_PIDNz0Unable to reload rc(8): no RC_PID in EnvironmentÚkillz-SIGALRMT©ZcaptureÚrcs)ÚosÚenvironÚgetÚLOGZwarningr)ÚclsrZrc_pid©rú=/usr/lib/python3.9/site-packages/cloudinit/distros/freebsd.pyÚ reload_init7s   zDistro.reload_init)r)ÚactionÚserviceÚ extra_argsc Gsx|j}|dg|dg|dg|dg|dg|dg|dg|dg|dg|dg|d g|d gd œ }|||t|ƒ}tj|d |d �S)a 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) rrr r!r"r#r$r%Úreloadz try-reloadr&r'Tr)Úinit_cmdÚlistr)rrrrrr)ZcmdsÚcmdrrrÚmanage_serviceEs ôzDistro.manage_servicecCsddd|d|gS)Nr Úusermodú-nú-Gr)ÚselfÚ member_nameZ group_namerrrÚ_get_add_member_to_group_cmdasz#Distro._get_add_member_to_group_cmd)Úreturnc Ksšt |¡rt d|¡dSddd|g}ddd|g}dddd d d d d œ}ddddœ}| ¡D]b\}}||vr”|r”t|ttfƒr”| ||t|ƒg¡qZ||vrZ|rZ|  ||¡|  ||¡qZd|vsÎd|vrä|  d¡|  d¡nH|  d|j ›d|›�¡} |  d| ¡|  d¡|  d| ¡|  d¡t d|¡zt j ||d�Wn$t �ynt td|¡‚Yn0|  dd¡} | du�r–|j|| dd�dS)z~ Add a user to the system using standard tools Returns False if user already exists, otherwise True. z!User %s already exists, skipping.Fr Zuseraddr.z-dú-cz-gr/z-sz-Ez-u)ÚhomedirZgecosZ primary_groupÚgroupsÚshellZinactiveÚuidz--no-user-groupz--systemz --no-log-init)Z no_user_groupÚsystemZ no_log_initZno_create_homer9z-d/nonexistentr5ú/z-mzAdding user %s)Ú logstringzFailed to create user %sÚpasswdNT)Úhashed)rZis_userrÚinfoÚitemsÚ isinstanceÚstrÚintÚextendÚappendrÚhome_dirrÚ ExceptionÚlogexcÚ set_passwd) r0ÚnameÚkwargsZpw_useradd_cmdZlog_pw_useradd_cmdZpw_useradd_optsZpw_useradd_flagsÚkeyÚvalr5Z passwd_valrrrÚadd_userdsR    ù ý        zDistro.add_usercCs@zt dd|ddg¡Wn"ty:t td|¡‚Yn0dS)Nr r-ú-pz 01-Jan-1970z"Failed to set pw expiration for %s©rrFrrGr)r0ÚuserrrrÚ expire_passwd¢s  zDistro.expire_passwdFcCsX|r d}nd}z"tjdd||dg|d|d�Wn"tyRt td|¡‚Yn0dS) Nz-Hz-hr r-Ú0zchpasswd for %s)Údatar;zFailed to set password for %srO)r0rPr<r=Zhash_optrrrrH©s ý  zDistro.set_passwdcCs@zt dd|ddg¡Wn"ty:t td|¡‚Yn0dS)Nr r-z-wÚnoz)Failed to lock password login for user %srO©r0rIrrrÚ lock_passwd¹s  zDistro.lock_passwdcCst d|¡dS)NzRDragonfly BSD/FreeBSD password lock is not reversible, ignoring unlock for user %s)rÚdebugrUrrrÚ unlock_passwdÀsýzDistro.unlock_passwdc Csàtƒ}t |j¡ ¡D]&}| t dd||¡¡| d¡qt |j|j ¡t  |j|  ¡¡z t   d|¡t d|jg¡WnZtjyÚt t d|¡zt |j |j¡Wn"tyÔt t d|j¡Yn0Yn0dS)Nz ^default:zdefault:lang=%s:Ú zRunning cap_mkdb for %sZcap_mkdbzFailed to apply locale %szFailed to restore %s backup)rrZload_text_fileÚ login_conf_fnÚ splitlinesÚwriteÚreÚsubÚcopyÚlogin_conf_fn_bakZ write_fileÚgetvaluerrWrZProcessExecutionErrorrGÚIOError)r0ÚlocaleZout_fnZnewconfÚlinerrrÚ apply_localeÇs&ÿ   ÿzDistro.apply_localecCsddiS)zJReturn environment vars used in FreeBSD package_command operationsZASSUME_ALWAYS_YESZYESr)r0rrrÚ_get_pkg_cmd_environãszDistro._get_pkg_cmd_environ)ÚforcecCs$|jjd|jdg|rtntd�dS)Nzupdate-sourcesr)Zfreq)Z_runnerÚrunZpackage_commandrr)r0rgrrrÚupdate_package_sourcesès  üzDistro.update_package_sources)ÚpathÚ lease_fileÚpid_fileÚ interfaceÚ config_filer3cCs"|d|d|g|rd||gn|gS)Nz-lrNr4r)rjrkrlrmrnrrrÚbuild_dhclient_cmdðs ÿzDistro.build_dhclient_cmd)Údevicer3cCst dd|g¡dS)NZ camcontrolZeject)r)rprrrÚ eject_mediaüszDistro.eject_media)N)F)N)&Ú__name__Ú __module__Ú __qualname__Ú__doc__rZnetworking_clsZ usr_lib_execrZr`Z ci_sudoers_fnZgroup_add_cmd_prefixZpkg_cmd_install_prefixZpkg_cmd_remove_prefixZpkg_cmd_update_prefixZpkg_cmd_upgrade_prefixZ prefer_fqdnrEZdhclient_lease_directoryZdhclient_lease_file_regexZ#shadow_empty_locked_passwd_patternsÚ classmethodrrAr,r2ÚboolrMrQrHrVrXrerfriÚ staticmethodr*rorqrrrrrsT ÿÿ>  ú r)Zloggingrr]ÚiorZcloudinit.distros.bsdZ cloudinitrrZcloudinit.distros.networkingrZcloudinit.settingsrrZ getLoggerrrrZdistrosZbsdZBSDrrrrrÚs