#!/bin/bash # Dispatcher for dashboard-scheduled tasks. # Usage: run-task.sh [...params] # say # backup # snapshot-prune set -u TYPE="${1:-}" shift || true LOG="${MC_DASHBOARD_LOG:-/home/minecraft/logs/mc-dashboard/tasks.log}" mkdir -p "$(dirname "$LOG")" 2>/dev/null || true if [ ! -w "$(dirname "$LOG")" ]; then LOG="/tmp/mc-dashboard-tasks.log"; fi log() { echo "[$(date -Iseconds)] $*" >>"$LOG" 2>/dev/null || true } rcon_say() { local msg="$1" RCON_MSG="$msg" node -e ' const { Rcon } = require("/home/minecraft/dashboard/node_modules/rcon-client"); (async () => { try { const rcon = await Rcon.connect({ host: "127.0.0.1", port: 25575, password: "23991818cc169249f181436f2a29a013" }); await rcon.send("say " + process.env.RCON_MSG); rcon.end(); } catch (e) { process.stderr.write(String(e)); process.exit(1); } })(); ' } case "$TYPE" in say) MSG="${*:-}" if [ -z "$MSG" ]; then log "say: empty message"; exit 1; fi MSG="$(printf '%s' "$MSG" | tr -d '\r\n')" rcon_say "$MSG" log "say: $MSG" ;; backup) bash /home/minecraft/dashboard/scripts/backup-world.sh >>"$LOG" 2>&1 log "backup: done ($?)" ;; snapshot-prune) KEEP="${1:-5}" if ! [[ "$KEEP" =~ ^[0-9]+$ ]] || [ "$KEEP" -lt 1 ] || [ "$KEEP" -gt 50 ]; then KEEP=5 fi DIR="/home/minecraft/server/snapshots" if [ -d "$DIR" ]; then ls -1dt "$DIR"/*/ 2>/dev/null | tail -n +$((KEEP + 1)) | while read -r d; do [ -n "$d" ] && rm -rf -- "$d" done fi log "snapshot-prune: kept $KEEP" ;; *) log "unknown task type: $TYPE" exit 1 ;; esac