Server Tools v2 folgt dem Composable Building Blocks Pattern: Jede Library besteht aus atomaren Funktionen (Building Blocks), die von High-Level-Operationen komponiert werden. Das VHost-Modul ist zusätzlich webserver-agnostisch aufgebaut: vhost.sh enthält Validierung, Rollback und Logging, während die Apache- bzw. Nginx-spezifischen Mechaniken (Config-Syntax, Site aktivieren/deaktivieren, Reload) in eigene Backend-Module ausgelagert und zur Laufzeit über $ST_WEBSERVER angesprochen werden.
| Schicht | Module | Aufgabe |
|---|---|---|
| Foundation | core, config, security | Logging, Konfiguration, Input-Validierung |
| Infrastructure | backup, install | Backup-Erstellung, System-Install/-Uninstall |
| Services | database, vhost, ssl, cron, firewall, fail2ban, log, status, user | Fachliche Operationen |
| Webserver Backend | webserver/apache, webserver/nginx | Config-Generierung, Site-Aktivierung, Reload - dispatched über $ST_WEBSERVER |
| Interface | cli, menu | Benutzer-Interaktion (CLI oder TUI) |
Am Beispiel von database.sh:
Building Blocks sind reine Funktionen ohne Seiteneffekte (kein Logging, keine Validierung). High-Level-Operationen fügen Validierung, Logging und Rollback hinzu. Das macht die Blocks einzeln testbar und wiederverwendbar.
Jede webserver-spezifische Operation läuft über _ws_dispatch <funktion> <args>, das zur Laufzeit anhand von $ST_WEBSERVER an apache_<funktion> oder nginx_<funktion> weiterreicht:
SSL/Certbot-Verwaltung und
vhost auditsind aktuell Apache-spezifisch implementiert. Auf Nginx-Backends melden diese Befehle einen klaren Hinweis statt eines Fehlers, führen aber keine Aktion aus.
server-tools-v2/
├── bin/
│ └── server-tools # Entry Point (~300 LOC)
├── lib/
│ ├── core.sh # Logging, Fehlerbehandlung, Dependencies
│ ├── config.sh # Konfiguration, Defaults, Validierung
│ ├── security.sh # Input-Validierung, Escaping, Audit
│ ├── backup.sh # Backup-Erstellung und Cleanup
│ ├── install.sh # System-Install/-Uninstall (eine Implementierung für make + bin/server-tools)
│ ├── database.sh # MySQL CRUD
│ ├── vhost.sh # VHost-Orchestrierung (webserver-agnostisch)
│ ├── webserver/
│ │ ├── apache.sh # Apache-Backend: Config, a2en*/a2dis*, Reload
│ │ └── nginx.sh # Nginx-Backend: Config, Site-Symlinks, Reload
│ ├── ssl.sh # Let's Encrypt, Wildcard-SSL (Apache-only)
│ ├── cron.sh # Cronjob-Verwaltung via /etc/cron.d
│ ├── firewall.sh # UFW Firewall
│ ├── fail2ban.sh # Fail2Ban Jails
│ ├── log.sh # Log-Viewer
│ ├── status.sh # Service-Status, Systemressourcen
│ ├── user.sh # Per-Domain SSH User Management
│ ├── cli.sh # CLI-Interface
│ └── menu.sh # TUI-Interface
├── conf/
│ └── server-tools.conf.example # Config-Template
├── tests/
│ ├── test_helper.bash # BATS-Helper mit Mock-System
│ └── unit/ # 17 Test-Dateien, 510 Tests
├── .github/workflows/
│ └── ci.yml # CI: ShellCheck + shfmt + BATS + Install-Smoke-Test
├── Makefile
├── README.md
├── CHANGELOG.md
└── CONTRIBUTING.md
Jedes Modul schützt sich gegen mehrfaches Laden:
[[ -n "${_DATABASE_SOURCED:-}" ]] && return
_DATABASE_SOURCED=1
| Exit Code | Bedeutung |
|---|---|
| 0 | Erfolgreich |
| 1 | Allgemeiner Fehler / Validierung fehlgeschlagen |
Server Tools nutzt
set -euo pipefailim Entry Point. Alle Fehler führen überdie()zu Exit Code 1 mit Logging.
Tests verwenden BATS (Bash Automated Testing System) mit:
bats-support - Basis-Assertionsbats-assert - Erweiterte Assertionsbats-file - Datei-Assertions510 Tests in 17 Dateien decken alle Module ab:
| Testdatei | Thema |
|---|---|
cli.bats |
CLI Argument Parsing, Routing, Help-Texte |
install.bats |
install_tools/uninstall_tools: Pfade, Shortcuts, .version-Marker, Sicherheits-Guards |
database.bats |
MySQL Building Blocks, Credentials, Validation |
security.bats |
Input-Validierung (alle 13 Typen), Escaping, Audit, Password |
vhost.bats |
VHost-Orchestrierung, Redirects, Validation |
webserver_apache.bats |
Apache-Backend: Config-Generierung, Site-Aktivierung, Audit |
webserver_nginx.bats |
Nginx-Backend: Config-Generierung, Site-Symlinks |
vhost_webserver_router.bats |
_ws_dispatch-Routing zwischen Apache und Nginx |
ssl.bats |
Certbot-Integration, Wildcard, Email-Fallback |
config.bats |
Config Loading, Validation, Defaults |
backup.bats |
Backup-Erstellung, Cleanup, Auto-Backup |
core.bats |
Logging, Error Handling, Root-Check, mysql_available, mysql_bin |
cron.bats |
Cron Name Sanitizing, Content Generation, Validation |
log.bats |
tail/grep, Log-Pfade, Cross-Log-Search |
firewall.bats |
UFW-Wrapper, Port/Protocol-Validation |
fail2ban.bats |
Jail Parsing, Ban/Unban, IP-Validation |
status.bats |
Service-Checks, System-Resources |
# Alle Tests ausfuehren
make test
# Einzelnes Modul testen
bats tests/unit/database.bats
# Mit Verbose-Output
bats --verbose-run tests/unit/
Jeder Test läuft in einem isolierten TEST_TMPDIR mit gemockten System-Commands. Kein Test berührt das echte System - install.bats zum Beispiel testet die echten install_tools/uninstall_tools-Funktionen gegen einen Temp-Pfad via ST_INSTALL_DIR/ST_BIN_DIR, nicht gegen /usr/local.
Die GitHub Actions Pipeline führt bei jedem Push und Pull Request aus:
.sh-Dateien-bn -ci)sudo make install/uninstall und sudo ./bin/server-tools install/uninstall gegen echte /usr/local-Pfade, inkl. Prüfung dass --version nie unbemerkt auf dev zurückfällt| Target | Beschreibung |
|---|---|
make help |
Hilfe anzeigen |
make install |
System-weite Installation (root) - delegiert an ./bin/server-tools install |
make uninstall |
Deinstallation (root) - delegiert an ./bin/server-tools uninstall |
make setup-tests |
BATS-Dependencies installieren |
make test |
Tests ausführen |
make test-verbose |
Tests mit Trace-Output |
make lint |
ShellCheck ausführen |
make format |
shfmt Auto-Format |
make format-check |
Format-Prüfung ohne Änderungen |
make check |
lint + format-check + test |
make clean |
Test-Artefakte entfernen |