You've already forked fruix-bootstrap
143 lines
4.2 KiB
Bash
Executable File
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"
|