validate config sh hinzugefügt
parent
e112537164
commit
381cdb1933
1 changed files with 249 additions and 0 deletions
249
validate-config-sh.md
Normal file
249
validate-config-sh.md
Normal file
|
|
@ -0,0 +1,249 @@
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# Sichere Config-Updates
|
||||||
|
sudo ./scripts/validate-config.sh && sudo rcctl restart furt
|
||||||
|
```
|
||||||
|
|
||||||
|
Diese Kombination verhindert Service-Ausfälle durch defekte Konfiguration.
|
||||||
|
|
||||||
|
### Development-Testing
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
```bash
|
||||||
|
# [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:
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```bash
|
||||||
|
# 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.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue