Files
deskhub/DeskHub-Webseite/tools/fix-permissions.sh
T
2026-11-05 21:22:03 +00:00

93 lines
4.6 KiB
Bash

#!/bin/sh
# DeskHub: setzt die Datei-Rechte so, dass der Webserver alles lesen und das System-Update alles schreiben kann.
#
# Aufruf (im DeskHub-Hauptordner oder mit Pfad):
# sh tools/fix-permissions.sh [--check] [--group-write] [BENUTZER[:GRUPPE]] [PFAD]
#
# --check nur anzeigen, was nicht stimmt, nichts ändern
# --group-write Ordner 775 und Dateien 664 (wenn Webserver und FTP-Benutzer nur über eine gemeinsame Gruppe schreiben)
# BENUTZER neuer Besitzer aller Dateien, nötig nur wenn sie jemand anderem gehören (z. B. root). Ändern darf das nur root:
# beim Hoster als „Geplante Aufgabe“ (Plesk: Tools & Einstellungen → Geplante Aufgaben → Befehl ausführen) oder über den Support
# PFAD Ordner von DeskHub (Standard: der Ordner über „tools“)
#
# Ergebnis: Ordner 755, Dateien 644, Konfiguration und Datenbank 640 (nur Besitzer und Gruppe lesen), Skripte unter tools 755.
# Nichts wird gelöscht und keine Datei verändert, nur Besitzer und Rechte.
set -u
CHECK=0; GROUPW=0; OWNER=""; ROOT=""
for a in "$@"; do
case "$a" in
--check) CHECK=1 ;;
--group-write) GROUPW=1 ;;
--*) echo "Unbekannte Option: $a" >&2; exit 2 ;;
*) if [ -z "$OWNER" ] && [ ! -d "$a" ]; then OWNER="$a"; else ROOT="$a"; fi ;;
esac
done
[ -n "$ROOT" ] || ROOT=$(cd "$(dirname "$0")/.." && pwd)
[ -f "$ROOT/version.php" ] && [ -d "$ROOT/includes" ] || { echo "Das ist kein DeskHub-Ordner: $ROOT (version.php oder includes fehlt)" >&2; exit 1; }
DMODE=755; FMODE=644; SMODE=640
if [ "$GROUPW" = 1 ]; then DMODE=775; FMODE=664; SMODE=660; fi
ME=$(id -u)
echo "DeskHub-Ordner: $ROOT"
echo "Angemeldet als: $(id -un) (uid $ME) · Ordner $DMODE, Dateien $FMODE, Konfiguration/Datenbank $SMODE"
# Läuft das Skript als root ohne Benutzerangabe, wird der Besitzer von index.php (sonst des Ordners) übernommen, sofern das nicht root ist
if [ -z "$OWNER" ] && [ "$ME" = 0 ]; then
guess=$(stat -c %U "$ROOT/index.php" 2>/dev/null || true)
[ -n "$guess" ] && [ "$guess" != root ] || guess=$(stat -c %U "$ROOT" 2>/dev/null || true)
if [ -n "$guess" ] && [ "$guess" != root ]; then OWNER="$guess"; echo "Besitzer automatisch erkannt: $OWNER"
else echo "Als root bitte den Besitzer angeben: sh tools/fix-permissions.sh BENUTZER" >&2; exit 1; fi
fi
# Dateien, die nicht dem Zielbenutzer gehören, kann nur root ändern
if [ -n "$OWNER" ]; then
if [ "$CHECK" = 1 ]; then
n=$(find "$ROOT" ! -user "${OWNER%%:*}" 2>/dev/null | wc -l)
echo "Gehören nicht ${OWNER%%:*}: $n Einträge"
find "$ROOT" ! -user "${OWNER%%:*}" 2>/dev/null | head -15 | sed 's/^/ /'
elif [ "$ME" = 0 ]; then
chown -R "$OWNER" "$ROOT" && echo "Besitzer gesetzt: $OWNER"
else
echo "Hinweis: Den Besitzer kann nur root ändern (Geplante Aufgabe beim Hoster oder Support). Es werden nur die Rechte gesetzt." >&2
fi
fi
fix() { # Art(d|f) Modus [weitere find-Argumente...]
kind=$1; mode=$2; shift 2
if [ "$CHECK" = 1 ]; then
n=$(find "$ROOT" -type "$kind" ! -perm "$mode" "$@" 2>/dev/null | wc -l)
echo " $([ "$kind" = d ] && echo Ordner || echo Dateien) mit anderen Rechten als $mode: $n"
else
find "$ROOT" -type "$kind" ! -perm "$mode" "$@" -exec chmod "$mode" {} + 2>/dev/null
fi
}
echo "Ordner:"
fix d "$DMODE" ! -path "*/.git/*"
echo "Dateien:"
fix f "$FMODE" ! -path "*/.git/*" ! -path "*/config/config.php" ! -path "*/database/*.sqlite" ! -path "*/database/*.sqlite-*" ! -path "*/database/*.db" ! -name .env ! -path "*/tools/*.sh"
echo "Konfiguration und Datenbank:"
for f in "$ROOT/config/config.php" "$ROOT"/database/*.sqlite "$ROOT"/database/*.sqlite-* "$ROOT"/database/*.db "$ROOT/.env"; do
[ -f "$f" ] || continue
if [ "$CHECK" = 1 ]; then
[ "$(stat -c %a "$f" 2>/dev/null)" = "$SMODE" ] || echo " $f hat andere Rechte als $SMODE"
else
chmod "$SMODE" "$f" 2>/dev/null
fi
done
for f in "$ROOT"/tools/*.sh; do [ -f "$f" ] && { [ "$CHECK" = 1 ] || chmod 755 "$f" 2>/dev/null; }; done
# Zum Schluss: Was kann der Webserver später noch nicht ändern?
echo "Prüfung der Schreibbarkeit (für den Benutzer, der dieses Skript ausführt):"
bad=0
for d in "" config database backups uploads plugins app_downloads assets cron includes staff api docs; do
p="$ROOT${d:+/$d}"
[ -d "$p" ] || continue
if [ ! -w "$p" ]; then echo " NICHT beschreibbar: ${d:-.}"; bad=1; fi
done
[ -f "$ROOT/version.php" ] && [ ! -w "$ROOT/version.php" ] && { echo " NICHT beschreibbar: version.php"; bad=1; }
if [ "$bad" = 0 ]; then echo " alles in Ordnung"; else echo " Besitzer ändern (nur root): sh tools/fix-permissions.sh BENUTZER"; fi
[ "$CHECK" = 1 ] && echo "(--check: nichts wurde geändert)"
exit 0