98 lines
2.6 KiB
Bash
Executable File
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"
|