#!/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