Compare commits

...

5 Commits

6 changed files with 86 additions and 37 deletions

1
.gitignore vendored
View File

@ -32,3 +32,4 @@ core
.logs/ .logs/
.fleet .fleet
.idea

View File

@ -7,20 +7,19 @@ source "$SCRIPT_DIR/../Utility/Log.sh"
# === Hilfe-Seite === # === Hilfe-Seite ===
if [[ "$*" == *"-h"* ]]; then if [[ "$*" == *"-h"* ]]; then
echo "Benutzung: $0 <DEVICE_MAC> <DEVICE_IP> <WEBDAV_URL> <NFS_PATH>" echo "Benutzung: $0 <DEVICE_MAC> <WEBDAV_URL> <NFS_PATH>"
echo echo
echo "Optionen:" echo "Optionen:"
echo " -h Zeigt diese Hilfenachricht an" echo " -h Zeigt diese Hilfenachricht an"
echo " DEVICE_MAC Die MAC-Adresse des Geräts" echo " DEVICE_MAC Die MAC-Adresse des Geräts"
echo " DEVICE_IP Die IP-Adresse des Geräts"
echo " WEBDAV_URL Die WebDAV-URL des Dateisystems" echo " WEBDAV_URL Die WebDAV-URL des Dateisystems"
echo " NFS_PATH Der NFS-Pfad des Dateisystems" echo " NFS_PATH Der NFS-Pfad des Dateisystems"
echo echo
echo "Dieses Skript muss als root ausgeführt werden! Bsp. sudo $0" echo "Dieses Skript muss als root ausgeführt werden! Bsp. sudo $0"
echo "Folgende Pakete müssen installiert sein: davfs2, nfs-common, wakeonlan, wget" echo "Folgende Pakete müssen installiert sein: davfs2, nfs-common, nmap-common, wakeonlan, wget"
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."
exit 0 exit 0
fi fi
@ -31,19 +30,17 @@ if [[ $EUID -ne 0 ]]; then
fi fi
# === PARAMETER-ÜBERPRÜFUNG === # === PARAMETER-ÜBERPRÜFUNG ===
if [[ "$#" -ne 4 ]]; then if [[ "$#" -ne 3 ]]; then
echo "Benutzung: $0 <DEVICE_MAC> <DEVICE_IP> <WEBDAV_URL> <NFS_PATH>" echo "Benutzung: $0 <DEVICE_MAC> <WEBDAV_URL> <NFS_PATH>"
exit 1 exit 1
fi fi
DEVICE_MAC="$1" DEVICE_MAC="$1"
DEVICE_IP="$2" WEBDAV_URL="$2"
WEBDAV_URL="$3" NFS_PATH="$3"
NFS_PATH="$4"
# === KONFIGURATION === # === KONFIGURATION ===
MOUNT_POINT="/media/HiDrive" # Gemeinsamer Einhängepunkt für NFS/WebDAV MOUNT_POINT="/media/HiDrive" # Gemeinsamer Einhängepunkt für NFS/WebDAV
NFS_SERVER="$DEVICE_IP:$NFS_PATH" # Dynamische NFS-Server-Adresse
WEBDAV_CREDENTIALS="/etc/davfs2/secrets" # WebDAV-Passwortdatei WEBDAV_CREDENTIALS="/etc/davfs2/secrets" # WebDAV-Passwortdatei
# === FUNKTIONEN === # === FUNKTIONEN ===
@ -101,8 +98,11 @@ mount_webdav() {
# === HAUPTLOGIK === # === HAUPTLOGIK ===
log "Starte Wake-on-LAN-Prozess..." log "Starte Wake-on-LAN-Prozess..."
if wake_device "$DEVICE_MAC" "$DEVICE_IP"; then DEVICE_IP=$(wake_device "$DEVICE_MAC")
log "Gerät ist erreichbar, versuche NFS-Mount..."
if [[ -n "$DEVICE_IP" ]]; then
log "Gerät ist unter $DEVICE_IP erreichbar, versuche NFS-Mount..."
NFS_SERVER="$DEVICE_IP:$NFS_PATH" # Dynamische NFS-Server-Adresse setzen
if check_nfs_installed; then if check_nfs_installed; then
mount_nfs mount_nfs
fi fi

32
Utility/IpFromMac.sh Normal file
View File

@ -0,0 +1,32 @@
#!/bin/bash
# === IMPORTS ===
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/Log.sh"
# === Funktionen ===
get_ip_from_mac() {
local mac="$1"
# Aktuelle Netzwerkschnittstelle und Subnetz ermitteln
local subnet=$(ip -o -4 addr show | awk '$2 != "lo" {split($4, a, "/"); print a[1] "/" a[2]}' | head -n 1)
if [[ -z "$subnet" ]]; then
log "Fehler: Konnte Subnetz nicht ermitteln."
return 1
fi
log "Scanne Netzwerk $subnet nach MAC-Adresse $mac..."
# Netzwerk nach der MAC-Adresse scannen
local ip=$(sudo nmap -sn "$subnet" | grep -B 2 -i "$mac" | awk '/Nmap scan report/{print $5}')
if [[ -z "$ip" ]]; then
log "Fehler: Keine IP für MAC-Adresse $mac gefunden."
return 1
fi
echo "$ip"
return 0
}

24
Utility/IsReachable.sh Normal file
View File

@ -0,0 +1,24 @@
#!/bin/bash
# === IMPORTS ===
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/Log.sh"
# === Funktionen ===
is_reachable() {
local device_ip="$1"
local max_retries="$2" # Zweiter Parameter gibt die Anzahl der Versuche an
for ((i = 1; i<=max_retries; i++)); do
log "Teste Erreichbarkeit von $device_ip - Versuch $i/$max_retries..."
if ping -c 1 -W 2 "$device_ip" &>/dev/null; then
log "Gerät $device_ip ist erreichbar."
return 0
fi
sleep "$PING_WAIT"
done
log "Gerät $device_ip ist NICHT erreichbar."
return 1
}

View File

@ -13,5 +13,5 @@ log() {
touch "$LOGFILE" touch "$LOGFILE"
fi fi
echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOGFILE" echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOGFILE" >/dev/tty
} }

View File

@ -3,6 +3,8 @@
# === IMPORTS === # === IMPORTS ===
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/NetworkCheck.sh" source "$SCRIPT_DIR/NetworkCheck.sh"
source "$SCRIPT_DIR/IsReachable.sh"
source "$SCRIPT_DIR/IpFromMac.sh"
source "$SCRIPT_DIR/Log.sh" source "$SCRIPT_DIR/Log.sh"
# === KONFIGURATION === # === KONFIGURATION ===
@ -14,23 +16,6 @@ WOL_WAIT=60 # Wartezeit nach WOL (Sekunden)
# === FUNKTIONEN === # === FUNKTIONEN ===
is_reachable() {
local device_ip="$1"
local max_retries="$2" # Zweiter Parameter gibt die Anzahl der Versuche an
for ((i = 1; i<=max_retries; i++)); do
log "Teste Erreichbarkeit von $device_ip - Versuch $i/$max_retries..."
if ping -c 1 -W 2 "$device_ip" &>/dev/null; then
log "Gerät $device_ip ist erreichbar."
return 0
fi
sleep "$PING_WAIT"
done
log "Gerät $device_ip ist NICHT erreichbar."
return 1
}
send_wol() { send_wol() {
local device_mac="$1" local device_mac="$1"
log "Sende Wake-on-LAN Signal an $device_mac..." log "Sende Wake-on-LAN Signal an $device_mac..."
@ -47,22 +32,25 @@ check_wol_installed() {
wake_device() { wake_device() {
local device_mac="$1" local device_mac="$1"
local device_ip="$2"
if [[ -z "$device_mac" || -z "$device_ip" ]]; then if [[ -z "$device_mac" ]]; then
log "Fehler: MAC- und IP-Adresse müssen angegeben werden!" log "Fehler: MAC-Adresse muss angegeben werden!"
log "Verwendung: wake_device <MAC-Adresse> <IP-Adresse>"
return 1 return 1
fi fi
wait_for_internet_connection wait_for_internet_connection
if is_reachable "$device_ip" "$PING_RETRIES_BEFORE_WOL"; then # Versuche, die IP aus der MAC-Adresse zu ermitteln
local device_ip
device_ip=$(get_ip_from_mac "$device_mac")
if [[ -n "$device_ip" ]] && is_reachable "$device_ip" "$PING_RETRIES_BEFORE_WOL"; then
log "Gerät ist bereits an, kein WOL nötig." log "Gerät ist bereits an, kein WOL nötig."
echo "$device_ip" # Nur die IP-Adresse ausgeben
return 0 return 0
fi fi
check_wol_installed || return 1 # WOL-Tool prüfen, wenn nicht da, Abbruch check_wol_installed || return 1
for ((attempt = 1; attempt<=WOL_RETRIES; attempt++)); do for ((attempt = 1; attempt<=WOL_RETRIES; attempt++)); do
log "Wake-on-LAN Versuch $attempt/$WOL_RETRIES..." log "Wake-on-LAN Versuch $attempt/$WOL_RETRIES..."
@ -70,8 +58,12 @@ wake_device() {
log "Warte $WOL_WAIT Sekunden..." log "Warte $WOL_WAIT Sekunden..."
sleep "$WOL_WAIT" sleep "$WOL_WAIT"
if is_reachable "$device_ip" "$PING_RETRIES_AFTER_WOL"; then # IP-Adresse erneut abrufen
device_ip=$(get_ip_from_mac "$device_mac")
if [[ -n "$device_ip" ]] && is_reachable "$device_ip" "$PING_RETRIES_AFTER_WOL"; then
log "Gerät ist jetzt erreichbar!" log "Gerät ist jetzt erreichbar!"
echo "$device_ip" # Erfolgreich: Nur die IP-Adresse ausgeben
return 0 return 0
fi fi
done done