3 \me@sxddlZddlZddlZddlmZddlZddlmZmZddl m Z ddl m Z ej eZGdddejjjZdS)N)StringIO)subputil)FreeBSDNetworking) PER_INSTANCEc@seZdZdZeZdZdZdZdZ dddgZ d d gZ d d gZ d d gZ d d gZdZdZed+ddZeddeeedddZddZddZddZd,ddZd d!Zd-d"d#Zd$d%Zd&d'Zeeeeeeed(d)d*ZdS).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-userspwgroupaddZpkgZinstallremoveupdateZupgradeTz /usr/homeNcCs8tjjd}|dkr"tjddStjdd|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 ZRC_PIDNz0Unable to reload rc(8): no RC_PID in Environmentkillz-SIGALRMT)capturercs)osenvirongetLOGZwarningr)clsrZrc_pidr/usr/lib/python3.6/freebsd.py reload_init(s   zDistro.reload_init)r)actionservice 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) rrrrrr r!r"reloadz try-reloadr#r$T)rr)init_cmdlistr)rrrrrr&Zcmdscmdrrrmanage_service6s  zDistro.manage_servicecCsddd|d|gS)Nrusermodz-nz-Gr)self member_nameZ group_namerrr_get_add_member_to_group_cmdRsz#Distro._get_add_member_to_group_cmdc Kstj|rtjd|dSddd|g}ddd|g}dddd d d d d }dddd}xn|jD]b\}}||kr|rt|ttfr|j||t|gq\||kr\|r\|j |||j ||q\Wd|ksd|kr|j d|j dn@|j dj |j |d|j d|j dj |j |d|j dtjd|yt j ||dWn&t k rltjtd|YnX|jdd} | dk r|j|| dddS)Nz!User %s already exists, skipping.FrZuseraddz-nz-dz-cz-gz-Gz-sz-Ez-u)ZhomedirZgecosZ primary_groupgroupsshellZinactiveZuidz--no-user-groupz--systemz --no-log-init)Z no_user_groupsystemZ no_log_initZno_create_homer0z-d/nonexistentz-d{home_dir}/{name})home_dirnamez-mzAdding user %s) logstringzFailed to create user %spasswdT)hashed)rZis_userrinfoitems isinstancestrintextendappendformatr1r Exceptionlogexcr set_passwd) r+r2kwargsZpw_useradd_cmdZlog_pw_useradd_cmdZpw_useradd_optsZpw_useradd_flagskeyvalZ passwd_valrrradd_userUsN            zDistro.add_userc CsBytjdd|ddgWn$tk r<tjtd|YnXdS)Nrr*z-pz 01-Jan-1970z"Failed to set pw expiration for %s)rr>rr?r)r+userrrr expire_passwds zDistro.expire_passwdFc CsZ|r d}nd}y"tjdd||dg|d|dWn$tk rTtjtd|YnXdS) Nz-Hz-hrr*0zchpasswd for %s)datar3zFailed to set password for %s)rr>rr?r)r+rEr4r5Zhash_optrrrr@s zDistro.set_passwdc CsBytjdd|ddgWn$tk r<tjtd|YnXdS)Nrr*z-wnoz)Failed to lock password login for user %s)rr>rr?r)r+r2rrr lock_passwds zDistro.lock_passwdcCst}x:tj|jjD]&}|jtjdd|||jdqWtj|j|j tj |j|j y t j d|tjd|jgWn^tjk rtjt d|ytj|j |jWn$tk rtjt d|jYnXYnXdS)Nz ^default:zdefault:lang=%s: zRunning cap_mkdb for %sZcap_mkdbzFailed to apply locale %szFailed to restore %s backup)rrZ load_file login_conf_fn splitlineswriteresubcopylogin_conf_fn_bakZ write_filegetvaluerdebugrZProcessExecutionErrorr?IOError)r+ZlocaleZout_fnZnewconflinerrr apply_locales" zDistro.apply_localecCstjj}d|d<|S)zJReturn environment vars used in FreeBSD package_command operationsZYESZASSUME_ALWAYS_YES)rrrQ)r+errr_get_pkg_cmd_environs zDistro._get_pkg_cmd_environcCs|jjd|jdgtddS)Nzupdate-sourcesr )Zfreq)Z_runnerZrunZpackage_commandr)r+rrrupdate_package_sourcess zDistro.update_package_sources)path lease_filepid_file interface config_filereturncCs"|d|d|g|rd||gn|gS)Nz-lz-pz-cr)r[r\r]r^r_rrrbuild_dhclient_cmds zDistro.build_dhclient_cmd)N)F)N) __name__ __module__ __qualname____doc__rZnetworking_clsZ usr_lib_execrLrRZ ci_sudoers_fnZgroup_add_cmd_prefixZpkg_cmd_install_prefixZpkg_cmd_remove_prefixZpkg_cmd_update_prefixZpkg_cmd_upgrade_prefixZ prefer_fqdnr1 classmethodrr9r)r-rDrFr@rJrWrYrZ staticmethodr'rarrrrrs@  :  r)ZloggingrrOiorZcloudinit.distros.bsdZ cloudinitrrZcloudinit.distros.networkingrZcloudinit.settingsrZ getLoggerrbrZdistrosZbsdZBSDrrrrrs