Compare commits

..

5 Commits

3 changed files with 124 additions and 22 deletions

View File

@ -2,11 +2,27 @@
# === IMPORTS === # === IMPORTS ===
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../Utility/IsWebdavMounted.sh"
source "$SCRIPT_DIR/../Utility/WakeOnLan.sh" source "$SCRIPT_DIR/../Utility/WakeOnLan.sh"
source "$SCRIPT_DIR/../Utility/IsMounted.sh" source "$SCRIPT_DIR/../Utility/IsMounted.sh"
source "$SCRIPT_DIR/../Utility/Lock.sh"
source "$SCRIPT_DIR/../Utility/Log.sh" source "$SCRIPT_DIR/../Utility/Log.sh"
# === TRAP EINRICHTEN ===
trap trap_remove_lock SIGINT SIGTERM
# === LOCK-FILE ERSTELLEN ===
create_lock
# === KONSTANTEN ===
MAX_RESTARTS=2 # Maximale Anzahl an Neustarts
RESTART_COUNT_FILE="/tmp/hidrive_restart_count" # Datei zur Speicherung des Neustart-Zählers
# === Neustart-Zähler initialisieren ===
if [[ ! -f "$RESTART_COUNT_FILE" ]]; then
echo 0 >"$RESTART_COUNT_FILE"
fi
RESTART_COUNT=$(<"$RESTART_COUNT_FILE")
# === Hilfe-Seite === # === Hilfe-Seite ===
if [[ "$*" == *"-h"* ]]; then if [[ "$*" == *"-h"* ]]; then
echo "Benutzung: $0 <DEVICE_MAC> <WEBDAV_URL> <NFS_PATH>" echo "Benutzung: $0 <DEVICE_MAC> <WEBDAV_URL> <NFS_PATH>"
@ -22,18 +38,21 @@ if [[ "$*" == *"-h"* ]]; then
echo echo
echo "Dieses Skript bindet HiDrive als Dateisystem ein bzw. ein lokales NAS, sollte dieses vorhanden sein." echo "Dieses Skript bindet HiDrive als Dateisystem ein bzw. ein lokales NAS, sollte dieses vorhanden sein."
echo "WakeOnLan-Pakete werden zum Starten versendet." echo "WakeOnLan-Pakete werden zum Starten versendet."
remove_lock
exit 0 exit 0
fi fi
# === ROOT-PRÜFUNG === # === ROOT-PRÜFUNG ===
if [[ $EUID -ne 0 ]]; then if [[ $EUID -ne 0 ]]; then
echo "Dieses Skript muss als root ausgeführt werden! Bitte starte es mit sudo." echo "Dieses Skript muss als root ausgeführt werden! Bitte starte es mit sudo."
remove_lock
exit 1 exit 1
fi fi
# === PARAMETER-ÜBERPRÜFUNG === # === PARAMETER-ÜBERPRÜFUNG ===
if [[ "$#" -ne 3 ]]; then if [[ "$#" -ne 3 ]]; then
echo "Benutzung: $0 <DEVICE_MAC> <WEBDAV_URL> <NFS_PATH>" echo "Benutzung: $0 <DEVICE_MAC> <WEBDAV_URL> <NFS_PATH>"
remove_lock
exit 1 exit 1
fi fi
@ -62,16 +81,30 @@ check_webdav_installed() {
return 0 return 0
} }
check_webdav_credentials() { restart_script() {
if [[ ! -f "$WEBDAV_CREDENTIALS" ]]; then if [[ $RESTART_COUNT -lt $MAX_RESTARTS ]]; then
log "Fehler: WebDAV-Passwortdatei nicht gefunden unter $WEBDAV_CREDENTIALS!" RESTART_COUNT=$((RESTART_COUNT + 1))
echo "$RESTART_COUNT" >"$RESTART_COUNT_FILE"
log "Neustart des Skripts (Versuch $RESTART_COUNT von $MAX_RESTARTS)..."
remove_lock
exec "$0" "$@"
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..."
if umount "$mount_point"; then
log "Unmount erfolgreich."
else
log "Fehler beim Unmounten von $mount_point."
return 1 return 1
fi fi
if ! grep -q "$MOUNT_POINT" "$WEBDAV_CREDENTIALS"; then
log "Fehler: Keine Zugangsdaten für den Mountpoint $MOUNT_POINT in $WEBDAV_CREDENTIALS gefunden!"
return 1
fi
return 0
} }
mount_nfs() { mount_nfs() {
@ -100,25 +133,46 @@ mount_webdav() {
# === HAUPTLOGIK === # === HAUPTLOGIK ===
# Prüfen, ob das Dateisystem bereits gemountet ist # Prüfen, ob NFS oder WebDAV installiert ist
if is_mounted "$MOUNT_POINT"; then if ! check_nfs_installed && ! check_webdav_installed; then
log "Das Dateisystem ist bereits gemountet unter $MOUNT_POINT." log "Weder NFS noch WebDAV sind installiert. Neustart erforderlich."
exit 0 # Skript beenden, da kein weiteres Mounten erforderlich ist restart_script "$@"
fi fi
# Wenn nicht gemountet, mit der Hauptlogik fortfahren # Gerät erreichbar?
log "Starte Wake-on-LAN-Prozess..."
DEVICE_IP=$(wake_device "$DEVICE_MAC") DEVICE_IP=$(wake_device "$DEVICE_MAC")
if [[ -n "$DEVICE_IP" ]]; then if [[ -n "$DEVICE_IP" ]]; then
log "Gerät ist unter $DEVICE_IP erreichbar, versuche NFS-Mount..." log "Gerät ist unter $DEVICE_IP erreichbar. Prüfe NFS-Mount..."
NFS_SERVER="$DEVICE_IP:$NFS_PATH" # Dynamische NFS-Server-Adresse setzen NFS_SERVER="$DEVICE_IP:$NFS_PATH"
if check_nfs_installed; then if ! is_nfs_mounted "$MOUNT_POINT"; then
mount_nfs log "NFS ist nicht gemountet. Wechsel zu NFS..."
if is_mounted "$MOUNT_POINT"; then
unmount "$MOUNT_POINT"
fi
if check_nfs_installed; then
mount_nfs || restart_script "$@"
fi
else
log "NFS ist bereits gemountet."
fi fi
else else
log "Gerät konnte nicht geweckt werden, versuche WebDAV-Mount..." log "Gerät ist nicht erreichbar. Prüfe WebDAV-Mount..."
if check_webdav_installed && check_webdav_credentials; then if ! is_webdav_mounted "$MOUNT_POINT"; then
mount_webdav log "WebDAV ist nicht gemountet. Wechsel zu WebDAV..."
if is_mounted "$MOUNT_POINT"; then
unmount "$MOUNT_POINT"
fi
if check_webdav_installed && check_webdav_credentials; then
mount_webdav || restart_script "$@"
fi
else
log "WebDAV ist bereits gemountet."
fi fi
fi fi
# Neustart-Zähler zurücksetzen, wenn erfolgreich
rm -f "$RESTART_COUNT_FILE"
# === LOCK-FILE ENTFERNEN ===
remove_lock

View File

@ -8,3 +8,21 @@ is_mounted() {
return 1 # Nicht gemountet return 1 # Nicht gemountet
fi fi
} }
is_webdav_mounted() {
local mount_point="$1"
if mount | grep -q "on $mount_point type davfs"; then
return 0 # WebDAV ist gemountet
else
return 1 # WebDAV ist nicht gemountet
fi
}
is_nfs_mounted() {
local mount_point="$1"
if mount | grep -q "on $mount_point type nfs"; then
return 0 # NFS ist gemountet
else
return 1 # NFS ist nicht gemountet
fi
}

30
Utility/Lock.sh Normal file
View File

@ -0,0 +1,30 @@
#!/bin/bash
LOCK_DIR="/run/lock" # Standard für systemweite Locks
if [[ ! -w "$LOCK_DIR" ]]; then
LOCK_DIR="/tmp" # Fallback für benutzerspezifische Locks
fi
LOCK_FILE="$LOCK_DIR/$(basename "$0").lock"
create_lock() {
if [[ -e "$LOCK_FILE" ]]; then
log "Ein anderer Prozess läuft bereits. Lock-File gefunden: $LOCK_FILE"
exit 1
fi
touch "$LOCK_FILE"
log "Lock-File erstellt: $LOCK_FILE"
}
remove_lock() {
if [[ -e "$LOCK_FILE" ]]; then
rm -f "$LOCK_FILE"
log "Lock-File entfernt: $LOCK_FILE"
fi
}
trap_remove_lock() {
log "Signal empfangen. Lock-File wird entfernt."
remove_lock
exit 1
}