188 lines
6.1 KiB
Bash
Executable File
188 lines
6.1 KiB
Bash
Executable File
#!/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 <WEBDAV_URL> [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 <WEBDAV_URL> [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! Datei $WEBDAV_CREDENTIALS existiert nicht."
|
|
return 1
|
|
fi
|
|
|
|
# Prüfen, ob für genau diesen Mountpoint Credentials hinterlegt sind
|
|
if ! grep -qE "^[^#]*${MOUNT_POINT//\//\\/} .+ .+" "$WEBDAV_CREDENTIALS"; then
|
|
log "Fehler: Keine gültigen Zugangsdaten für den Mountpoint $MOUNT_POINT in $WEBDAV_CREDENTIALS gefunden!"
|
|
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
|