#!/bin/sh # Nupplo: Update ausführen, wenn die App eines angefordert hat. # # Die App schreibt dafür data/update-requested.json (Knopf unter # Mehr → Version & Updates). Dieses Skript gehört auf den Server und wird # regelmäßig aufgerufen – eine Minute Takt reicht völlig, das Update selbst # dauert ohnehin ein bis drei Minuten. # # Synology (DSM): Systemsteuerung → Aufgabenplaner → Erstellen → # Geplante Aufgabe → Benutzerdefiniertes Skript # Benutzer: root · Zeitplan: täglich, jede 1 Minute wiederholen # Befehl: sh /pfad/zu/nupplo/update-watch.sh # # Linux mit cron: * * * * * sh /pfad/zu/nupplo/update-watch.sh set -e cd "$(dirname "$0")" FLAG="data/update-requested.json" LOG="data/update-watch.log" ALIVE="data/update-watch-alive" # Lebenszeichen bei JEDEM Lauf – daran erkennt die App, dass der Helfer # eingerichtet ist, und bietet den Update-Knopf erst dann an. # Der data-Ordner gehört root (von Docker angelegt), deshalb braucht es root – # für "docker compose" weiter unten ohnehin. mkdir -p data 2>/dev/null || true if ! : 2>/dev/null > "$ALIVE"; then echo "Kann '$(pwd)/$ALIVE' nicht schreiben." >&2 echo "Das Skript muss als root laufen – von Hand also mit 'sudo sh ...'," >&2 echo "im Synology-Aufgabenplaner unter Allgemein den Benutzer 'root'." >&2 exit 1 fi # Lesbar für alle: root legt die Datei je nach umask sonst als 600 an, und # dann sieht die App sie nicht, falls der Container nicht als root läuft. chmod 644 "$ALIVE" 2>/dev/null || true [ -f "$FLAG" ] || exit 0 # "execute_after" respektieren: vorher nichts tun (Karenzzeit läuft noch). NOW=$(date +%s) AFTER=$(sed -n 's/.*"execute_after"[[:space:]]*:[[:space:]]*\([0-9]*\).*/\1/p' "$FLAG") if [ -n "$AFTER" ] && [ "$NOW" -lt "$AFTER" ]; then exit 0 fi # Markierung zuerst entfernen – sonst liefe das Update in einer Schleife, # falls es unterwegs abbricht. rm -f "$FLAG" { echo "=== $(date '+%Y-%m-%d %H:%M:%S') Update angefordert, starte ===" sh ./update.sh echo "=== $(date '+%Y-%m-%d %H:%M:%S') fertig ===" } >> "$LOG" 2>&1