Import postgresql plugin
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
PLUGIN_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
DATA_DIR="$PLUGIN_DIR/data"
|
||||
JOB_DIR="$DATA_DIR/jobs/pending"
|
||||
PROCESSING_DIR="$DATA_DIR/jobs/processing"
|
||||
DONE_DIR="$DATA_DIR/jobs/done"
|
||||
WORKER_LOCK_DIR="$DATA_DIR/worker.lock"
|
||||
DB_LOCK_DIR="$DATA_DIR/lock"
|
||||
PID_DIR="$DATA_DIR/pids"
|
||||
CANCEL_DIR="$DATA_DIR/cancel"
|
||||
|
||||
mkdir -p "$JOB_DIR" "$PROCESSING_DIR" "$DONE_DIR" "$PID_DIR" "$CANCEL_DIR" "$DB_LOCK_DIR"
|
||||
|
||||
if ! mkdir "$WORKER_LOCK_DIR" 2>/dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
rmdir "$WORKER_LOCK_DIR" 2>/dev/null || true
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
db_lock_path_for_db() {
|
||||
local db_name="$1"
|
||||
local safe
|
||||
safe="$(printf '%s' "$db_name" | tr -c 'A-Za-z0-9_.-' '_')"
|
||||
printf '%s/%s.lock' "$DB_LOCK_DIR" "$safe"
|
||||
}
|
||||
|
||||
release_db_lock_later() {
|
||||
local lock_path="$1"
|
||||
if [ -z "$lock_path" ]; then
|
||||
return 0
|
||||
fi
|
||||
(
|
||||
sleep 60
|
||||
rm -f "$lock_path" 2>/dev/null || true
|
||||
) >/dev/null 2>&1 &
|
||||
}
|
||||
|
||||
while true; do
|
||||
JOB_FILE="$(ls -1 "$JOB_DIR"/*.env 2>/dev/null | head -n 1 || true)"
|
||||
if [ -z "${JOB_FILE:-}" ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
BASE_NAME="$(basename "$JOB_FILE")"
|
||||
RUN_FILE="$PROCESSING_DIR/$BASE_NAME"
|
||||
mv "$JOB_FILE" "$RUN_FILE"
|
||||
JOB_ID="${BASE_NAME%.env}"
|
||||
PID_FILE="$PID_DIR/${JOB_ID}.pid"
|
||||
|
||||
JOB_TYPE="restore"
|
||||
DB_NAME=""
|
||||
DB_LOCK_FILE=""
|
||||
# shellcheck disable=SC1090
|
||||
source "$RUN_FILE" || true
|
||||
JOB_TYPE="${JOB_TYPE:-restore}"
|
||||
DB_NAME="${DB_NAME:-}"
|
||||
DB_LOCK_FILE="${DB_LOCK_FILE:-}"
|
||||
|
||||
LOCK_PATH=""
|
||||
if [ -n "$DB_LOCK_FILE" ]; then
|
||||
case "$DB_LOCK_FILE" in
|
||||
"$DB_LOCK_DIR"/*.lock) LOCK_PATH="$DB_LOCK_FILE" ;;
|
||||
*) LOCK_PATH="" ;;
|
||||
esac
|
||||
fi
|
||||
if [ -z "$LOCK_PATH" ] && [ -n "$DB_NAME" ]; then
|
||||
LOCK_PATH="$(db_lock_path_for_db "$DB_NAME")"
|
||||
fi
|
||||
|
||||
RUNNER="$PLUGIN_DIR/scripts/restore_job.sh"
|
||||
if [ "$JOB_TYPE" = "backup" ]; then
|
||||
RUNNER="$PLUGIN_DIR/scripts/backup_job.sh"
|
||||
fi
|
||||
|
||||
set +e
|
||||
"$RUNNER" "$RUN_FILE" &
|
||||
RUN_PID=$!
|
||||
echo "PID=${RUN_PID}" >> "$RUN_FILE"
|
||||
echo "${RUN_PID}" > "$PID_FILE"
|
||||
wait "$RUN_PID"
|
||||
EXIT_CODE=$?
|
||||
set -e
|
||||
|
||||
rm -f "$PID_FILE"
|
||||
|
||||
CANCEL_FLAG="${CANCEL_DIR}/${JOB_ID}.flag"
|
||||
if [ -f "$CANCEL_FLAG" ]; then
|
||||
rm -f "$CANCEL_FLAG"
|
||||
mv "$RUN_FILE" "$DONE_DIR/${JOB_ID}.cancel"
|
||||
elif [ "$EXIT_CODE" -eq 0 ]; then
|
||||
mv "$RUN_FILE" "$DONE_DIR/${JOB_ID}.ok"
|
||||
else
|
||||
mv "$RUN_FILE" "$DONE_DIR/${JOB_ID}.fail"
|
||||
fi
|
||||
|
||||
release_db_lock_later "$LOCK_PATH"
|
||||
done
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user