diff --git a/scripts/runtests.sh b/scripts/runtests.sh index 3a25124f..880cad7f 100755 --- a/scripts/runtests.sh +++ b/scripts/runtests.sh @@ -29,6 +29,7 @@ validate () { elif [ "${mode}" = "system_setup" ]; then setup_mode="$2" echo "system setup validation for $setup_mode" + echo "checking launcher-status" [ -d ".subiquity/run/subiquity/" ] || (echo "run/subiquity/ dir not created for status"; exit 1) [ -e ".subiquity/run/subiquity/launcher-status" ] || (echo "run/subiquity/launcher-status not created"; exit 1) expected_status="reboot" @@ -42,6 +43,7 @@ validate () { echo "incorrect run/subiquity/launcher-status: expect ${expected_status}, got ${result_status}" exit 1 fi + echo "checking generated config" [ -d ".subiquity/etc/" ] || (echo "etc/ dir not created for config"; exit 1) if [ "${setup_mode}" = "autoinstall-no-shutdown" ]; then setup_mode="autoinstall" @@ -52,6 +54,31 @@ validate () { conf_filepath=".subiquity/etc/${filename}" diff -Nup "${file}" "${conf_filepath}" || exit 1 done + if [ "${setup_mode}" != "answers-reconf" ]; then + echo "checking user created" + [ -d ".subiquity/home/" ] || (echo "home/ dir not created for the environment"; exit 1) + [ -d ".subiquity/home/ubuntu" ] || (echo "home folder not created for the user"; exit 1) + if grep -v ubuntu .subiquity/etc/passwd ; then + echo "user definition not included in etc/passwd" + exit 1 + fi + if grep -v Ubuntu .subiquity/etc/passwd ; then + echo "username not added in etc/passwd" + exit 1 + fi + if grep -v ubuntu .subiquity/etc/shadow ; then + echo "user definition not included in etc/shadow" + exit 1 + fi + if ! grep -q sudo .subiquity/etc/group ; then + echo "expected group sudo not included in etc/group" + exit 1 + fi + if ! (grep sudo .subiquity/etc/group | grep -q ubuntu) ; then + echo "user not assigned with the expected group sudo" + exit 1 + fi + fi else echo "W: Unknown validation mode: ${mode}" fi @@ -62,6 +89,9 @@ clean () { rm -f .subiquity/subiquity-*.log rm -f "$testschema" rm -rf .subiquity/run/ + rm -rf .subiquity/home/ + rm -rf .subiquity/etc/.pwd.lock + rm -rf .subiquity/etc/{passwd*,shadow*,group*,gshadow*,subgid*,subuid*} rm -rf .subiquity/etc/*.conf rm -rf .subiquity/etc/cloud/cloud.cfg.d/99-installer.cfg rm -rf .subiquity/var/crash diff --git a/system_setup/server/controllers/configure.py b/system_setup/server/controllers/configure.py index edca8245..e282b0f6 100644 --- a/system_setup/server/controllers/configure.py +++ b/system_setup/server/controllers/configure.py @@ -12,7 +12,8 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . - +import os +import shutil import logging from subiquity.common.errorreport import ErrorReportKind @@ -73,32 +74,58 @@ class ConfigureController(SubiquityController): if variant == "wsl_setup": wsl_id = self.model.identity.user username = wsl_id.username + create_user_base = [] + assign_grp_base = [] + usergroups_list = get_users_and_groups() if dryrun: - log.debug("mimicking creating user %s", - wsl_id.username) - else: - create_user_act = \ - run_command(["/usr/sbin/useradd", "-m", "-s", - "/bin/bash", "-p", - wsl_id.password, - wsl_id.username]) - if create_user_act.returncode != 0: - raise Exception("Failed to create user %s: %s" - % (wsl_id.username, - create_user_act.stderr)) - log.debug("created user %s", wsl_id.username) + log.debug("creating a mock-up env for user %s", username) + # creating folders and files for dryrun + etc_dir = os.path.join(root_dir, "etc") + os.makedirs(etc_dir, exist_ok=True) + home_dir = os.path.join(root_dir, "home") + os.makedirs(home_dir, exist_ok=True) + pseudo_files = ["passwd", "shadow", "gshadow", "group", + "subgid", "subuid"] + for file in pseudo_files: + filepath = os.path.join(etc_dir, file) + open(filepath, "a").close() + # mimic groupadd + group_id = 1000 + for group in usergroups_list: + group_filepath = os.path.join(etc_dir, "group") + gshadow_filepath = os.path.join(etc_dir, "gshadow") + shutil.copy(group_filepath, + "{}-".format(group_filepath)) + with open(group_filepath, "a") as group_file: + group_file.write("{}:x:{}:\n". + format(group, group_id)) + group_id += 1 + shutil.copy(gshadow_filepath, + "{}-".format(gshadow_filepath)) + with open(gshadow_filepath, "a") as gshadow_file: + gshadow_file.write("{}:!::\n".format(group)) - oneline_usergroups = ",".join(get_users_and_groups()) - assign_grp_act = \ - run_command(["/usr/sbin/usermod", "-a", - "-c", wsl_id.realname, - "-G", oneline_usergroups, - wsl_id.username]) - if assign_grp_act.returncode != 0: - raise Exception(("Failed to assign group" - " to user %s: %s") - % (wsl_id.username, - assign_grp_act.stderr)) + create_user_base = ["-R", root_dir] + assign_grp_base = ["-P", root_dir] + + create_user_cmd = ["useradd"] + create_user_base + \ + ["-m", "-s", "/bin/bash", + "-c", wsl_id.realname, + "-p", wsl_id.password, username] + assign_grp_cmd = ["usermod"] + assign_grp_base + \ + ["-a", "-G", ",".join(usergroups_list), + username] + + create_user_proc = run_command(create_user_cmd) + if create_user_proc.returncode != 0: + raise Exception("Failed to create user %s: %s" + % (username, create_user_proc.stderr)) + log.debug("created user %s", username) + + assign_grp_proc = run_command(assign_grp_cmd) + if assign_grp_proc.returncode != 0: + raise Exception(("Failed to assign group to user %s: %s") + % (username, assign_grp_proc.stderr)) else: wsl_config_update(self.model.wslconfadvanced.wslconfadvanced, root_dir)