X-Git-Url: http://rtime.felk.cvut.cz/gitweb/novaboot.git/blobdiff_plain/d9e9425367a2609ff9d9ce1f88a2892467197fa3..9406e2953a096f654bdfcfb22046432e8fc2bfe9:/tests/server.wv diff --git a/tests/server.wv b/tests/server.wv index ed97c22..fe6c60f 100755 --- a/tests/server.wv +++ b/tests/server.wv @@ -1,65 +1,281 @@ -#!/bin/bash +#!/usr/bin/env bash cd $(dirname $0) . wvtest.sh -set -e - +NBT_HOME=$(getent passwd novaboot-test|cut -d: -f6) export WV_BASE_DIR -export NOVABOOT_SERVER_CONFIG="$WV_BASE_DIR/.novaboot-server" -cat < "$NOVABOOT_SERVER_CONFIG" -target_console="/bin/sh -c 'while :; do sleep 0.1; date; done'" -target_reset="touch reset" +export NOVABOOT_SHELL_CONFIG="$WV_BASE_DIR/.novaboot-shell" +cat < $NOVABOOT_SHELL_CONFIG +console_cmd="echo 'Hello console'; while :; do sleep 0.1; date; done" +reset_cmd="touch reset_done" +target_config='--prefix=asdf' EOF -export MAIN_PID=$$ - +# Run server synchronously function run_server() { - SSH_ORIGINAL_COMMAND="$*" SSH_CONNECTION="127.0.0.1 1234 127.0.0.1 22" $exec $WV_BASE_DIR/../server/novaboot-server -c user test + SSH_ORIGINAL_COMMAND="$*" SSH_CONNECTION="127.0.0.1 1234 127.0.0.1 22" $exec $WV_BASE_DIR/../server/novaboot-shell -c "${account:-user} ${username:-test} ${admin:+admin}" } +# Exec server (for use with coproc - then the server can be easily killed) function exec_server() { local exec exec=exec run_server "$@" } -trap 'kill "$COPROC_PID"' EXIT - WVSTART Help subcommand -run_server help > log +WVPASS run_server help | WVPASS tee log WVPASS grep 'Target commands:' log +WVFAIL grep 'add-key' log + +WVSTART Get-config command works +run_server get-config > log +WVPASS grep -e '^--prefix=asdf$' log -WVSTART Help is printed without any arguments -run_server > log +WVSTART "Multi-word commands work when user not specified" +WVPASS $WV_BASE_DIR/../server/novaboot-shell -c "help xxx" | WVPASS tee log WVPASS grep 'Target commands:' log WVSTART "Console prints a 'connected' message" coproc exec_server console -sed -e '/novaboot-server: Connected/q0' <&${COPROC[0]} -WVPASSRC +WVPASS sed -e '/novaboot-shell: Connected/q0' -e '3q1' <&${COPROC[0]} kill $COPROC_PID; wait -WVSTART 'Second connection to console prints queue' -coproc exec_server console -sed -e '/novaboot-server: Connected/q0' <&${COPROC[0]} -WVPASSRC -run_server console | sed -e '/Target is occupied by:/q0' +WVSTART "Without any argument console_cmd is executed if no default_cmd is configured" +coproc exec_server +WVPASS sed -e '/Hello console/q0' -e '3q1' <&${COPROC[0]} kill $COPROC_PID; wait +WVSTART "Without any argument default_cmd is executed if configured" +( + export NOVABOOT_SHELL_CONFIG="./.novaboot-shell" + cat < $NOVABOOT_SHELL_CONFIG +default_cmd='echo "Hello default"' +console_cmd='echo "Hello console"' +EOF + WVPASS run_server | WVPASS grep -F 'Hello default' + + WVPASS run_server console | WVPASS grep -F 'Hello console' +) + +WVSTART "default_cmd can be set to run_novaboot" +( + export NOVABOOT_SHELL_CONFIG="./.novaboot-shell" + cat < default_nb_script +run echo "Hello default_nb_script" +EOF + cat <<'EOF' > $NOVABOOT_SHELL_CONFIG +default_cmd='run_novaboot default_nb_script --scriptmod=s/default_nb_script/default_nb_script_mod/' +console_cmd='while sleep 0.01; do echo "Hello console"; done' +reset_cmd='echo "Hello reset"' +target_config="\ +--name=some name with spaces and hash # +--exiton=Hello console +" +EOF + WVPASS run_server | ( + stdout=$(cat) + WVPASS grep -F 'Hello default_nb_script' <<<"$stdout" + WVPASS grep -F 'Hello default_nb_script_mod' <<<"$stdout" + WVPASS grep -F 'Hello console' <<<"$stdout" + ) +) + +WVSTART 'Second connection to console prints queue' +coproc console1 { exec_server console; } +WVPASS sed -e '/novaboot-shell: Connected/q0' -e '3q1' <&${console1[0]} +coproc console2 { exec_server console; } +WVPASS sed -e '/Target is occupied by:/q0' <&${console2[0]} +kill $console1_PID $console2_PID; wait + +WVSTART 'Printed queue contains correct username' +coproc console1 { username=my_cool_username exec_server console; } +WVPASS sed -e '/novaboot-shell: Connected/q0' -e '3q1' <&${console1[0]} +coproc console2 { username=another_username exec_server console; } +WVPASS sed -e '/my_cool_username/q0' -e '3q1' <&${console2[0]} +kill $console1_PID $console2_PID; wait + +WVSTART Admin sees help for admin subcommands +admin=1 run_server help > log +WVPASS grep 'add-key' log + +WVSTART Only admin can run shell +WVFAIL run_server shell +admin=1 WVPASS run_server shell < /dev/null + WVSTART 'Cannot reset when somebody else is connected to console' -coproc exec_server console -sed -e '/novaboot-server: Connected/q0' <&${COPROC[0]} -run_server reset | sed -e '/Target is occupied by:/q0' -WVPASSRC -WVFAIL test -e reset -kill $COPROC_PID; wait +coproc console1 { exec_server console; } +WVPASS sed -e '/novaboot-shell: Connected/q0' -e '3q1' <&${console1[0]} +coproc console2 { run_server reset; } +WVPASS sed -e '/Target is occupied by:/q0' <&${console2[0]} +WVPASS test ! -e reset_done +WVPASS kill $console1_PID $console2_PID; wait WVSTART "Can reset when I'm connected to console" coproc exec_server console -sed -e '/novaboot-server: Connected/q0' <&${COPROC[0]} -run_server reset -WVPASS test -e reset -kill $COPROC_PID +WVPASS sed -e '/novaboot-shell: Connected/q0' <&${COPROC[0]} +WVPASS run_server reset +WVPASS test -e reset_done +WVPASS kill $COPROC_PID + +WVSTART "Quoting of config variables" +( + export NOVABOOT_SHELL_CONFIG="./.novaboot-shell" + + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'reset_cmd="touch file1 file2"' + WVPASS run_server reset + WVPASS test -e file1 -a -e file2 + + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'reset_cmd="touch \"file1 file2\""' + WVPASS run_server reset + WVPASS test -e "file1 file2" + + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'reset_cmd="touch \"file1 file2\""' + WVPASS run_server reset + WVPASS test -e "file1 file2" + + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'reset_cmd="touch \"\\\"file1 file2\\\"\""' + WVPASS run_server reset + WVPASS test -e '"file1 file2"' +) + +WVSTART "Config variables can depend on user name" +( + export NOVABOOT_SHELL_CONFIG="./.novaboot-shell" + + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'console_cmd="echo Hello $NB_USER"' + username=asdf WVPASS run_server console | tee /dev/stderr | WVPASS grep -F "Hello asdf" + username=qwer WVPASS run_server console | tee /dev/stderr | WVPASS grep -F "Hello qwer" +) + +WVSTART "Missing console_cmd results in failure" +NOVABOOT_SHELL_CONFIG="/dev/null" WVFAIL run_server console + +WVSTART "console_cmd may contain a shell function name" +( + export NOVABOOT_SHELL_CONFIG="./.novaboot-shell" + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'console_cmd () { echo Hello user; } +console_cmd=console_cmd' + WVPASS run_server console | tee /dev/stderr | WVPASS grep -F "Hello user" +) + +WVSTART "reset_cmd may contain a shell function name" +( + export NOVABOOT_SHELL_CONFIG="./.novaboot-shell" + WVPASS tee "$NOVABOOT_SHELL_CONFIG" <<<'reset_cmd () { echo Hello user; } +reset_cmd=reset_cmd' + WVPASS run_server reset | tee /dev/stderr | WVPASS grep -F "Hello user" +) + +if [ -n "$DEB_HOST_ARCH" ]; then + echo >&2 "Skipping server tests in Debian package build, because these cannot pass." + exit 0 +fi + +SHELLRC="$NBT_HOME/.novaboot-shell" +TFTPROOT="$NBT_HOME/tftproot" +AUTH="$NBT_HOME/.ssh/authorized_keys" +sudo_() { sudo -u novaboot-test "$@"; } + +WVSTART "Create and check ssh keys needed for following tests" +# Start our custom ssh-agent to not mess up with the user's agent +eval "$(ssh-agent)" +trap 'ssh-agent -k' EXIT +WVPASS test -n "$SSH_AUTH_SOCK" || exit 1 +if [ ! -f id_rsa ]; then + ssh-keygen -t rsa -C "generated by $0" -N '' -f ./id_rsa +fi +ID_RSA=$(realpath ./id_rsa) +WVPASS ssh-add ./id_rsa + +WVSTART "Setup SSH server's admin key" +WVPASS sudo_ mkdir -p $(dirname "$AUTH") +WVPASS sudo_ chmod 700 $(dirname "$AUTH") +WVPASS sudo_ tee "$AUTH" <<<"command=\"user test admin\" $(cat "$ID_RSA".pub)" +exit + +WVSTART "Novaboot --ssh option (connect, rsync, reset)" +WVPASS sudo_ rm -rf "$TFTPROOT" +TS=$(date --rfc-3339=ns) +WVPASS sudo_ tee "$SHELLRC" < file +WVPASS novaboot --ssh novaboot-test@localhost < file +WVPASS novaboot --ssh novaboot-test@localhost <&1 >/dev/null) +echo "$stderr" | WVPASS grep -q -F 'Unknown option: make' +echo "$stderr" | WVPASS grep -q -F 'Error processing configuration from the server' + +WVSTART "Novaboot --ssh remote config fails on unknown arguments" +WVPASS sudo_ tee "$SHELLRC" <&1 >/dev/null |\ + WVPASS grep -F "Unsuported configuration received from the server: blablabla" + +WVSTART "add-key subcommand" +WVPASS ssh-keygen -t ed25519 -N '' -f key +WVFAIL sudo_ grep new_user "$AUTH" +WVPASS ssh novaboot-test@localhost add-key new_user < key.pub +WVPASS sudo_ grep -F "user new_user" "$AUTH" + +WVSTART "add-key user must not contain spaces" +WVPASS sudo_ cat "$AUTH" > auth +WVFAIL ssh novaboot-test@localhost add-key "new user" < /dev/null +WVPASS diff -u <(sudo_ cat "$AUTH") auth + +WVSTART "add-key requires username" +WVPASS sudo_ cat "$AUTH" > auth +WVFAIL ssh novaboot-test@localhost add-key < /dev/null +WVPASS diff -u <(sudo_ cat "$AUTH") auth + +WVSTART "Suggest using ssh -t for shell" +WVPASS ssh novaboot-test@localhost shell < /dev/null | WVPASS grep -e 'ssh -t' +echo exit|WVPASS ssh -tt novaboot-test@localhost shell | WVFAIL grep -e 'ssh -t' + + -trap - EXIT +# Hi-lock: (("^.*\\(?:WVSTART\\).*$" (0 (quote hi-black-b) t)))