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

setup-directories.sh

Verzeichnisstruktur für furt automatisch erstellen

Getestet unter

  • OpenBSD 7.7
  • Debian 12
  • Arch Linux

Zweck des Scripts

Das setup-directories.sh Script erstellt die komplette Verzeichnisstruktur für furt mit korrekten betriebssystem-spezifischen Pfaden und Berechtigungen. Es behandelt Config-Verzeichnisse, Share-Dateien, Log-Verzeichnisse und PID-Files konsistent zwischen verschiedenen Systemen.

Das Script eliminiert manuelles Erstellen von Verzeichnissen und stellt sicher dass furt alle benötigten Pfade mit korrekten Berechtigungen zur Verfügung hat.

Wie das Script funktioniert

Das Script erkennt das Betriebssystem und wählt die passenden Standard-Pfade:

if [ "$(uname)" = "OpenBSD" ]; then
    CONFIG_DIR="/usr/local/etc/furt"
    USER="_furt"
    GROUP="_furt"
else
    CONFIG_DIR="/etc/furt"
    USER="furt"
    GROUP="furt"
fi

Anschließend werden alle Verzeichnisse erstellt und kritische Pfade erhalten die richtigen Berechtigungen:

mkdir -p "$CONFIG_DIR"
mkdir -p /usr/local/share/furt
mkdir -p /var/log/furt
mkdir -p /var/run/furt

chown "$USER:$GROUP" /var/log/furt
chown "$USER:$GROUP" /var/run/furt

Das mkdir -p Flag sorgt dafür dass auch Parent-Verzeichnisse erstellt werden falls sie nicht existieren. Das macht das Script robust gegen verschiedene Ausgangszustände.

Betriebssystem-Philosophien verstehen

Die verschiedenen Verzeichnisstrukturen spiegeln unterschiedliche System-Philosophien wider:

BSD-Ansatz (OpenBSD)

BSD-Systeme bevorzugen /usr/local/ für Software die nicht Teil des Base-Systems ist. Diese klare Trennung zwischen System (/etc) und Third-Party (/usr/local/etc) verhindert Konflikte bei System-Updates.

# OpenBSD Pfade
CONFIG_DIR="/usr/local/etc/furt"
USER="_furt"

Die /usr/local/-Hierarchie bleibt bei System-Updates unberührt und Software-Installationen überleben Betriebssystem-Upgrades ohne Probleme.

Linux-Ansatz (Debian, Arch, etc.)

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

# Linux Pfade
CONFIG_DIR="/etc/furt"
USER="furt"

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

Verzeichnis-Zwecke verstehen

Jedes erstellte Verzeichnis hat einen spezifischen Zweck in der furt-Architektur:

Config-Verzeichnis: Enthält furt.conf und service-spezifische Konfigurationsdateien. Root-owned, world-readable für Transparenz.

Share-Verzeichnis: /usr/local/share/furt speichert Lua-Module, Templates und statische Ressourcen. Cross-platform-Pfad für portierbare Installations.

Log-Verzeichnis: /var/log/furt gehört dem furt-User für Write-Zugriff. Structured Logging ohne Root-Rechte.

PID-Verzeichnis: /var/run/furt für Process-ID-Files und Unix-Sockets. Service-owned für sichere IPC.

Berechtigungs-Strategie

Das Script implementiert das Principle of Least Privilege:

chown "$USER:$GROUP" /var/log/furt
chown "$USER:$GROUP" /var/run/furt

Nur Verzeichnisse die Write-Zugriff benötigen werden dem Service-User übertragen. Config- und Share-Verzeichnisse bleiben Root-owned weil furt dort nur lesen muss.

Diese Strategie minimiert Schäden bei möglichen Service-Kompromittierungen - furt kann keine System-Konfiguration oder andere Services beeinflussen.

Script praktisch nutzen

Standard-Installation

# Nach setup-user.sh ausführen
sudo ./scripts/setup-directories.sh

Ausgabe bestätigt die erstellte Struktur:

Created directories:
  Config: /usr/local/etc/furt
  Share: /usr/local/share/furt
  Logs: /var/log/furt (owned by _furt)
  PID: /var/run/furt (owned by _furt)

Als Teil der orchestrierten Installation

./install.sh
# [INFO] Phase 2: Creating directory structure... OK

Das Orchestrator-Script ruft setup-directories.sh nach der Benutzer-Erstellung auf damit die chown-Operationen funktionieren.

Development-Setup

# Verzeichnisse für lokale Tests vorbereiten
sudo ./scripts/setup-directories.sh
# ... furt entwickeln und testen ...

Installation validieren

Nach der Script-Ausführung kannst du die Verzeichnisstruktur prüfen:

# Verzeichnisse existieren?
ls -la /usr/local/etc/furt/
ls -la /var/log/furt/
ls -la /var/run/furt/

# Berechtigungen korrekt?
stat -c "%U:%G %a %n" /var/log/furt
stat -c "%U:%G %a %n" /var/run/furt

Korrekte Ausgabe zeigt Service-User-Ownership:

_furt:_furt 755 /var/log/furt
_furt:_furt 755 /var/run/furt

Troubleshooting

"Permission denied" bei chown

chown: /var/log/furt: Operation not permitted

Das Script benötigt Root-Rechte für Ownership-Änderungen:

sudo ./scripts/setup-directories.sh    # Linux
doas ./scripts/setup-directories.sh    # OpenBSD

"No such user" Fehler

chown: invalid user: 'furt'

Das setup-user.sh Script muss vor setup-directories.sh ausgeführt werden:

sudo ./scripts/setup-user.sh      # Erst Benutzer erstellen
sudo ./scripts/setup-directories.sh  # Dann Verzeichnisse

Verzeichnisse bereits vorhanden

Das Script überschreibt keine bestehenden Verzeichnisse aber ändert Berechtigungen. Bei manuell erstellten Verzeichnissen mit falschen Permissions wird das korrigiert.

Falsche Config-Pfade

Wenn furt die Konfiguration nicht findet, prüfe die Pfad-Erkennung:

uname  # Sollte "OpenBSD" oder "Linux" zurückgeben

Script erweitern

Zusätzliche Verzeichnisse

# Service-spezifische Verzeichnisse hinzufügen
mkdir -p /var/lib/furt/cache
mkdir -p /var/lib/furt/sessions
chown "$USER:$GROUP" /var/lib/furt/cache
chown "$USER:$GROUP" /var/lib/furt/sessions

Custom Config-Pfade

# Unterstützung für alternative Installations-Prefixes
PREFIX="${PREFIX:-/usr/local}"
CONFIG_DIR="$PREFIX/etc/furt"
SHARE_DIR="$PREFIX/share/furt"

Das setup-directories.sh Script schafft eine konsistente, sichere Verzeichnisstruktur die sich nahtlos in verschiedene Betriebssysteme integriert und dabei bewährte Admin-Praktiken respektiert.