2025-08-22 08:17:14 +02:00
2025-08-22 08:17:14 +02:00

Medi-WOL - Wake-on-LAN Manager

Ein moderner Wake-on-LAN Manager, entwickelt mit Go und einer schönen Web-Oberfläche.

Features

  • PC-Verwaltung: Hinzufügen, Anzeigen, Bearbeiten und Löschen von PC-Einträgen
  • Wake-on-LAN: Ein-Klick-Aufwecken von Computern über MAC-Adressen
  • IP-Adressverwaltung: Pro Gerät wird eine IP-Adresse gespeichert
  • Online-Status (Ping): Geräte können per Ping geprüft und im UI als Online/Offline angezeigt werden
  • Automatischer Autostart: Scheduler für geplante Wake-on-LAN Ereignisse mit Crontab-Syntax
  • Logging-System: Vollständige Protokollierung aller WOL-Ereignisse (Button-Klick und Scheduler)
  • Moderne Web-Oberfläche: Responsive Design mit Bootstrap und FontAwesome
  • SQLite-Datenbank: Einfache lokale Datenspeicherung
  • Cross-Platform: Läuft auf Windows und Linux
  • Konfigurierbarer Port: Über Umgebungsvariablen oder Kommandozeilenparameter

Voraussetzungen

  • Go 1.21 oder höher
  • Git

Installation

  1. Repository klonen:

    git clone https://gitea.medisoftware.org/Markus/medi-wol.git
    cd medi-wol
    
  2. Abhängigkeiten installieren:

    go mod tidy
    
  3. Anwendung starten:

    # Standard-Port 8080
    go run cmd/server/main.go
    
    # Benutzerdefinierter Port
    go run cmd/server/main.go -port 9090
    
    # Mit Umgebungsvariable
    set PORT=9090  # Windows
    export PORT=9090  # Linux
    go run cmd/server/main.go
    
  4. Im Browser öffnen:

    http://localhost:8080  # Standard
    http://localhost:9090  # Benutzerdefiniert
    

Konfiguration

Port-Konfiguration

Der Server-Port kann auf verschiedene Weise konfiguriert werden:

1. Kommandozeilenparameter

# Port 9090 verwenden
./medi-wol.exe -port 9090

# Hilfe anzeigen
./medi-wol.exe -help

2. Umgebungsvariable

# Windows
set PORT=9090
medi-wol.exe

# Linux/macOS
export PORT=9090
./medi-wol

# Oder direkt
PORT=9090 ./medi-wol

3. Standard-Port

Falls weder Kommandozeilenparameter noch Umgebungsvariable gesetzt sind, wird Port 8080 verwendet.

Prioritätsreihenfolge

  1. Kommandozeilenparameter (-port) - Höchste Priorität
  2. Umgebungsvariable (PORT) - Mittlere Priorität
  3. Standard-Port (8080) - Niedrigste Priorität

Verwendung

PC hinzufügen

  1. Geben Sie den Namen des PCs ein
  2. Geben Sie die MAC-Adresse im Format XX:XX:XX:XX:XX:XX ein
  3. Geben Sie die IP-Adresse des PCs ein (z. B. 192.168.0.10)
  4. Klicken Sie auf "PC hinzufügen"

PC bearbeiten

  1. Klicken Sie auf den "Bearbeiten"-Button neben dem gewünschten PC
  2. Ändern Sie Name, MAC-Adresse und/oder IP-Adresse
  3. Klicken Sie auf "Speichern"

PC aufwecken

  • Klicken Sie auf den "Aufwecken"-Button neben dem gewünschten PC
  • Das System sendet automatisch ein Wake-on-LAN Paket

Online-Status prüfen (Ping)

  • Beim Laden der Seite wird automatisch der Status abgefragt
  • Alle 30 Sekunden wird der Status automatisch aktualisiert
  • Zusätzlich können Sie manuell über den Button "Status aktualisieren" aktualisieren

PC löschen

  • Klicken Sie auf den "Löschen"-Button neben dem gewünschten PC
  • Bestätigen Sie die Löschung

Autostart konfigurieren

  1. Autostart aktivieren: Aktivieren Sie die Checkbox "Autostart aktiv"
  2. Crontab-Syntax eingeben: Verwenden Sie das Format Minute Stunde Tag Monat Wochentag
    • Standard: 30 7 * * Mon-Fri (Mo-Fr um 7:30 Uhr)
    • Beispiele:
      • 0 8 * * * = Täglich um 8:00 Uhr
      • 0 9 * * Mon,Wed,Fri = Mo, Mi, Fr um 9:00 Uhr
      • 30 7 * * 1-5 = Mo-Fr um 7:30 Uhr
  3. Hilfe: Link zu crontab.guru für Crontab-Syntax
  4. Speichern: Änderungen werden automatisch vom Scheduler übernommen

Logs einsehen

  • Tooltips: Die letzten 5 Log-Einträge werden als Tooltip über jeder PC-Zeile angezeigt
  • Logs-Seite: Vollständige Log-Übersicht unter /logs
  • Log-Details: Jeder Eintrag enthält Timestamp, PC-Name, MAC-Adresse und Auslöser (Button/Scheduler)

Windows Installer

Features

Der Windows Installer (medi-wol-setup.exe) bietet:

  • Automatische Service-Installation mit NSSM
  • Port-Konfiguration während der Installation (Standard: 9000)
  • Windows Firewall-Regeln werden automatisch erstellt:
    • Eingehende Verbindungen zur Anwendung
    • Ausgehende Verbindungen (für Wake-on-LAN)
    • Port-spezifische TCP-Regeln
  • Service-Start-Option (Checkbox für automatischen Start)
  • Saubere Deinstallation mit Entfernung aller Firewall-Regeln

Voraussetzungen für den Build

# NSSM in das Installer-Verzeichnis kopieren
copy "I:\MARKUS\beszel\nssm.exe" installer\nssm.exe

# Oder von der offiziellen Quelle herunterladen
# https://nssm.cc/download

Build des Installers

# Mit build.bat (automatisch)
.\build.bat

# Oder manuell mit Inno Setup Compiler
ISCC.exe installer\medi-wol-setup.iss

Build-Anweisungen

Windows Build

Lokaler Build (Windows)

# Einfacher Build
go build -o medi-wol.exe cmd/server/main.go

# Build mit Optimierungen
go build -ldflags="-s -w" -o medi-wol.exe cmd/server/main.go

# Build für Release
go build -ldflags="-s -w -X main.version=1.0.0" -o medi-wol.exe cmd/server/main.go

Cross-Compilation von Windows für Linux

# Für Linux AMD64
set GOOS=linux
set GOARCH=amd64
go build -o medi-wol-linux-amd64 cmd/server/main.go

# Für Linux ARM64 (Raspberry Pi, etc.)
set GOOS=linux
set GOARCH=arm64
go build -o medi-wol-linux-arm64 cmd/server/main.go

# Zurücksetzen auf Windows
set GOOS=windows
set GOARCH=amd64

Linux Build

Lokaler Build (Linux)

# Einfacher Build
go build -o medi-wol cmd/server/main.go

# Build mit Optimierungen
go build -ldflags="-s -w" -o medi-wol cmd/server/main.go

# Build für Release
go build -ldflags="-s -w -X main.version=1.0.0" -o medi-wol cmd/server/main.go

Cross-Compilation von Linux für Windows

# Für Windows AMD64
GOOS=windows GOARCH=amd64 go build -o medi-wol-windows-amd64.exe cmd/server/main.go

# Für Windows ARM64
GOOS=windows GOARCH=arm64 go build -o medi-wol-windows-arm64.exe cmd/server/main.go

Build-Flags Erklärung

  • -ldflags="-s -w": Reduziert die Binary-Größe durch Entfernung von Debug-Informationen
  • -X main.version=1.0.0: Setzt eine Version-Variable zur Laufzeit
  • -o filename: Bestimmt den Ausgabedateinamen

Build-Skripte

Windows Build-Skript (build.bat)

@echo off
echo Building Medi-WOL for multiple platforms...

REM Erstelle dist-Verzeichnis
if not exist dist mkdir dist

echo Building for Windows AMD64...
go build -ldflags="-s -w" -o dist/medi-wol-windows-amd64.exe cmd/server/main.go

echo Building for Linux AMD64...
set GOOS=linux
set GOARCH=amd64
go build -ldflags="-s -w" -o dist/medi-wol-linux-amd64 cmd/server/main.go

echo Building for Linux ARM64...
set GOOS=linux
set GOARCH=arm64
go build -ldflags="-s -w" -o dist/medi-wol-linux-arm64 cmd/server/main.go

echo Building for Windows ARM64...
set GOOS=windows
set GOARCH=arm64
go build -ldflags="-s -w" -o dist/medi-wol-windows-arm64.exe cmd/server/main.go

REM Zurücksetzen auf Windows AMD64
set GOOS=windows
set GOARCH=amd64

echo.
echo Build complete! Binaries created in dist/ folder:
dir dist
echo.
pause

Linux Build-Skript (build.sh)

#!/bin/bash

echo "Building Medi-WOL for multiple platforms..."

# Erstelle dist-Verzeichnis
mkdir -p dist

echo "Building for Linux AMD64..."
go build -ldflags="-s -w" -o dist/medi-wol-linux-amd64 cmd/server/main.go

echo "Building for Linux ARM64..."
GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o dist/medi-wol-linux-arm64 cmd/server/main.go

echo "Building for Windows AMD64..."
GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o dist/medi-wol-windows-amd64.exe cmd/server/main.go

echo "Building for Windows ARM64..."
GOOS=windows GOARCH=arm64 go build -ldflags="-s -w" -o dist/medi-wol-windows-arm64.exe cmd/server/main.go

echo ""
echo "Build complete! Binaries created in dist/ folder:"
ls -la dist/
echo ""

Projektstruktur

medi-wol/
├── cmd/server/          # Hauptanwendung
├── internal/            # Interne Pakete
│   ├── database/        # Datenbanklogik
│   ├── handlers/        # HTTP-Handler
│   ├── models/          # Datenmodelle
│   ├── scheduler/       # Autostart-Scheduler für WOL-Ereignisse
│   └── wol/            # Wake-on-LAN Service
├── web/                 # Web-Oberfläche
│   ├── static/         # CSS, JavaScript
│   └── templates/      # HTML-Templates
├── installer/           # Windows Installer
│   ├── medi-wol-setup.iss  # Inno Setup Script
│   └── nssm.exe        # NSSM für Service-Management
├── go.mod              # Go-Module
├── build.bat           # Windows Build-Skript (inkl. Installer)
├── build.sh            # Linux Build-Skript
├── AUTOSTART_README.md # Dokumentation des Autostart-Systems
├── LOGGING_README.md   # Dokumentation des Logging-Systems
└── README.md           # Diese Datei

Installer-Verzeichnis

Das installer/ Verzeichnis enthält alle Dateien für den Windows Installer:

  • medi-wol-setup.iss - Inno Setup Konfigurationsdatei
  • nssm.exe - NSSM (Non-Sucking Service Manager) für Windows Services

API-Endpunkte

PC-Management

  • GET / - Hauptseite
  • GET /api/pcs - Alle PCs abrufen
  • POST /api/pcs - Neuen PC erstellen
  • PUT /api/pcs/:id - PC aktualisieren
  • DELETE /api/pcs/:id - PC löschen
  • POST /api/pcs/:id/wake - PC aufwecken
  • GET /api/pcs/status - Online-Status aller PCs abrufen (Ping)

Logging

  • GET /logs - Logs-Seite anzeigen
  • GET /api/logs - Alle Log-Einträge abrufen
  • GET /api/logs/pc/:id - Logs für einen spezifischen PC abrufen
  • GET /api/logs/pc/:id/recent - Die letzten 5 Logs für einen PC abrufen

Datenbank

Die Anwendung verwendet SQLite als lokale Datenbank. Die Datenbankdatei medi-wol.db wird automatisch im Projektverzeichnis erstellt.

Tabellenstruktur pcs

Spalte Typ Hinweis
id INTEGER Primärschlüssel
name TEXT Pflichtfeld
mac TEXT Pflichtfeld, eindeutig
ip TEXT Pflichtfeld
autostart_cron TEXT Crontab-Syntax für Autostart (Standard: 30 7 * * Mon-Fri)
autostart_enabled BOOLEAN Autostart aktiviert (Standard: false)
created_at DATETIME Automatisch
updated_at DATETIME Automatisch

Tabellenstruktur wol_logs

Spalte Typ Hinweis
id INTEGER Primärschlüssel
timestamp DATETIME Zeitstempel des WOL-Ereignisses
pc_id INTEGER Referenz auf PC (Foreign Key)
pc_name TEXT Name des PCs zum Zeitpunkt des Ereignisses
mac TEXT MAC-Adresse des PCs
trigger TEXT Auslöser: "button" oder "cron"

Wake-on-LAN

Das System sendet Magic Packets an die gespeicherten MAC-Adressen. Stellen Sie sicher, dass:

  1. Die Zielcomputer Wake-on-LAN unterstützen
  2. Die Netzwerkkarte für Wake-on-LAN konfiguriert ist
  3. Die Computer im gleichen Netzwerksegment sind

Entwicklung

Lokale Entwicklung

# Standard-Port 8080
go run cmd/server/main.go

# Benutzerdefinierter Port
go run cmd/server/main.go -port 9090

Hinweise zum Ping

  • Der Ping wird aktuell über den Button "Status aktualisieren" ausgelöst (GET /api/pcs/status).
  • Unter Windows wird der Systembefehl ping -n 1 -w 1000 <IP> verwendet, unter Linux/macOS ping -c 1 -W 1 <IP>.
  • Falls ICMP blockiert ist, wird als Fallback eine kurze TCP-Portprobe versucht (80, sonst 22).
  • Optional kann ein automatisches Intervall im Frontend ergänzt werden (z. B. alle 30s).

Build für Produktion

# Windows
go build -ldflags="-s -w" -o medi-wol.exe cmd/server/main.go

# Linux
go build -ldflags="-s -w" -o medi-wol cmd/server/main.go

Tests ausführen

go test ./...

Code-Qualität prüfen

# Code formatieren
go fmt ./...

# Linting (falls golint installiert ist)
golint ./...

# Vet prüfen
go vet ./...

Scheduler-System

Übersicht

Der integrierte Scheduler ermöglicht es, Wake-on-LAN Ereignisse automatisch zu geplanten Zeiten auszuführen. Dies ist ideal für:

  • Bürozeiten: PCs starten automatisch vor Arbeitsbeginn
  • Wartungsfenster: Regelmäßige Systemstarts für Updates
  • Energiesparen: PCs werden nur bei Bedarf gestartet

Funktionsweise

  1. Crontab-Parser: Unterstützt Standard Crontab-Syntax
  2. Minuten-Intervall: Prüft jede Minute auf fällige Aufgaben
  3. Automatische Ausführung: Sendet WOL-Pakete ohne Benutzerinteraktion
  4. Logging: Alle Scheduler-Ereignisse werden protokolliert

Unterstützte Crontab-Formate

  • Einfache Werte: 30 7 * * Mon-Fri (Mo-Fr um 7:30 Uhr)
  • Bereiche: 0 8-18 * * * (8:00-18:00 Uhr stündlich)
  • Wochentage: 0 9 * * Mon,Wed,Fri (Mo, Mi, Fr um 9:00 Uhr)
  • Wochentag-Bereiche: 0 8 * * Mon-Fri (Mo-Fr um 8:00 Uhr)

Konfiguration

  • Standard: 30 7 * * Mon-Fri (Mo-Fr um 7:30 Uhr)
  • Anpassung: Über die Web-Oberfläche bei jedem PC individuell
  • Aktivierung: Checkbox "Autostart aktiv" pro PC
  • Sofortige Übernahme: Änderungen werden sofort vom Scheduler berücksichtigt

Deployment

Windows Service

Mit NSSM (Non-Sucking Service Manager)

# Service installieren
nssm install Medi-WOL "C:\path\to\medi-wol.exe"
nssm set Medi-WOL AppDirectory "C:\path\to\medi-wol"
nssm set Medi-WOL AppParameters "-port 9090"  # Optional: Port setzen
nssm start Medi-WOL

Windows Installer (Empfohlen)

Der Windows Installer konfiguriert den Service automatisch mit NSSM:

  • Automatische Service-Installation mit NSSM
  • Windows Firewall-Regeln werden automatisch erstellt
  • Port-Konfiguration während der Installation
  • Service-Start-Option (Checkbox für automatischen Start)

Wichtig: Für den Windows Installer muss nssm.exe im installer/ Verzeichnis verfügbar sein:

# NSSM in das Installer-Verzeichnis kopieren
copy "I:\MARKUS\beszel\nssm.exe" installer\nssm.exe

# Oder von der offiziellen Quelle herunterladen
# https://nssm.cc/download

Linux Systemd Service

# /etc/systemd/system/medi-wol.service
[Unit]
Description=Medi-WOL Wake-on-LAN Manager
After=network.target

[Service]
Type=simple
User=medi-wol
WorkingDirectory=/opt/medi-wol
ExecStart=/opt/medi-wol/medi-wol -port 9090
Environment="PORT=9090"
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Docker (Optional)

FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -ldflags="-s -w" -o medi-wol cmd/server/main.go

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/medi-wol .
EXPOSE 8080
CMD ["./medi-wol", "-port", "8080"]
# Docker Container starten
docker run -d -p 9090:9090 -e PORT=9090 medi-wol:latest

Lizenz

Dieses Projekt ist für den internen Gebrauch bestimmt.

Support

Bei Fragen oder Problemen wenden Sie sich an das Entwicklungsteam.

Hier sind drei einfache Wege nimm Variante A (empfohlen) für die neueste Version.

  • A) Offizielles Tarball (empfohlen)

    1. Alte Installation entfernen (falls vorhanden):
    sudo rm -rf /usr/local/go
    
    1. Tarball laden und installieren (ersetze 1.22.6 und Arch bei Bedarf: amd64/arm64):
    wget https://go.dev/dl/go1.22.6.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.22.6.linux-amd64.tar.gz
    
    1. PATH setzen (dauerhaft):
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
    source ~/.profile
    
    1. Prüfen:
    go version
    
  • B) Snap (schnell, meist aktuell)

    sudo snap install go --classic
    go version
    
  • C) Ubuntu-Paket (einfach, aber oft älter)

    sudo apt update
    sudo apt install -y golang-go
    go version
    

Hinweise:

  • Standard-GOPATH ist ~/go. Optional:
    echo 'export GOPATH=$HOME/go' >> ~/.profile
    echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.profile
    source ~/.profile
    
Description
Wake-On-LAN Weboberfläche in Go
Readme MIT 76 MiB
Languages
Go 40.3%
JavaScript 24%
HTML 18.9%
Inno Setup 7.8%
CSS 6.7%
Other 2.3%