86 lines
2.2 KiB
Bash
86 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
VERIFY_DIR="${1:-$(mktemp -d /tmp/gaokao-backup-verify-XXXXXX)}"
|
|
ADMIN_DB="${GAOKAO_DB_PATH:-${ROOT_DIR}/data/orders/admin.db}"
|
|
ORDERS_DB="${GAOKAO_ORDERS_DB_PATH:-${ROOT_DIR}/data/orders.db}"
|
|
SHARE_DB="${GAOKAO_SHARE_DB_PATH:-${ROOT_DIR}/data/share/short_links.db}"
|
|
SHARE_REPORT_DIR="${GAOKAO_SHARE_REPORT_DIR:-${ROOT_DIR}/data/share/reports}"
|
|
EXAMPLE_REPORT_DIR="${ROOT_DIR}/data/examples"
|
|
|
|
log() {
|
|
printf '[backup-verify] %s\n' "$1"
|
|
}
|
|
|
|
copy_if_exists() {
|
|
local src="$1"
|
|
local dest_dir="$2"
|
|
if [[ -f "$src" ]]; then
|
|
mkdir -p "$dest_dir"
|
|
cp "$src" "$dest_dir/"
|
|
log "copied file: $src"
|
|
else
|
|
log "skip missing file: $src"
|
|
fi
|
|
}
|
|
|
|
copy_dir_if_exists() {
|
|
local src="$1"
|
|
local dest_dir="$2"
|
|
if [[ -d "$src" ]]; then
|
|
mkdir -p "$dest_dir"
|
|
cp -R "$src" "$dest_dir/"
|
|
log "copied directory: $src"
|
|
else
|
|
log "skip missing directory: $src"
|
|
fi
|
|
}
|
|
|
|
verify_sqlite_file() {
|
|
local db_path="$1"
|
|
if [[ ! -f "$db_path" ]]; then
|
|
return 0
|
|
fi
|
|
python3 - <<'PY' "$db_path"
|
|
import sqlite3
|
|
import sys
|
|
from pathlib import Path
|
|
p = Path(sys.argv[1])
|
|
conn = sqlite3.connect(p)
|
|
try:
|
|
cur = conn.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
|
|
tables = [row[0] for row in cur.fetchall()]
|
|
print(f"sqlite_ok path={p} tables={','.join(tables) if tables else 'none'}")
|
|
finally:
|
|
conn.close()
|
|
PY
|
|
}
|
|
|
|
main() {
|
|
mkdir -p "$VERIFY_DIR"
|
|
log "verify dir: $VERIFY_DIR"
|
|
|
|
copy_if_exists "$ADMIN_DB" "$VERIFY_DIR/db"
|
|
copy_if_exists "$ORDERS_DB" "$VERIFY_DIR/db"
|
|
copy_if_exists "$SHARE_DB" "$VERIFY_DIR/db"
|
|
copy_dir_if_exists "$SHARE_REPORT_DIR" "$VERIFY_DIR/files"
|
|
copy_dir_if_exists "$EXAMPLE_REPORT_DIR" "$VERIFY_DIR/files"
|
|
|
|
log "verifying copied sqlite files"
|
|
if [[ -d "$VERIFY_DIR/db" ]]; then
|
|
while IFS= read -r -d '' db_file; do
|
|
verify_sqlite_file "$db_file"
|
|
done < <(find "$VERIFY_DIR/db" -type f -name '*.db' -print0 | sort -z)
|
|
fi
|
|
|
|
log "verifying copied report artifacts"
|
|
if [[ -d "$VERIFY_DIR/files" ]]; then
|
|
find "$VERIFY_DIR/files" -type f | sort | sed 's#^#[backup-verify] artifact: #'
|
|
fi
|
|
|
|
log "backup verification finished"
|
|
}
|
|
|
|
main "$@"
|