#!/bin/bash # === IMPORTS === SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../Utility/WakeOnLan.sh" source "$SCRIPT_DIR/../Utility/IsMounted.sh" source "$SCRIPT_DIR/../Utility/Lock.sh" source "$SCRIPT_DIR/../Utility/Log.sh" # === TRAP EINRICHTEN === trap trap_remove_lock SIGINT SIGTERM # === LOCK-FILE ERSTELLEN === create_lock # === KONSTANTEN === MAX_RESTARTS=10 # Maximale Anzahl an Neustarts RESTART_COUNT_FILE="/tmp/hidrive_restart_count" # Datei zur Speicherung des Neustart-Zählers WEBDAV_CREDENTIALS="/etc/davfs2/secrets" # WebDAV-Passwortdatei MOUNT_POINT="/media/HiDrive" # Gemeinsamer Einhängepunkt für NFS/WebDAV # === Neustart-Zähler initialisieren === if [[ ! -f "$RESTART_COUNT_FILE" ]]; then echo 0 >"$RESTART_COUNT_FILE" fi RESTART_COUNT=$(<"$RESTART_COUNT_FILE") # === Hilfe-Seite === if [[ "$*" == *"-h"* ]]; then echo "Benutzung: $0 [DEVICE_MAC] [NFS_PATH]" echo echo "Optionen:" echo " -h Zeigt diese Hilfenachricht an" echo " WEBDAV_URL Die WebDAV-URL des Dateisystems (Pflichtfeld)" echo " DEVICE_MAC Die MAC-Adresse des Geräts (optional, für Wake-on-LAN)" echo " NFS_PATH Der NFS-Pfad des Dateisystems (optional, wenn NFS genutzt wird)" echo echo "Dieses Skript muss als root ausgeführt werden! Bsp. sudo $0" echo "Folgende Pakete müssen installiert sein: davfs2, nfs-common, nmap-common, wakeonlan, wget" echo echo "Dieses Skript bindet HiDrive als Dateisystem ein bzw. ein lokales NAS, sollte dieses vorhanden sein." echo "WakeOnLan-Pakete werden zum Starten versendet." remove_lock exit 0 fi # === ROOT-PRÜFUNG === if [[ $EUID -ne 0 ]]; then echo "Dieses Skript muss als root ausgeführt werden! Bitte starte es mit sudo." remove_lock exit 1 fi # === PARAMETER-ÜBERPRÜFUNG === if [[ "$#" -lt 1 ]]; then echo "Benutzung: $0 [DEVICE_MAC] [NFS_PATH]" remove_lock exit 1 fi WEBDAV_URL="$1" DEVICE_MAC="${2:-}" NFS_PATH="${3:-}" # === FUNKTIONEN === check_nfs_installed() { command -v mount.nfs &>/dev/null || { log "Fehler: NFS-Client nicht installiert! Bitte installiere es mit: sudo apt install nfs-common" return 1 } return 0 } check_webdav_installed() { command -v mount.davfs &>/dev/null || { log "Fehler: WebDAV-Client nicht installiert! Bitte installiere es mit: sudo apt install davfs2" return 1 } return 0 } check_webdav_credentials() { if [[ ! -f "$WEBDAV_CREDENTIALS" ]]; then log "Fehler: WebDAV-Zugangsdaten fehlen! Bitte erstelle $WEBDAV_CREDENTIALS mit den richtigen Anmeldedaten." return 1 fi return 0 } restart_script() { if [[ $RESTART_COUNT -lt $MAX_RESTARTS ]]; then RESTART_COUNT=$((RESTART_COUNT + 1)) echo "$RESTART_COUNT" >"$RESTART_COUNT_FILE" log "Neustart des Skripts (Versuch $RESTART_COUNT von $MAX_RESTARTS)..." sleep 10 remove_lock # Neustart des Skripts in einer neuen Login-Shell /bin/bash -l "$0" "$@" exit else log "Maximale Anzahl an Neustarts erreicht ($MAX_RESTARTS). Skript wird beendet." rm -f "$RESTART_COUNT_FILE" # Neustart-Zähler zurücksetzen remove_lock exit 1 fi } unmount() { local mount_point="$1" log "Unmounting $mount_point..." umount "$mount_point" && log "Unmount erfolgreich." || log "Fehler beim Unmounten von $mount_point." } mount_nfs() { log "Versuche, NFS-Dateisystem von $NFS_SERVER einzubinden..." mkdir -p "$MOUNT_POINT" mount -t nfs "$NFS_SERVER" "$MOUNT_POINT" && log "NFS erfolgreich unter $MOUNT_POINT eingebunden!" || { log "Fehler beim Einbinden von NFS!" return 1 } } mount_webdav() { log "Versuche, WebDAV-Dateisystem von $WEBDAV_URL einzubinden..." mkdir -p "$MOUNT_POINT" mount -t davfs "$WEBDAV_URL" "$MOUNT_POINT" && log "WebDAV erfolgreich unter $MOUNT_POINT eingebunden!" || { log "Fehler beim Einbinden von WebDAV!" return 1 } } # === HAUPTLOGIK === # Prüfen, ob NFS oder WebDAV installiert ist if ! check_nfs_installed && ! check_webdav_installed; then log "Weder NFS noch WebDAV sind installiert. Neustart erforderlich." log "Path: $PATH" restart_script "$@" fi if [[ -n "$DEVICE_MAC" && -n "$NFS_PATH" ]]; then log "Wake-on-LAN wird genutzt für Gerät mit MAC: $DEVICE_MAC" DEVICE_IP=$(wake_device "$DEVICE_MAC") if [[ -n "$DEVICE_IP" ]]; then log "Gerät ist unter $DEVICE_IP erreichbar. Prüfe NFS-Mount..." NFS_SERVER="$DEVICE_IP:$NFS_PATH" if ! is_nfs_mounted "$MOUNT_POINT"; then log "NFS ist nicht gemountet. Wechsel zu NFS..." is_mounted "$MOUNT_POINT" && unmount "$MOUNT_POINT" check_nfs_installed && mount_nfs || restart_script "$@" else log "NFS ist bereits gemountet." fi else log "Gerät ist nicht erreichbar. Prüfe WebDAV-Mount..." if ! is_webdav_mounted "$MOUNT_POINT"; then log "WebDAV ist nicht gemountet. Wechsel zu WebDAV..." is_mounted "$MOUNT_POINT" && unmount "$MOUNT_POINT" check_webdav_installed && check_webdav_credentials && mount_webdav || restart_script "$@" else log "WebDAV ist bereits gemountet." fi fi else log "Kein Gerät angegeben. Direktes Einbinden von WebDAV..." if ! is_webdav_mounted "$MOUNT_POINT"; then log "WebDAV ist nicht gemountet. Einbinden..." is_mounted "$MOUNT_POINT" && unmount "$MOUNT_POINT" check_webdav_installed && check_webdav_credentials && mount_webdav || restart_script "$@" else log "WebDAV ist bereits gemountet." fi fi # Neustart-Zähler zurücksetzen, wenn erfolgreich rm -f "$RESTART_COUNT_FILE" # === LOCK-FILE ENTFERNEN === remove_lock