diff --git a/lib/tiny-cloud/user-data/alpine-config b/lib/tiny-cloud/user-data/alpine-config index 5a868e3..9af8c2d 100644 --- a/lib/tiny-cloud/user-data/alpine-config +++ b/lib/tiny-cloud/user-data/alpine-config @@ -4,7 +4,7 @@ INIT_ACTIONS_MAIN="$(insert_before create_default_user userdata_user $INIT_ACTIONS_MAIN)" INIT_ACTIONS_MAIN="$(insert_after set_hostname \ - "userdata_bootcmd userdata_groups userdata_write_files userdata_ntp userdata_apk_cache userdata_apk_repositories userdata_package_update userdata_package_upgrade userdata_packages" \ + "userdata_bootcmd userdata_groups userdata_users userdata_write_files userdata_ntp userdata_apk_cache userdata_apk_repositories userdata_package_update userdata_package_upgrade userdata_packages" \ $INIT_ACTIONS_MAIN)" INIT_ACTIONS_MAIN="$(insert_after set_ssh_keys ssh_authorized_keys $INIT_ACTIONS_MAIN)" INIT_ACTIONS_FINAL="$INIT_ACTIONS_FINAL userdata_runcmd userdata_autoinstall" @@ -248,6 +248,47 @@ init__userdata_groups() { done } +in_list() { + local i needle="$1" + shift + for i in "$@"; do + if [ "$i" = "$needle" ]; then + return 0 + fi + done + return 1 +} + +init__userdata_users() { + local users="$(get_userdata users)" + local name gecos homedir shell + for i in $users; do + local keys="$(get_userdata users/$i)" + if [ "$i" = 1 ] && [ "$keys" = "default" ]; then + continue + fi + if in_list name $keys; then + name="$(get_userdata users/$i/name)" + else + continue + fi + if in_list gecos $keys; then + gecos="$(get_userdata users/$i/gecos)" + fi + if in_list homedir $keys; then + homedir="$(get_userdata users/$i/homedir)" + fi + if in_list shell $keys; then + shell="$(get_userdata users/$i/shell)" + fi + if getent passwd "$user" >/dev/null; then + log -i -t "$phase" info "$ACTION: user $user already exists" + else + $MOCK adduser -D ${gecos:+-g "$gecos"} ${homedir:+-h "$homedir"} ${shell:+-s "$shell"} "$name" + fi + done +} + find_biggest_empty_disk() { local d for d in "$ROOT"/sys/class/block/*/device; do diff --git a/tests/tiny-cloud-alpine.test b/tests/tiny-cloud-alpine.test index 6169f80..761ec39 100755 --- a/tests/tiny-cloud-alpine.test +++ b/tests/tiny-cloud-alpine.test @@ -16,6 +16,12 @@ init_tests \ userdata_user_missing_name \ userdata_create_default_user \ userdata_no_default_user \ + userdata_users_default_user \ + userdata_users_default_name_only \ + userdata_users_name_only \ + userdata_users_gecos \ + userdata_users_homedir \ + userdata_users_shell \ userdata_ssh_authorized_keys \ userdata_groups \ userdata_bootcmd \ @@ -149,6 +155,95 @@ userdata_no_default_user_body() { tiny-cloud main } +userdata_users_default_user_body() { + fake_userdata_nocloud <<-EOF + #alpine-config + users: + - default + EOF + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"create_default_user: done" \ + -o match:"adduser.*alpine" \ + tiny-cloud main +} + +userdata_users_default_name_only_body() { + # first specified user will replace default user + fake_userdata_nocloud <<-EOF + #alpine-config + users: + - name: foo + EOF + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"userdata_users: done" \ + -o match:"adduser.*foo" \ + tiny-cloud main +} + +userdata_users_name_only_body() { + fake_userdata_nocloud <<-EOF + #alpine-config + users: + - default + - name: foo + EOF + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"userdata_users: done" \ + -o match:"adduser.*foo" \ + tiny-cloud main +} + +userdata_users_gecos_body() { + # first specified user will replace default user + fake_userdata_nocloud <<-EOF + #alpine-config + users: + - default + - name: foo + gecos: Joe User + EOF + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"userdata_users: done" \ + -o match:"adduser.*-g Joe User.*foo" \ + tiny-cloud main +} + +userdata_users_homedir_body() { + # first specified user will replace default user + fake_userdata_nocloud <<-EOF + #alpine-config + users: + - default + - name: foo + homedir: /foo + EOF + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"userdata_users: done" \ + -o match:"adduser.*-h /foo.*foo" \ + tiny-cloud main +} + +userdata_users_shell_body() { + # first specified user will replace default user + fake_userdata_nocloud <<-EOF + #alpine-config + users: + - default + - name: foo + shell: /bin/zsh + EOF + atf_check -e ignore -o ignore tiny-cloud early + atf_check \ + -e match:"userdata_users: done" \ + -o match:"adduser.*-s /bin/zsh.*foo" \ + tiny-cloud main +} + userdata_ssh_authorized_keys_body() { fake_bin getent <<-EOF #!/bin/sh