2 validate config sh
michael edited this page 2025-09-10 14:12:26 +02:00

validate-config.sh

furt Konfiguration vor Service-Start validieren

Getestet unter

  • OpenBSD 7.7
  • Debian 12
  • Arch Linux

Zweck des Scripts

Das validate-config.sh Script überprüft die furt-Konfigurationsdatei auf Syntax-Fehler und fehlende Pflicht-Abschnitte vor dem Service-Start. Es erkennt betriebssystem-spezifische Config-Pfade und validiert INI-Format, Server-Einstellungen und API-Key-Konfiguration.

Das Script verhindert Service-Starts mit defekter Konfiguration und gibt spezifische Hinweise auf Problembereiche für schnellere Fehlerbehebung.

Wie das Script funktioniert

Das Script erkennt zunächst den korrekten Konfigurationspfad basierend auf dem Betriebssystem:

if [ "$(uname)" = "OpenBSD" ]; then
    CONFIG_FILE="/usr/local/etc/furt/furt.conf"
else
    CONFIG_FILE="/etc/furt/furt.conf"
fi

Anschließend führt es eine mehrstufige Validierung durch:

  1. Datei-Existenz: Prüft ob die Config-Datei gefunden wird
  2. INI-Syntax: Validiert grundlegende INI-Struktur
  3. Pflicht-Abschnitte: Stellt sicher dass [server] existiert
  4. Server-Parameter: Prüft port- und host-Konfiguration
  5. API-Keys: Warnt bei fehlenden API-Key-Definitionen
  6. Berechtigungen: Überprüft Config-Datei-Permissions

Das set -e Flag sorgt dafür dass das Script bei kritischen Fehlern sofort abbricht statt weiterzumachen.

Betriebssystem-Philosophien verstehen

Die Config-Pfad-Erkennung spiegelt unterschiedliche System-Philosophien wider:

BSD-Ansatz (OpenBSD)

OpenBSD trennt strikt zwischen Base-System (/etc) und Third-Party-Software (/usr/local/etc). Diese Separation verhindert Konflikte bei System-Updates und hält die Base-System-Konfiguration sauber.

# OpenBSD
CONFIG_FILE="/usr/local/etc/furt/furt.conf"

Die /usr/local/-Hierarchie überlebt System-Upgrades und ermöglicht klare Trennung zwischen Betriebssystem- und Anwendungs-Konfiguration.

Linux-Ansatz (Debian, Arch, etc.)

Linux-Distributionen verwenden meist /etc für alle Konfigurationsdateien unabhängig von der Installationsquelle. Package-Manager koordinieren zwischen verschiedenen Software-Quellen in einem gemeinsamen Namespace.

# Linux
CONFIG_FILE="/etc/furt/furt.conf"

Diese Konvention macht alle System-Konfiguration zentral auffindbar und integriert sich nahtlos in etablierte Admin-Workflows.

Validierungs-Strategien verstehen

Das Script implementiert eine pragmatische Validierungs-Pipeline die auf häufige Konfigurationsfehler abzielt:

INI-Format-Validierung: Grep-basierte Suche nach Section-Headers vermeidet komplexe Parser-Dependencies. Die Regex-Patterns sind POSIX-kompatibel für maximale Portabilität.

Server-Parameter-Checks: Explizite Prüfung auf port und host Einstellungen da diese für die Server-Funktionalität kritisch sind.

API-Key-Warnung: Fehlende API-Keys werden als Warning behandelt statt Error da furt theoretisch ohne sie starten könnte - aber praktisch nutzlos wäre.

Permission-Monitoring: Config-Dateien enthalten SMTP-Passwörter und API-Keys. Zu offene Berechtigungen werden gewarnt aber blockieren nicht den Service-Start.

Script praktisch nutzen

Als Teil der Installation

# Orchestrierter Aufruf durch install.sh
./install.sh
# [INFO] Phase 5: Validating configuration... OK

Das Orchestrator-Script ruft validate-config.sh nach der Config-Installation auf um sicherzustellen dass die Standard-Konfiguration syntaktisch korrekt ist.

Manuelle Validierung nach Config-Änderungen

# Nach Bearbeitung von furt.conf
sudo ./scripts/validate-config.sh

Ausgabe zeigt den Validierungserfolg:

Validating configuration: /usr/local/etc/furt/furt.conf
Configuration validation completed

Integration in Service-Restart-Workflow

# Sichere Config-Updates
sudo ./scripts/validate-config.sh && sudo rcctl restart furt

Diese Kombination verhindert Service-Ausfälle durch defekte Konfiguration.

Development-Testing

# Config-Syntax nach Änderungen prüfen
vim /usr/local/etc/furt/furt.conf
./scripts/validate-config.sh

Installation validieren

Nach der Script-Ausführung kannst du die Config-Datei direkt prüfen:

# Strukturelle Validierung
grep '^\[' /usr/local/etc/furt/furt.conf
grep '^port' /usr/local/etc/furt/furt.conf
grep '^host' /usr/local/etc/furt/furt.conf

# Berechtigungen prüfen
ls -la /usr/local/etc/furt/furt.conf

Korrekte Konfiguration zeigt die erwarteten Abschnitte und angemessene Berechtigungen:

[server]
[smtp_default]
[api_key "example-key"]
-rw-r----- 1 root _furt 2048 furt.conf

Troubleshooting

"Configuration file not found"

Error: Configuration file not found: /etc/furt/furt.conf

Die Config-Datei wurde nicht installiert oder liegt am falschen Ort:

# Prüfe alternative Pfade
ls -la /usr/local/etc/furt/furt.conf  # OpenBSD
ls -la /etc/furt/furt.conf            # Linux

# Config aus Example erstellen
cp /usr/local/share/furt/config/furt.conf.example /etc/furt/furt.conf

"[server] section missing"

Error: [server] section missing in config

Die Config-Datei ist unvollständig oder beschädigt:

# Grundstruktur prüfen
head -20 /usr/local/etc/furt/furt.conf

# Example-Config als Basis verwenden
cp /usr/local/share/furt/config/furt.conf.example /usr/local/etc/furt/furt.conf

"server port not configured"

Error: server port not configured

Der [server]-Abschnitt existiert aber die port-Zeile fehlt:

# [server]-Abschnitt überprüfen
grep -A 5 '^\[server\]' /usr/local/etc/furt/furt.conf

# Port-Zeile hinzufügen
echo "port = 7811" >> /usr/local/etc/furt/furt.conf

"No API keys configured"

Warning: No API keys configured

Dies ist eine Warnung, kein Fehler. API-Keys sind für praktische Nutzung erforderlich:

# API-Key-Abschnitt hinzufügen
cat >> /usr/local/etc/furt/furt.conf << EOF

[api_key "test-key"]
name = "Test API Key"
permissions = mail:send
allowed_ips = 127.0.0.1
mail_to = admin@example.com
mail_from = noreply@example.com
EOF

"Config file permissions too open"

Warning: Config file permissions too open (644), should be 640

Die Config-Datei ist für alle Benutzer lesbar obwohl sie Passwörter enthält:

# Berechtigungen korrigieren
chmod 640 /usr/local/etc/furt/furt.conf

# OpenBSD
chown root:_furt /usr/local/etc/furt/furt.conf

# Linux
chown root:furt /etc/furt/furt.conf

Script erweitern

Detailliertere INI-Validierung

# Validierung für fehlende Closing-Brackets
if grep -q '^\[.*[^]]$' "$CONFIG_FILE"; then
    echo "Error: Malformed section header in config"
    exit 1
fi

SMTP-Konfiguration prüfen

# Prüfe ob SMTP-Settings vorhanden sind
if ! grep -q '^\[smtp_default\]' "$CONFIG_FILE"; then
    echo "Warning: No default SMTP configuration found"
fi

Config-Backup vor Validierung

# Backup erstellen für Rollback-Möglichkeit
if [ -f "$CONFIG_FILE" ]; then
    cp "$CONFIG_FILE" "$CONFIG_FILE.backup.$(date +%Y%m%d_%H%M%S)"
fi

Syntax-Highlighting für Fehler

# Zeige problematische Zeilen mit Kontext
if ! grep -q '^port' "$CONFIG_FILE"; then
    echo "Error: server port not configured"
    echo "Expected: port = 7811"
    echo "In section: [server]"
    exit 1
fi

Das validate-config.sh Script ist ein kritischer Sicherheits-Checkpoint der verhindert dass furt mit defekter Konfiguration startet und dadurch unvorhersagbare Fehler oder Sicherheitslücken entstehen. Es balanciert gründliche Validierung mit praktischer Nutzbarkeit.