diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-11-07 19:27:23 -0600 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-11-07 19:27:23 -0600 |
commit | 007eed6403d77bbfc4164114875ce6253aff7ab4 (patch) | |
tree | adc3085a95a003d2430947b0acc3d9cd7097e431 /hscript | |
parent | f6c45bc408a9afc02d733b69877c17c5941e8019 (diff) | |
download | horizon-007eed6403d77bbfc4164114875ce6253aff7ab4.tar.gz horizon-007eed6403d77bbfc4164114875ce6253aff7ab4.tar.bz2 horizon-007eed6403d77bbfc4164114875ce6253aff7ab4.tar.xz horizon-007eed6403d77bbfc4164114875ce6253aff7ab4.zip |
hscript: Implement Runner.Execute.UserAccounts, add tests
Diffstat (limited to 'hscript')
-rw-r--r-- | hscript/script_e.cc | 21 | ||||
-rw-r--r-- | hscript/user.cc | 91 |
2 files changed, 101 insertions, 11 deletions
diff --git a/hscript/script_e.cc b/hscript/script_e.cc index 24b66ef..85c43d3 100644 --- a/hscript/script_e.cc +++ b/hscript/script_e.cc @@ -481,7 +481,26 @@ bool Script::execute() const { EXECUTE_OR_FAIL("keymap", internal->keymap) } - /* UserAccounts */ + for(auto &acct : internal->accounts) { + output_info("internal", "setting up user account " + acct.first); + + EXECUTE_OR_FAIL("username", acct.second->name) + if(acct.second->alias) { + EXECUTE_OR_FAIL("useralias", acct.second->alias) + } + if(acct.second->passphrase) { + EXECUTE_OR_FAIL("userpw", acct.second->passphrase) + } + if(!acct.second->groups.empty()) { + for(auto &grp : acct.second->groups) { + EXECUTE_OR_FAIL("usergroups", grp) + } + } + if(acct.second->icon) { + EXECUTE_OR_FAIL("usericon", acct.second->icon) + } + } + EXECUTE_OR_FAIL("timezone", internal->tzone) output_step_end("post-metadata"); diff --git a/hscript/user.cc b/hscript/user.cc index f8a46a1..4930677 100644 --- a/hscript/user.cc +++ b/hscript/user.cc @@ -17,6 +17,7 @@ #include <sstream> #include <time.h> #include "user.hh" +#include "util.hh" #include "util/net.hh" #include "util/output.hh" @@ -183,8 +184,8 @@ bool RootPassphrase::execute(ScriptOptions options) const { new_shadow << shadow_stream.str(); return true; #else - return false; -#endif /* HAS_INSTALL_ENV */ + return false; /* LCOV_EXCL_LINE */ +#endif /* HAS_INSTALL_ENV */ } @@ -208,8 +209,25 @@ Key *Username::parseFromData(const std::string &data, int lineno, int *errors, return new Username(lineno, data); } -bool Username::execute(ScriptOptions) const { - return false; +bool Username::execute(ScriptOptions opts) const { + output_info("installfile:" + std::to_string(line), + "username: creating account " + _value); + + if(opts.test(Simulate)) { + std::cout << "useradd -c \"Adélie User\" -m -U " << _value + << std::endl; + return true; + } + +#ifdef HAS_INSTALL_ENV + if(run_command("useradd", {"-c", "Adélie User", "-m", "-U", _value}) != 0) + { + output_error("installfile:" + std::to_string(line), + "username: failed to create user account"); + return false; + } +#endif /* HAS_INSTALL_ENV */ + return true; /* LCOV_EXCL_LINE */ } @@ -232,8 +250,24 @@ bool UserAlias::validate(ScriptOptions) const { return true; } -bool UserAlias::execute(ScriptOptions) const { - return false; +bool UserAlias::execute(ScriptOptions opts) const { + output_info("installfile:" + std::to_string(line), + "useralias: setting GECOS name for " + _username); + + if(opts.test(Simulate)) { + std::cout << "usermod -c \"" << _alias << "\" " << _username + << std::endl; + return true; + } + +#ifdef HAS_INSTALL_ENV + if(run_command("usermod", {"-c", _alias, _username}) != 0) { + output_error("installfile:" + std::to_string(line), + "useralias: failed to change GECOS of user " + _username); + return false; + } +#endif /* HAS_INSTALL_ENV */ + return true; /* LCOV_EXCL_LINE */ } @@ -263,8 +297,23 @@ bool UserPassphrase::validate(ScriptOptions) const { return true; } -bool UserPassphrase::execute(ScriptOptions) const { - return false; +bool UserPassphrase::execute(ScriptOptions opts) const { + output_info("installfile:" + std::to_string(line), + "userpw: setting passphrase for " + _username); + + if(opts.test(Simulate)) { + std::cout << "usermod -p '" << _passphrase << "' " << _username + << std::endl; + } + +#ifdef HAS_INSTALL_ENV + if(run_command("usermod", {"-p", _passphrase, _username}) != 0) { + output_error("installfile:" + std::to_string(line), + "userpw: failed to set passphrase for " + _username); + return false; + } +#endif /* HAS_INSTALL_ENV */ + return true; } @@ -345,6 +394,28 @@ bool UserGroups::validate(ScriptOptions) const { return true; } -bool UserGroups::execute(ScriptOptions) const { - return false; +bool UserGroups::execute(ScriptOptions opts) const { + output_info("installfile:" + std::to_string(line), + "usergroups: setting group membership for " + _username); + + std::string groups; + for(auto &grp : _groups) { + groups += grp + ","; + } + /* remove the last comma. */ + groups.pop_back(); + + if(opts.test(Simulate)) { + std::cout << "usermod -aG " << groups << " " << _username << std::endl; + return true; + } + +#ifdef HAS_INSTALL_ENV + if(run_command("usermod", {"-a", "-G", groups, _username}) != 0) { + output_error("installfile:" + std::to_string(line), + "usergroups: failed to add groups to " + _username); + return false; + } +#endif /* HAS_INSTALL_ENV */ + return true; /* LCOV_EXCL_LINE */ } |