Files
apxtri/setup/backup.sh
T
2026-05-11 11:16:47 +02:00

98 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
# Automatic backup script for all tribes.
# Usage: ./backup.sh [prefix]
# prefix : Backup prefix (default: dayname for day of week)
#
# For each tribe in {DATAPATH}/{TOWN}/objects/tribes/itm/*.json,
# reads the backupObjects property and creates a backup archive.
set -euo pipefail
DATE="$(date '+%Y-%m-%d %H:%M:%S')"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="$SCRIPT_DIR/../.env"
if [[ -f "$ENV_FILE" ]]; then
set -a
source "$ENV_FILE"
set +a
else
echo "[ERROR] .env not found!" >&2
exit 1
fi
PREFIX="${1:-dayname}"
if [[ -z "$DATAPATH" || -z "$TOWN" ]]; then
echo "[ERROR] DATAPATH or TOWN not set in .env" >&2
exit 1
fi
if [[ "$PREFIX" == "dayname" ]]; then
PREFIX=$(date +%A)
fi
TRIBES_DIR="${DATAPATH}/${TOWN}/objects/tribes/itm"
BACKUP_BASE="${DATAPATH}/${TOWN}/backup"
LOG_FILE="${DATAPATH}/${TOWN}/logs/backup.log"
mkdir -p "$BACKUP_BASE"
mkdir -p "$(dirname "$LOG_FILE")"
echo "$DATE 📦 Starting backup..." >> "$LOG_FILE"
BACKUP_COUNT=0
SKIP_COUNT=0
for tribe_file in "$TRIBES_DIR"/*.json; do
[[ -f "$tribe_file" ]] || continue
tribe_id=$(basename "$tribe_file" .json)
backup_objects=$(jq -r '.backupObjects // [] | if type == "array" then .[] else empty end' "$tribe_file" 2>/dev/null || true)
if [[ -z "$backup_objects" ]]; then
echo " └─ $tribe_id: No backupObjects defined, skipping" >> "$LOG_FILE"
((SKIP_COUNT++))
continue
fi
objects_dir="${DATAPATH}/${TOWN}/objects"
backup_dir="${BACKUP_BASE}"
archive_name="${PREFIX}.${tribe_id}.objects.tar.gz"
archive_path="${backup_dir}/${archive_name}"
valid_objects=()
for obj in $backup_objects; do
if [[ -d "${objects_dir}/${obj}" ]]; then
valid_objects+=("$obj")
else
echo " └─ Warning: Object '$obj' not found for tribe $tribe_id" >> "$LOG_FILE"
fi
done
if [[ ${#valid_objects[@]} -eq 0 ]]; then
echo " └─ $tribe_id: No valid objects to backup" >> "$LOG_FILE"
((SKIP_COUNT++))
continue
fi
echo " └─ $tribe_id: Backing up ${valid_objects[*]}..." >> "$LOG_FILE"
rm -f "$archive_path"
tar -czf "$archive_path" -C "$objects_dir" "${valid_objects[@]}" 2>/dev/null
if [[ -f "$archive_path" ]]; then
size=$(du -h "$archive_path" | cut -f1)
echo " └─ ✓ Created: $archive_path ($size)" >> "$LOG_FILE"
((BACKUP_COUNT++))
else
echo " └─ ✗ Failed to create backup for $tribe_id" >> "$LOG_FILE"
fi
done
echo "$DATE ✅ Backup complete: $BACKUP_COUNT created, $SKIP_COUNT skipped" >> "$LOG_FILE"
echo "Backup complete: $BACKUP_COUNT created, $SKIP_COUNT skipped"