a2ensite / a2dissite
- Rust 93.4%
- Shell 6.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| common | ||
| gen-completions | ||
| nxdissite | ||
| nxensite | ||
| package | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
nxensite / nxdissite
nginx-Pendants zu Apaches a2ensite / a2dissite: aktivieren bzw.
deaktivieren einen vhost, indem in sites-enabled ein symbolischer Link auf
die zugehörige Datei in sites-available angelegt bzw. entfernt wird
(Debian/Ubuntu-Konvention für nginx; die Verzeichnisse müssen existieren und
per include /etc/nginx/sites-enabled/*; in der nginx.conf eingebunden
sein).
Das Projekt besteht aus vier Crates in einem Cargo-Workspace:
nx-tools/
├── common/ Bibliothek "nx-common" (Logik, Übersetzungen, Completion-Generatoren)
├── nxensite/ Binary: vhosts aktivieren
├── nxdissite/ Binary: vhosts deaktivieren
├── gen-completions/ Internes Build-Tool: erzeugt die Completion-Skripte für die Paketierung
└── package/ .deb-Paketierung (Kontrolldatei-Vorlagen + Build-Skript)
gen-completions wird nicht installiert – es ist ausschließlich ein
Werkzeug, das beim Bauen des .deb-Pakets aufgerufen wird (siehe unten).
Bauen
Voraussetzung: ein aktueller Rust-Toolchain (rustup / cargo, Edition 2021).
cargo build --release
Die fertigen Programme liegen danach unter target/release/nxensite und
target/release/nxdissite.
Installieren
Empfohlen wird die Installation über das .deb-Paket (siehe Abschnitt
.deb-Paket bauen weiter unten) – dabei landen die
Programme in /usr/sbin und die Shell-Completion wird automatisch mit
eingerichtet. Alternativ, z. B. zum schnellen Testen ohne Paketbau,
manuell:
sudo install -m 755 target/release/nxensite /usr/local/sbin/
sudo install -m 755 target/release/nxdissite /usr/local/sbin/
(In diesem Fall müssen die Completion-Skripte separat aus
gen-completions erzeugt und von Hand an die in der Tabelle weiter
unten genannten Pfade kopiert werden.)
Verwendung
nxensite [OPTIONEN] VHOST...
nxdissite [OPTIONEN] VHOST...
VHOST kann mit oder ohne .conf-Endung angegeben werden, mehrere vhosts
können in einem Aufruf gleichzeitig (de)aktiviert werden.
nxensite
| Option | Bedeutung |
|---|---|
-t, --test |
Nach dem Aktivieren die Syntax der nginx-Konfiguration prüfen (nginx -t). Schlägt der Test fehl, werden die soeben aktivierten vhosts automatisch wieder deaktiviert. |
-a, --auto |
Nach erfolgreichem Syntaxtest automatisch nginx neu laden (impliziert -t). |
--list-available |
Alle in sites-available vorhandenen vhosts auflisten (eine pro Zeile), keine root-Rechte nötig. Wird intern von der Shell-Completion genutzt. |
-h, --help |
Hilfe anzeigen. |
-V, --version |
Version anzeigen. |
Beispiele:
sudo nxensite example.com # nur aktivieren
sudo nxensite -t example.com # aktivieren + Syntax prüfen
sudo nxensite -a example.com other.com # aktivieren, prüfen, bei Erfolg neu laden
nxdissite
| Option | Bedeutung |
|---|---|
--list-enabled |
Alle aktuell aktivierten vhosts auflisten (eine pro Zeile), keine root-Rechte nötig. Wird intern von der Shell-Completion genutzt. |
-h, --help |
Hilfe anzeigen. |
-V, --version |
Version anzeigen. |
Beispiel:
sudo nxdissite example.com other.com
nxdissite entfernt nur den Symlink in sites-enabled; die Datei in
sites-available bleibt erhalten (wie bei a2dissite).
Root-Rechte
Das tatsächliche Aktivieren/Deaktivieren erfordert root-Rechte (euid 0);
ohne diese wird eine lokalisierte Fehlermeldung ausgegeben und mit
Exitcode 77 (EX_NOPERM) beendet. --help, --version,
--list-available und --list-enabled funktionieren bewusst auch ohne
root, damit z. B. die Shell-Completion für normale Benutzer nutzbar
ist.
Exitcodes
Beide Programme verwenden an sysexits.h angelehnte Exitcodes:
| Code | Bedeutung |
|---|---|
| 0 | Erfolg |
| 64 | Fehlerhafte Aufrufsyntax (z. B. kein vhost angegeben) |
| 66 | vhost-Konfiguration nicht gefunden / nicht aktiviert |
| 69 | sites-available/sites-enabled existiert nicht |
| 71 | Reload von nginx fehlgeschlagen |
| 73 | Symlink konnte nicht erstellt/entfernt werden |
| 77 | Keine root-Rechte |
| 78 | nginx -t-Syntaxtest fehlgeschlagen (nur nxensite -t) |
Mehrsprachige Meldungen
Alle Ausgaben (Meldungen, Hilfetexte, Beschreibungen) liegen in der
Bibliothek nx-common übersetzt vor für: Englisch (Fallback), Deutsch,
Französisch, Spanisch, Italienisch, Portugiesisch, Russisch, Chinesisch,
Japanisch und Arabisch. Die Sprache wird aus den POSIX-Locale-
Umgebungsvariablen ermittelt, in dieser Priorität: LC_ALL,
LC_MESSAGES, LANGUAGE, LANG.
Dynamische Shell-Completion
Beide Programme haben selbst keine --completion-Option mehr. Die
Completion-Skripte für bash, zsh und fish werden stattdessen einmalig
beim Bau des .deb-Pakets erzeugt (siehe unten) und landen als normale
Dateien an den von der jeweiligen Shell automatisch durchsuchten
Standardpfaden:
| Shell | Installationspfad |
|---|---|
| bash | /usr/share/bash-completion/completions/nxensite bzw. nxdissite |
| zsh | /usr/share/zsh/vendor-completions/_nxensite bzw. _nxdissite |
| fish | /usr/share/fish/vendor_completions.d/nxensite.fish bzw. nxdissite.fish |
Sie bleiben dabei inhaltlich dynamisch: statt eine beim Paketbau
eingefrorene Liste zu enthalten, rufen sie bei jedem Tab das
jeweilige Programm erneut mit der (nun regulären, sichtbaren) Option
--list-available bzw. --list-enabled auf, die die aktuell
vorhandenen bzw. aktivierten vhosts live aus dem Dateisystem ausliest.
nxensite <Tab> schlägt also immer die tatsächlich vorhandenen, noch
nicht aktivierten Konfigurationsdateien vor – ganz ohne erneuten
Bau/Neuinstallation des Pakets, wenn sich vhosts ändern.
Erzeugt werden diese Skripte durch das interne, nicht installierte
Hilfsprogramm gen-completions, das die vorhandenen
Generator-Funktionen aus nx-common::completion aufruft (dieselbe
Bibliothek, die auch nxensite/nxdissite selbst nutzen).
.deb-Paket bauen
Voraussetzungen auf dem Baurechner: cargo/rustc sowie die
Debian-Standardwerkzeuge dpkg-deb, dpkg und gzip.
package/build-deb.sh
Das Skript
- baut den gesamten Workspace (
cargo build --release --workspace), - lässt
gen-completionsdie sechs Completion-Skripte erzeugen, - stellt eine Paketwurzel mit
nxensite/nxdissitein/usr/sbin, den Completion-Skripten an ihren Standardpfaden sowieREADME.md/copyright/changelog.Debian.gzunter/usr/share/doc/nginx-vhost-toolszusammen, - schreibt
DEBIAN/control(Version wird automatisch ausnxensite/Cargo.tomlübernommen, Architektur überdpkg --print-architectureerkannt), - baut daraus mit
dpkg-deb --builddie Dateidist/nginx-vhost-tools_<version>_<arch>.deb.
Der Maintainer-Eintrag lässt sich per Umgebungsvariable anpassen:
DEB_MAINTAINER="Max Mustermann <max@example.org>" package/build-deb.sh
Installieren
sudo dpkg -i dist/nginx-vhost-tools_0.1.0_amd64.deb
# falls dabei Abhängigkeiten fehlen sollten:
sudo apt-get install -f
Beim Installieren legt dpkg die Programme und die Completion-Skripte
einfach an den vorgesehenen Pfaden ab; ein postinst-Skript ist dafür
nicht nötig, da bash-completion, zsh und fish diese Standardpfade von
sich aus durchsuchen (bash benötigt dafür das separate Paket
bash-completion, das deshalb als Suggests eingetragen ist; nginx
ist als Recommends eingetragen, da -t/-a ohne installiertes
nginx-Binary naturgemäß fehlschlagen).
Konfigurationspfad anpassen
Standardmäßig werden /etc/nginx/sites-available und
/etc/nginx/sites-enabled verwendet. Über die Umgebungsvariable
NX_CONF_DIR lässt sich das Basisverzeichnis überschreiben (z. B. für
Tests):
NX_CONF_DIR=/tmp/nginx-test nxensite -t example.com
Hinweis zum Build in dieser Umgebung
Der Quellcode wurde in dieser Sandbox ohne Netzwerkzugriff und ohne
installierten Rust-Toolchain erstellt/geändert und konnte hier daher
weder mit cargo build noch mit package/build-deb.sh durchlaufen
werden. Struktur und Klammerung wurden statisch geprüft; bitte nach dem
Herunterladen cargo build --release --workspace und danach
package/build-deb.sh ausführen und mir eventuelle Fehler mitteilen,
falls welche auftreten sollten.