Files
fruix-bootstrap/tests/bootstrap/run-prepare-builder-fresh-user.sh

143 lines
4.2 KiB
Bash
Executable File

#!/bin/sh
set -eu
script_dir=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
bootstrap_src=$(CDPATH= cd -- "$script_dir/../.." && pwd)
fruix_src=${FRUIX_SRC:-$bootstrap_src/../fruix}
test_user=${TEST_USER:-fruixbuilder}
test_home=${TEST_HOME:-/home/$test_user}
builder_root=${FRUIX_BUILDER_ROOT:-$test_home/.local/opt/fruix-builder}
store_dir=${STORE_DIR:-$test_home/frx/store}
install_target_device=${INSTALL_TARGET_DEVICE:-/dev/vtbd0}
root_size=${ROOT_SIZE:-6g}
keep_user=${KEEP_USER:-0}
[ -d "$fruix_src" ] || {
echo "Canonical fruix checkout not found: $fruix_src" >&2
exit 1
}
command -v sudo >/dev/null 2>&1 || {
echo "sudo is required" >&2
exit 1
}
cleanup=0
if [ -n "${WORKDIR:-}" ]; then
workdir=$WORKDIR
sudo mkdir -p "$workdir"
else
workdir=$(mktemp -d /tmp/fruix-bootstrap-fresh-user.XXXXXX)
cleanup=1
fi
if [ "${KEEP_WORKDIR:-0}" -eq 1 ]; then
cleanup=0
fi
sudoers_dir=/usr/local/etc/sudoers.d
sudoers_file=$sudoers_dir/fruix-bootstrap-$test_user
prepare_log=$workdir/prepare-builder.log
help_log=$workdir/fruix-help.txt
installer_log=$workdir/installer-iso.txt
metadata_file=$workdir/fresh-user-metadata.txt
cleanup_all() {
if [ "$keep_user" -ne 1 ]; then
sudo rm -f "$sudoers_file" >/dev/null 2>&1 || true
if id "$test_user" >/dev/null 2>&1; then
sudo pkill -u "$test_user" >/dev/null 2>&1 || true
sudo pw userdel "$test_user" -r >/dev/null 2>&1 || true
fi
fi
if [ "$cleanup" -eq 1 ]; then
sudo rm -rf "$workdir"
fi
}
trap cleanup_all EXIT INT TERM
run_as_test_user() {
sudo -H -u "$test_user" env HOME="$test_home" "$@"
}
copy_tree() {
src=$1
dst=$2
sudo rm -rf "$dst"
sudo mkdir -p "$dst"
(cd "$src" && tar -cf - .) | sudo tar -C "$dst" -xf -
sudo chown -R "$test_user":"$test_user" "$dst"
}
if id "$test_user" >/dev/null 2>&1; then
sudo pkill -u "$test_user" >/dev/null 2>&1 || true
sudo pw userdel "$test_user" -r >/dev/null 2>&1 || true
fi
sudo pw useradd "$test_user" -m -s /bin/sh -G wheel
sudo mkdir -p "$sudoers_dir"
printf '%s ALL=(ALL) NOPASSWD: ALL\n' "$test_user" | sudo tee "$sudoers_file" >/dev/null
sudo chmod 440 "$sudoers_file"
sudo chown -R "$test_user":"$test_user" "$workdir"
copy_tree "$bootstrap_src" "$test_home/fruix-bootstrap"
copy_tree "$fruix_src" "$test_home/fruix"
run_as_test_user mkdir -p "$store_dir"
run_as_test_user sh -lc "cd '$test_home/fruix-bootstrap' && ./bootstrap/prepare-builder --builder-root '$builder_root' >'$prepare_log' 2>&1"
run_as_test_user sh -lc "cd '$test_home/fruix-bootstrap' && ./bin/fruix --help >'$help_log' 2>&1"
run_as_test_user sh -lc "cd '$test_home/fruix-bootstrap' && sudo env HOME='$test_home' FRUIX_BUILDER_ROOT='$builder_root' FRUIX_FREEBSD_BUILD_JOBS='${FRUIX_FREEBSD_BUILD_JOBS:-8}' ./bin/fruix system installer-iso tests/system/phase7-minimal-operating-system.scm --system phase7-operating-system --store '$store_dir' --root-size '$root_size' --install-target-device '$install_target_device' >'$installer_log' 2>&1"
field() {
sed -n "s/^$1=//p" "$installer_log" | tail -n 1
}
iso_store_path=$(field iso_store_path)
iso_image=$(field iso_image)
installer_closure_path=$(field installer_closure_path)
target_closure_path=$(field target_closure_path)
store_dir_out=$(field store_dir)
[ -d "$iso_store_path" ] || {
echo "missing iso_store_path: $iso_store_path" >&2
exit 1
}
[ -f "$iso_image" ] || {
echo "missing iso_image: $iso_image" >&2
exit 1
}
[ -n "$installer_closure_path" ] || {
echo "missing installer_closure_path" >&2
exit 1
}
[ -n "$target_closure_path" ] || {
echo "missing target_closure_path" >&2
exit 1
}
[ "$store_dir_out" = "$store_dir" ] || {
echo "unexpected store_dir in output: $store_dir_out" >&2
exit 1
}
sudo chown -R "$(id -un)":"$(id -gn)" "$workdir"
cat >"$metadata_file" <<EOF
workdir=$workdir
test_user=$test_user
test_home=$test_home
builder_root=$builder_root
bootstrap_checkout=$test_home/fruix-bootstrap
fruix_checkout=$test_home/fruix
store_dir=$store_dir
prepare_log=$prepare_log
help_log=$help_log
installer_log=$installer_log
iso_store_path=$iso_store_path
iso_image=$iso_image
installer_closure_path=$installer_closure_path
target_closure_path=$target_closure_path
EOF
printf 'PASS prepare-builder-fresh-user\n'
printf 'Metadata file: %s\n' "$metadata_file"
printf '%s\n' '--- metadata ---'
cat "$metadata_file"