o x[h"@s|ddlZddlZddlZddlmZddlZddlmZmZddl m Z ddl m Z m Z eeZGdddejjjZdS)N)StringIO)subputil)FreeBSDNetworking) PER_ALWAYS PER_INSTANCEc @s&eZdZdZeZdZdZdZdZ gdZ ddgZ dd gZ dd gZ dd gZd Zd ZdZdZgdZed9ddZedddededefddZddZdefddZdd Zd:d"d#Zd$d%Zd&d'Zd9d(d)Zd*d+Z d!d,d-d.Z!e"d/ed0ed1ed2ed3ede#f d4d5Z$e"d6eddfd7d8Z%dS);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)pwgroupaddpkginstallremoveupdateupgradeTz /usr/homez/var/dbzdhclient.leases.\w+)z ^{username}::z^{username}:\*:z^{username}:\*LOCKED\*:NcCs8tjd}|durtddStjdd|gd|dS)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 Environmentkillz-SIGALRMTcapturercs)osenvirongetLOGwarningr)clsrrc_pidr;/usr/lib/python3/dist-packages/cloudinit/distros/freebsd.py reload_init7s  zDistro.reload_init)ractionservice 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 stopstartenableenableddisableonestartonestoprestartstatus onestatus) r#r$r%r&r'r(r)r*reloadz try-reloadr+r,Tr)init_cmdlistr)rr r!rr"r.cmdscmdrrrmanage_serviceEs  zDistro.manage_servicecCsddd|d|gS)Nr usermod-n-Gr)self member_name group_namerrr_get_add_member_to_group_cmdasz#Distro._get_add_member_to_group_cmdreturnc Kst|r td|dSddd|g}ddd|g}dddd d d d d }dddd}|D]1\}}||vrJ|rJt|ttfrJ|||t|gq-||vr^|r^| ||| ||q-d|vsgd|vrr| d| dn$| d|j d|} | d| | d| d| | dtd|z t j ||dWnt yttd|w| dd} | dur|j|| dddS)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 useraddr4z-d-cz-gr5z-sz-Ez-u)homedirgecos primary_groupgroupsshellinactiveuidz--no-user-groupz--systemz --no-log-init) no_user_groupsystem no_log_initno_create_homerEz-d/nonexistentr=/z-mzAdding user %s) logstringzFailed to create user %spasswdNT)hashed)ris_userrinfoitems isinstancestrintextendappendrhome_dirr Exceptionlogexc set_passwd) r6namekwargspw_useradd_cmdlog_pw_useradd_cmdpw_useradd_optspw_useradd_flagskeyvalr= passwd_valrrradd_userdsV             zDistro.add_usercC:z tdd|ddgWdStyttd|w)Nr r3-pz 01-Jan-1970z"Failed to set pw expiration for %srrUrrVr)r6userrrr expire_passwd  zDistro.expire_passwdFcCsR|rd}nd}ztjdd||dg|d|dWdSty(ttd|w) Nz-Hz-hr r30zchpasswd for %s)datarIzFailed to set password for %srd)r6rerJrKhash_optrrrrWs  zDistro.set_passwdcCrb)Nr r3z-wnoz)Failed to lock password login for user %srdr6rXrrr lock_passwdrgzDistro.lock_passwdcCstd|dS)NzRDragonfly BSD/FreeBSD password lock is not reversible, ignoring unlock for user %s)rdebugrlrrr unlock_passwdszDistro.unlock_passwdc Cst}t|jD]}|tdd|||dq t|j|j t |j| zt d|td|jgWdStjyptt d|z t|j |jWYdStyott d|jYYdSww)Nz ^default:zdefault:lang=%s: zRunning cap_mkdb for %scap_mkdbzFailed to apply locale %szFailed to restore %s backup)rrload_text_file login_conf_fn splitlineswriteresubcopylogin_conf_fn_bak write_filegetvaluerrnrProcessExecutionErrorrVIOError)r6localeout_fnnewconflinerrr apply_locales*    zDistro.apply_localecCsddiS)zJReturn environment vars used in FreeBSD package_command operationsASSUME_ALWAYS_YESYESr)r6rrr_get_pkg_cmd_environszDistro._get_pkg_cmd_environ)forcecCs$|jjd|jdg|r tntddS)Nzupdate-sourcesr)freq)_runnerrunpackage_commandrr)r6rrrrupdate_package_sourcess   zDistro.update_package_sourcespath lease_filepid_file interface config_filecCs$|d|d|g|rd||gS|gS)Nz-lrcr<r)rrrrrrrrbuild_dhclient_cmds  zDistro.build_dhclient_cmddevicecCstdd|gdS)N camcontroleject)r)rrrr eject_mediaszDistro.eject_media)N)F)&__name__ __module__ __qualname____doc__rnetworking_cls usr_lib_execrsry ci_sudoers_fngroup_add_cmd_prefixpkg_cmd_install_prefixpkg_cmd_remove_prefixpkg_cmd_update_prefixpkg_cmd_upgrade_prefix prefer_fqdnrTdhclient_lease_directorydhclient_lease_file_regex#shadow_empty_locked_passwd_patterns classmethodrrPr2r9boolrarfrWrmrorrr staticmethodr/rrrrrrrsj   >    r)loggingrrviorcloudinit.distros.bsd cloudinitrrcloudinit.distros.networkingrcloudinit.settingsrr getLoggerrrdistrosbsdBSDrrrrrs