netgescon-day0/docker/daemon-update-runner.sh

74 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
DOCKER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$DOCKER_DIR/.." && pwd)"
ENV_FILE="${ENV_FILE:-$DOCKER_DIR/.env.multisite}"
REQUEST_CONTAINER="${REQUEST_CONTAINER:-netgescon_prod_app}"
REQUEST_DIR="/var/www/storage/app/support/update-requests"
JOBS_DIR="/var/www/storage/app/support/update-jobs"
LOCK_FILE="${LOCK_FILE:-/tmp/netgescon-daemon-update-runner.lock}"
if [[ ! -f "$ENV_FILE" ]]; then
echo "Env mancante: $ENV_FILE"
exit 1
fi
exec 9>"$LOCK_FILE"
if ! flock -n 9; then
echo "Runner gia attivo: esco senza duplicare il job."
exit 0
fi
request_path="$(docker exec "$REQUEST_CONTAINER" sh -lc "ls -1 ${REQUEST_DIR}/*.json 2>/dev/null | sort | head -n 1")"
if [[ -z "$request_path" ]]; then
echo "Nessuna richiesta update in coda."
exit 0
fi
request_payload="$(docker exec "$REQUEST_CONTAINER" sh -lc "cat '$request_path'")"
job_id="$(php -r '$data=json_decode(stream_get_contents(STDIN), true); echo is_array($data) ? ($data["job_id"] ?? "") : "";' <<< "$request_payload")"
if [[ -z "$job_id" ]]; then
echo "Richiesta non valida: job_id mancante."
docker exec "$REQUEST_CONTAINER" rm -f "$request_path" >/dev/null 2>&1 || true
exit 1
fi
progress_tmp="$(mktemp)"
log_tmp="$(mktemp)"
cleanup() {
rm -f "$progress_tmp" "$log_tmp"
}
trap cleanup EXIT
write_progress() {
local percent="$1"
local message="$2"
local status="$3"
local exit_code="${4:-null}"
cat > "$progress_tmp" <<EOF
{"timestamp":"$(date -Iseconds)","percent":$percent,"message":"$message","status":"$status","exit_code":$exit_code}
EOF
docker cp "$progress_tmp" "$REQUEST_CONTAINER":"$JOBS_DIR/$job_id.progress.json" >/dev/null
}
write_log() {
docker cp "$log_tmp" "$REQUEST_CONTAINER":"$JOBS_DIR/$job_id.log" >/dev/null
}
write_progress 10 "Richiesta acquisita dal daemon host" "running"
if ENV_FILE="$ENV_FILE" "$DOCKER_DIR/update-multisite.sh" >"$log_tmp" 2>&1; then
write_log
write_progress 100 "Aggiornamento multisito completato dal daemon host" "completed" 0
else
write_log
write_progress 100 "Aggiornamento multisito fallito sul daemon host" "failed" 1
fi
docker exec "$REQUEST_CONTAINER" rm -f "$request_path" >/dev/null 2>&1 || true
cat "$log_tmp"