feat: add archive listing and resolution to restore.sh
This commit is contained in:
+13
@@ -52,6 +52,19 @@ run_cmd() {
|
|||||||
"$@"
|
"$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resolve_archive() {
|
||||||
|
if [[ -n "$ARCHIVE_OVERRIDE" ]]; then
|
||||||
|
RESOLVED_ARCHIVE="$ARCHIVE_OVERRIDE"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
RESOLVED_ARCHIVE="$(borg list --short --lock-wait 60 2>/dev/null | tail -n1)"
|
||||||
|
[[ -n "$RESOLVED_ARCHIVE" ]] || die "no archives found in repo $REPO"
|
||||||
|
}
|
||||||
|
|
||||||
|
list_archives() {
|
||||||
|
borg list --lock-wait 60
|
||||||
|
}
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
Usage:
|
Usage:
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Builds fake borg/docker/mysql/mariadb executables into $1 so restore.sh
|
||||||
|
# can be exercised without real infrastructure. Each mock logs its
|
||||||
|
# invocation to $1/mock.log.
|
||||||
|
|
||||||
|
setup_mock_bin() {
|
||||||
|
local dir="$1"
|
||||||
|
mkdir -p "$dir"
|
||||||
|
local mocklog="$dir/mock.log"
|
||||||
|
: > "$mocklog"
|
||||||
|
|
||||||
|
cat > "$dir/borg" <<EOF
|
||||||
|
#!/bin/bash
|
||||||
|
echo "borg \$*" >> "$mocklog"
|
||||||
|
case "\$1" in
|
||||||
|
list)
|
||||||
|
echo "host-2026-01-01T00-00-00"
|
||||||
|
echo "host-2026-06-01T00-00-00"
|
||||||
|
;;
|
||||||
|
extract)
|
||||||
|
shift
|
||||||
|
paths=()
|
||||||
|
for a in "\$@"; do
|
||||||
|
case "\$a" in
|
||||||
|
-*) ;;
|
||||||
|
*::*) ;;
|
||||||
|
*) paths+=("\$a") ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
for p in "\${paths[@]}"; do
|
||||||
|
if [[ "\$p" == *.* ]]; then
|
||||||
|
mkdir -p "\$(dirname "\$p")"
|
||||||
|
printf 'mock-content\n' > "\$p"
|
||||||
|
else
|
||||||
|
mkdir -p "\$p"
|
||||||
|
touch "\$p/RESTORED_MARKER"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*) ;;
|
||||||
|
esac
|
||||||
|
exit 0
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$dir/docker" <<EOF
|
||||||
|
#!/bin/bash
|
||||||
|
echo "docker \$*" >> "$mocklog"
|
||||||
|
case "\$1" in
|
||||||
|
inspect)
|
||||||
|
if [[ "\$*" == *"State.Running"* ]]; then
|
||||||
|
echo true
|
||||||
|
else
|
||||||
|
echo healthy
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
start|stop)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
exec)
|
||||||
|
case "\$*" in
|
||||||
|
*"command -v mariadb"*) exit 0 ;;
|
||||||
|
*) cat >/dev/null 2>&1 || true; exit 0 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*) ;;
|
||||||
|
esac
|
||||||
|
exit 0
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$dir/mysql" <<EOF
|
||||||
|
#!/bin/bash
|
||||||
|
echo "mysql \$*" >> "$mocklog"
|
||||||
|
cat >/dev/null 2>&1 || true
|
||||||
|
exit 0
|
||||||
|
EOF
|
||||||
|
cp "$dir/mysql" "$dir/mariadb"
|
||||||
|
|
||||||
|
chmod +x "$dir/borg" "$dir/docker" "$dir/mysql" "$dir/mariadb"
|
||||||
|
}
|
||||||
@@ -47,9 +47,22 @@ test_unknown_command_exits_one() {
|
|||||||
assert_eq "1" "$rc" "unknown command exits 1"
|
assert_eq "1" "$rc" "unknown command exits 1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
source "$HERE/lib/setup_mocks.sh"
|
||||||
|
|
||||||
|
test_list_archives() {
|
||||||
|
local mockdir out
|
||||||
|
mockdir="$(mktemp -d)"
|
||||||
|
setup_mock_bin "$mockdir"
|
||||||
|
out="$(PATH="$mockdir:$PATH" bash "$RESTORE" --list-archives)"
|
||||||
|
assert_contains "$out" "host-2026-01-01T00-00-00" "list-archives shows first archive"
|
||||||
|
assert_contains "$out" "host-2026-06-01T00-00-00" "list-archives shows latest archive"
|
||||||
|
rm -rf "$mockdir"
|
||||||
|
}
|
||||||
|
|
||||||
test_help_exits_zero
|
test_help_exits_zero
|
||||||
test_no_args_exits_one
|
test_no_args_exits_one
|
||||||
test_unknown_command_exits_one
|
test_unknown_command_exits_one
|
||||||
|
test_list_archives
|
||||||
|
|
||||||
echo "-----"
|
echo "-----"
|
||||||
if [[ "$FAILURES" -gt 0 ]]; then
|
if [[ "$FAILURES" -gt 0 ]]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user