diff --git a/README.md b/README.md index 3c893bf..30e57a0 100644 --- a/README.md +++ b/README.md @@ -94,15 +94,16 @@ docker run --rm -v "$PWD":/src -w /src -e GOOS=linux -e GOARCH=amd64 -e CGO_ENAB # Binary auf dem Server installieren sudo ./adguard-shield install # Der Installer fragt am Ende, ob AdGuard Shield direkt gestartet werden soll. +# Dabei wird der Befehl adguard-shield in /usr/local/bin registriert. # Konfiguration anpassen (mindestens API-Zugangsdaten und Whitelist) sudo nano /opt/adguard-shield/adguard-shield.conf # API-Verbindung testen -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test # Dry-Run: loggt Erkennungen, sperrt aber nicht -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run # Service starten und prüfen sudo systemctl start adguard-shield @@ -110,6 +111,7 @@ sudo systemctl status adguard-shield ``` > Beim Installieren wird der systemd-Service für den Autostart registriert und am Ende nach dem direkten Start gefragt. Die Go-Version nutzt `Restart=on-failure`; einen separaten Watchdog-Timer wie in der alten Shell-Version gibt es nicht mehr. +> Zusätzlich legt der Installer standardmäßig `/usr/local/bin/adguard-shield` als Symlink auf das installierte Binary an. Danach kannst du `sudo adguard-shield ` statt `sudo /opt/adguard-shield/adguard-shield ` verwenden. > **Bestehende Shell-Installation?** Der Go-Installer bricht ab und meldet die gefundenen Script-Artefakte. Die alte Version muss zuerst deinstalliert werden (Konfiguration behalten). Details unter [docs/update.md](docs/update.md). @@ -120,7 +122,7 @@ sudo systemctl status adguard-shield AdGuard Shield wird über ein einzelnes Binary bedient. Die Grundform lautet: ```bash -sudo /opt/adguard-shield/adguard-shield +sudo adguard-shield ``` ### Installation & Updates @@ -130,9 +132,11 @@ sudo /opt/adguard-shield/adguard-shield | `install` | Binary, Konfiguration und systemd-Service installieren | | `install --skip-deps` | Installation ohne automatische Paketprüfung | | `install --no-enable` | Installation ohne systemd-Autostart | +| `install --no-register` | Installation ohne globalen CLI-Befehl in `/usr/local/bin` | | `install --config-source ` | Bestehende Konfiguration als Vorlage übernehmen | | `update` | Binary, Service und Konfiguration aktualisieren | -| `install-status` | Installationsstatus anzeigen (Binary, Service, Version) | +| `update --no-register` | Update ohne Änderung des globalen CLI-Befehls | +| `install-status` | Installationsstatus anzeigen (Binary, CLI-Befehl, Service, Version) | | `uninstall` | Vollständige Deinstallation | | `uninstall --keep-config` | Deinstallation mit Erhalt der Konfiguration | diff --git a/cmd/adguard-shieldd/main.go b/cmd/adguard-shieldd/main.go index 3558455..bff71dc 100644 --- a/cmd/adguard-shieldd/main.go +++ b/cmd/adguard-shieldd/main.go @@ -244,7 +244,11 @@ func run() error { case "report-test": return report.SendTest(ctx, cfg) case "report-install": - return report.InstallCron("/opt/adguard-shield/adguard-shield", cfg.Path, cfg) + binary := "/opt/adguard-shield/adguard-shield" + if _, err := os.Stat(installer.CLICommandPath); err == nil { + binary = installer.CLICommandPath + } + return report.InstallCron(binary, cfg.Path, cfg) case "report-remove": return report.RemoveCron() case "firewall-create": @@ -463,8 +467,8 @@ func usage() { Nutzung: adguard-shield version - adguard-shield install [--config-source PATH] [--skip-deps] - adguard-shield update [--config-source PATH] [--skip-deps] + adguard-shield install [--config-source PATH] [--skip-deps] [--no-register] + adguard-shield update [--config-source PATH] [--skip-deps] [--no-register] adguard-shield uninstall [--keep-config] adguard-shield install-status adguard-shield [-config PATH] run|start|stop|dry-run @@ -653,9 +657,11 @@ func parseInstallFlags(name string, args []string) (installer.Options, error) { fs.StringVar(&opts.ConfigSource, "config-source", "", "Konfiguration fuer Neuinstallation uebernehmen") fs.BoolVar(&opts.SkipDeps, "skip-deps", false, "Paketpruefung ueberspringen") noEnable := fs.Bool("no-enable", false, "systemd Autostart nicht aktivieren") + noRegister := fs.Bool("no-register", false, "CLI-Befehl nicht in /usr/local/bin registrieren") if err := fs.Parse(args); err != nil { return opts, err } opts.Enable = !*noEnable + opts.RegisterCLI = !*noRegister return opts, nil } diff --git a/docs/README.md b/docs/README.md index b6fb880..0ed583d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,6 +25,12 @@ Die Go-Version bündelt alle Aufgaben in einem einzelnen Binary: /opt/adguard-shield/adguard-shield ``` +Bei Installation und Update wird zusätzlich ein Symlink in den üblichen PATH gelegt: + +```text +/usr/local/bin/adguard-shield -> /opt/adguard-shield/adguard-shield +``` + Dieses Binary ist gleichzeitig: - **Daemon** für den produktiven Betrieb (Querylog-Polling, Erkennung, Sperren) @@ -33,10 +39,10 @@ Dieses Binary ist gleichzeitig: - **Report-Generator** für HTML- und Text-Reports - **Hintergrundprozess** für externe Whitelist, externe Blocklist, GeoIP und Offense-Cleanup -Die meisten Befehle beginnen daher mit: +Die meisten Befehle beginnen daher nach der Installation mit: ```bash -sudo /opt/adguard-shield/adguard-shield +sudo adguard-shield ``` Für Installation oder Update nutzt du das neue Binary aus dem Repository, Release oder Build-Verzeichnis: diff --git a/docs/befehle.md b/docs/befehle.md index ed997a2..d5a511b 100644 --- a/docs/befehle.md +++ b/docs/befehle.md @@ -6,18 +6,24 @@ AdGuard Shield wird in der Go-Version über ein einzelnes Binary bedient: /opt/adguard-shield/adguard-shield ``` -Dieses Binary ist Daemon, CLI, Installer, Updater, Uninstaller und Report-Generator. Dadurch gibt es keine getrennten Shell-Skripte mehr. +Bei Installation und Update registriert der Installer zusätzlich den globalen Befehl: + +```bash +/usr/local/bin/adguard-shield +``` + +Dieser Symlink zeigt auf das installierte Binary. Dadurch gibt es keine getrennten Shell-Skripte mehr, und du kannst AdGuard Shield nach der Installation ohne vollständigen Pfad aufrufen. ## Grundform ```bash -sudo /opt/adguard-shield/adguard-shield +sudo adguard-shield ``` Wenn du eine andere Konfigurationsdatei verwenden möchtest, muss `-config` direkt vor dem Befehl stehen: ```bash -sudo /opt/adguard-shield/adguard-shield -config /pfad/zur/adguard-shield.conf status +sudo adguard-shield -config /pfad/zur/adguard-shield.conf status ``` ### Standardpfade @@ -25,6 +31,7 @@ sudo /opt/adguard-shield/adguard-shield -config /pfad/zur/adguard-shield.conf st | Datei | Pfad | |---|---| | Binary | `/opt/adguard-shield/adguard-shield` | +| CLI-Befehl | `/usr/local/bin/adguard-shield` | | Konfiguration | `/opt/adguard-shield/adguard-shield.conf` | | SQLite-Datenbank | `/var/lib/adguard-shield/adguard-shield.db` | | Logdatei | `/var/log/adguard-shield.log` | @@ -34,13 +41,13 @@ sudo /opt/adguard-shield/adguard-shield -config /pfad/zur/adguard-shield.conf st ```bash # Version anzeigen -/opt/adguard-shield/adguard-shield version +adguard-shield version # Installation und Update sudo ./adguard-shield install sudo ./adguard-shield update -sudo ./adguard-shield install-status -sudo /opt/adguard-shield/adguard-shield uninstall --keep-config +sudo adguard-shield install-status +sudo adguard-shield uninstall --keep-config # Service-Management über systemd sudo systemctl start adguard-shield @@ -49,16 +56,16 @@ sudo systemctl restart adguard-shield sudo systemctl status adguard-shield # Diagnose und Monitoring -sudo /opt/adguard-shield/adguard-shield test -sudo /opt/adguard-shield/adguard-shield status -sudo /opt/adguard-shield/adguard-shield live -sudo /opt/adguard-shield/adguard-shield history 100 -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 +sudo adguard-shield test +sudo adguard-shield status +sudo adguard-shield live +sudo adguard-shield history 100 +sudo adguard-shield logs --level warn --limit 100 # Manuelle Eingriffe -sudo /opt/adguard-shield/adguard-shield ban 192.168.1.100 -sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100 -sudo /opt/adguard-shield/adguard-shield flush +sudo adguard-shield ban 192.168.1.100 +sudo adguard-shield unban 192.168.1.100 +sudo adguard-shield flush ``` --- @@ -71,6 +78,12 @@ Das installierte Binary landet standardmäßig unter: /opt/adguard-shield/adguard-shield ``` +Zusätzlich wird standardmäßig dieser CLI-Befehl angelegt: + +```text +/usr/local/bin/adguard-shield -> /opt/adguard-shield/adguard-shield +``` + ### Standardinstallation ```bash @@ -87,6 +100,7 @@ Am Ende fragt der Installer, ob AdGuard Shield direkt gestartet oder neu gestart | `--config-source ` | Bestehende Konfigurationsdatei als Vorlage übernehmen | | `--skip-deps` | Automatische Paketprüfung und -installation überspringen | | `--no-enable` | systemd-Autostart nicht aktivieren | +| `--no-register` | Globalen CLI-Befehl `/usr/local/bin/adguard-shield` nicht anlegen | | `--install-dir ` | Abweichendes Installationsverzeichnis verwenden | **Beispiele:** @@ -98,6 +112,9 @@ sudo ./adguard-shield install --config-source ./adguard-shield.conf # Ohne Paketprüfung installieren sudo ./adguard-shield install --skip-deps +# Ohne globalen CLI-Befehl installieren +sudo ./adguard-shield install --no-register + # In anderes Verzeichnis installieren sudo ./adguard-shield install --install-dir /opt/adguard-shield-test ``` @@ -113,11 +130,12 @@ Der Installer führt diese Schritte automatisch durch: | 3 | Installation fehlender Abhängigkeiten über `apt-get` (sofern möglich) | | 4 | Anlage von Installations- und State-Verzeichnissen | | 5 | Kopieren des Binarys nach `/opt/adguard-shield/` | -| 6 | Anlage oder Migration der Konfiguration | -| 7 | Schreiben der systemd-Unit | -| 8 | `systemctl daemon-reload` | -| 9 | Optional: Autostart aktivieren | -| 10 | Nachfrage: Service direkt starten oder neu starten | +| 6 | CLI-Befehl `/usr/local/bin/adguard-shield` registrieren (sofern nicht `--no-register`) | +| 7 | Report-Templates installieren | +| 8 | Anlage oder Migration der Konfiguration | +| 9 | Schreiben der systemd-Unit | +| 10 | `systemctl daemon-reload` und optional Autostart aktivieren | +| 11 | Nachfrage: Service direkt starten oder neu starten | ### Benötigte Systembefehle @@ -149,9 +167,16 @@ Am Ende fragt der Updater, ob AdGuard Shield direkt neu gestartet werden soll. sudo ./adguard-shield update --config-source ./adguard-shield.conf ``` +### Update ohne CLI-Registrierung + +```bash +sudo ./adguard-shield update --no-register +``` + ### Was beim Update passiert - Die Installation wird wie bei `install` aktualisiert +- Der CLI-Befehl `/usr/local/bin/adguard-shield` wird angelegt oder bestätigt, sofern `--no-register` nicht gesetzt ist - Vorhandene Konfiguration bleibt erhalten - Neue Konfigurationsparameter werden ergänzt - Bei einer Migration wird `adguard-shield.conf.old` geschrieben @@ -164,13 +189,14 @@ Weitere Details stehen in der [Update-Anleitung](update.md). ## Installationsstatus ```bash -sudo ./adguard-shield install-status +sudo adguard-shield install-status ``` Zeigt eine Übersicht mit: - Installationspfad und Binary-Status - Installierte Version +- CLI-Befehl in `/usr/local/bin` vorhanden - Konfiguration vorhanden - systemd-Service vorhanden und Status - Autostart aktiv @@ -188,10 +214,10 @@ sudo ./adguard-shield install-status --install-dir /opt/adguard-shield-test ```bash # Vollständige Deinstallation -sudo /opt/adguard-shield/adguard-shield uninstall +sudo adguard-shield uninstall # Deinstallation mit Konfigurationserhalt -sudo /opt/adguard-shield/adguard-shield uninstall --keep-config +sudo adguard-shield uninstall --keep-config ``` **Was bei der Deinstallation passiert:** @@ -275,19 +301,19 @@ Für Debugging oder Dry-Run kann der Daemon im Vordergrund gestartet werden: ```bash # Normaler Vordergrundlauf -sudo /opt/adguard-shield/adguard-shield run +sudo adguard-shield run # Alias für run -sudo /opt/adguard-shield/adguard-shield start +sudo adguard-shield start # Analysieren ohne echte Sperren -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run ``` ### Daemon über PID-Datei stoppen ```bash -sudo /opt/adguard-shield/adguard-shield stop +sudo adguard-shield stop ``` Für den Alltag gilt: Nutze `systemctl`. Der direkte Vordergrundlauf endet, sobald die Shell beendet wird oder du `Strg+C` drückst. @@ -297,7 +323,7 @@ Für den Alltag gilt: Nutze `systemctl`. Der direkte Vordergrundlauf endet, soba ## API-Test ```bash -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test ``` Der `test`-Befehl prüft die Verbindung zur AdGuard-Home-API: @@ -322,7 +348,7 @@ Wenn der Test fehlschlägt, zuerst die Konfiguration und die AdGuard-Home-Webobe ## Status ```bash -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield status ``` Zeigt eine Übersicht des aktuellen Zustands: @@ -341,7 +367,7 @@ Bei sehr vielen aktiven Sperren werden nur die ersten 50 angezeigt. Für Details ## Live-Ansicht ```bash -sudo /opt/adguard-shield/adguard-shield live +sudo adguard-shield live ``` Die `live`-Ansicht ist das beste Werkzeug, wenn du verstehen möchtest, was gerade passiert. Sie zeigt in Echtzeit: @@ -371,7 +397,7 @@ Die `live`-Ansicht ist das beste Werkzeug, wenn du verstehen möchtest, was gera ### Alias ```bash -sudo /opt/adguard-shield/adguard-shield watch +sudo adguard-shield watch ``` --- @@ -380,10 +406,10 @@ sudo /opt/adguard-shield/adguard-shield watch ```bash # Letzte 50 Einträge (Standard) -sudo /opt/adguard-shield/adguard-shield history +sudo adguard-shield history # Letzte 200 Einträge -sudo /opt/adguard-shield/adguard-shield history 200 +sudo adguard-shield history 200 ``` Die History kommt aus der SQLite-Tabelle `ban_history`. @@ -432,16 +458,16 @@ AdGuard Shield schreibt Daemon-Ereignisse in `LOG_FILE`, standardmäßig: ```bash # Letzte INFO/WARN/ERROR-Einträge -sudo /opt/adguard-shield/adguard-shield logs +sudo adguard-shield logs # Letzte 100 Warnungen und Fehler -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 +sudo adguard-shield logs --level warn --limit 100 # Kurzform (Level als Argument) -sudo /opt/adguard-shield/adguard-shield logs debug +sudo adguard-shield logs debug # Laufende Ansicht (wie tail -f) -sudo /opt/adguard-shield/adguard-shield logs-follow --level info +sudo adguard-shield logs-follow --level info ``` ### Erlaubte Log-Level @@ -469,7 +495,7 @@ sudo journalctl -u adguard-shield --no-pager -n 100 ### IP permanent sperren ```bash -sudo /opt/adguard-shield/adguard-shield ban 192.168.1.100 +sudo adguard-shield ban 192.168.1.100 ``` Legt eine manuelle permanente Sperre an. Die IP wird sofort in die Firewall eingetragen. @@ -477,7 +503,7 @@ Legt eine manuelle permanente Sperre an. Die IP wird sofort in die Firewall eing ### IP entsperren ```bash -sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100 +sudo adguard-shield unban 192.168.1.100 ``` Entfernt die IP aus Firewall und Datenbank. Funktioniert für alle Sperrtypen (automatisch, manuell, GeoIP, Blocklist). @@ -485,7 +511,7 @@ Entfernt die IP aus Firewall und Datenbank. Funktioniert für alle Sperrtypen (a ### Alle Sperren aufheben ```bash -sudo /opt/adguard-shield/adguard-shield flush +sudo adguard-shield flush ``` Hebt alle aktiven Sperren auf. Bei aktivierten Benachrichtigungen wird eine zusammenfassende Meldung gesendet, nicht eine Nachricht pro IP. @@ -499,7 +525,7 @@ Hebt alle aktiven Sperren auf. Bei aktivierten Benachrichtigungen wird eine zusa ### Offense-Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield offense-status +sudo adguard-shield offense-status ``` Zeigt die Gesamtzahl der Offense-Zähler, davon abgelaufene, und die Konfiguration. @@ -507,19 +533,19 @@ Zeigt die Gesamtzahl der Offense-Zähler, davon abgelaufene, und die Konfigurati ### Abgelaufene Zähler entfernen ```bash -sudo /opt/adguard-shield/adguard-shield offense-cleanup +sudo adguard-shield offense-cleanup ``` ### Alle Offense-Zähler zurücksetzen ```bash -sudo /opt/adguard-shield/adguard-shield reset-offenses +sudo adguard-shield reset-offenses ``` ### Zähler für eine IP zurücksetzen ```bash -sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100 +sudo adguard-shield reset-offenses 192.168.1.100 ``` ### Typischer Ablauf nach Fehlkonfiguration @@ -528,10 +554,10 @@ Wenn ein Client fälschlicherweise eskaliert wurde: ```bash # Sperre aufheben -sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100 +sudo adguard-shield unban 192.168.1.100 # Offense-Zähler zurücksetzen -sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100 +sudo adguard-shield reset-offenses 192.168.1.100 # IP dauerhaft in Whitelist aufnehmen (in adguard-shield.conf) # WHITELIST="127.0.0.1,::1,192.168.1.100" @@ -545,13 +571,13 @@ sudo systemctl restart adguard-shield ### Chain und ipsets anlegen ```bash -sudo /opt/adguard-shield/adguard-shield firewall-create +sudo adguard-shield firewall-create ``` ### Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield firewall-status +sudo adguard-shield firewall-status ``` Zeigt die aktuelle Firewall-Struktur: Chain, ipsets und eingehängte Regeln. @@ -559,7 +585,7 @@ Zeigt die aktuelle Firewall-Struktur: Chain, ipsets und eingehängte Regeln. ### ipsets leeren ```bash -sudo /opt/adguard-shield/adguard-shield firewall-flush +sudo adguard-shield firewall-flush ``` Entfernt alle IPs aus den ipsets. Die Firewall-Struktur (Chain, Regeln) bleibt bestehen. @@ -567,13 +593,13 @@ Entfernt alle IPs aus den ipsets. Die Firewall-Struktur (Chain, Regeln) bleibt b ### Chain und ipsets vollständig entfernen ```bash -sudo /opt/adguard-shield/adguard-shield firewall-remove +sudo adguard-shield firewall-remove ``` ### Firewall-Regeln sichern ```bash -sudo /opt/adguard-shield/adguard-shield firewall-save +sudo adguard-shield firewall-save ``` Speichert die aktuellen Regeln nach: @@ -586,7 +612,7 @@ Speichert die aktuellen Regeln nach: ### Gesicherte Regeln wiederherstellen ```bash -sudo /opt/adguard-shield/adguard-shield firewall-restore +sudo adguard-shield firewall-restore ``` **Hinweis:** Normalerweise musst du diese Befehle nicht manuell ausführen. Der Daemon erstellt die Firewall beim Start und schreibt aktive Sperren aus SQLite wieder hinein. Welche Host-Chain genutzt wird, hängt von `FIREWALL_MODE` ab. Details stehen in [Docker-Installationen](docker.md). @@ -598,19 +624,19 @@ sudo /opt/adguard-shield/adguard-shield firewall-restore ### Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield whitelist-status +sudo adguard-shield whitelist-status ``` ### Sofort synchronisieren ```bash -sudo /opt/adguard-shield/adguard-shield whitelist-sync +sudo adguard-shield whitelist-sync ``` ### Aufgelöste externe Whitelist entfernen ```bash -sudo /opt/adguard-shield/adguard-shield whitelist-flush +sudo adguard-shield whitelist-flush ``` ### Hinweise @@ -629,19 +655,19 @@ sudo /opt/adguard-shield/adguard-shield whitelist-flush ### Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield blocklist-status +sudo adguard-shield blocklist-status ``` ### Sofort synchronisieren ```bash -sudo /opt/adguard-shield/adguard-shield blocklist-sync +sudo adguard-shield blocklist-sync ``` ### Alle Sperren aus externer Blocklist aufheben ```bash -sudo /opt/adguard-shield/adguard-shield blocklist-flush +sudo adguard-shield blocklist-flush ``` ### Hinweise @@ -658,13 +684,13 @@ sudo /opt/adguard-shield/adguard-shield blocklist-flush ### Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield geoip-status +sudo adguard-shield geoip-status ``` ### Einzelne IP nachschlagen ```bash -sudo /opt/adguard-shield/adguard-shield geoip-lookup 8.8.8.8 +sudo adguard-shield geoip-lookup 8.8.8.8 ``` **Ausgabe:** @@ -676,7 +702,7 @@ IP: 8.8.8.8 -> Land: US ### Aktuelle Clients prüfen ```bash -sudo /opt/adguard-shield/adguard-shield geoip-sync +sudo adguard-shield geoip-sync ``` Liest das aktuelle Querylog und prüft alle darin enthaltenen Client-IPs einmalig gegen die GeoIP-Regeln. @@ -684,13 +710,13 @@ Liest das aktuelle Querylog und prüft alle darin enthaltenen Client-IPs einmali ### Alle GeoIP-Sperren aufheben ```bash -sudo /opt/adguard-shield/adguard-shield geoip-flush +sudo adguard-shield geoip-flush ``` ### Cache leeren ```bash -sudo /opt/adguard-shield/adguard-shield geoip-flush-cache +sudo adguard-shield geoip-flush-cache ``` ### Hinweise @@ -705,25 +731,25 @@ sudo /opt/adguard-shield/adguard-shield geoip-flush-cache ### Konfiguration und Cron-Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield report-status +sudo adguard-shield report-status ``` ### HTML-Report in Datei schreiben ```bash -sudo /opt/adguard-shield/adguard-shield report-generate html /tmp/adguard-shield-report.html +sudo adguard-shield report-generate html /tmp/adguard-shield-report.html ``` ### Text-Report auf stdout ausgeben ```bash -sudo /opt/adguard-shield/adguard-shield report-generate txt +sudo adguard-shield report-generate txt ``` ### Testmail senden ```bash -sudo /opt/adguard-shield/adguard-shield report-test +sudo adguard-shield report-test ``` Sendet eine einfache Testmail. Erst wenn diese funktioniert, lohnt sich die Fehlersuche am eigentlichen Report. @@ -731,21 +757,21 @@ Sendet eine einfache Testmail. Erst wenn diese funktioniert, lohnt sich die Fehl ### Aktuellen Report erzeugen und versenden ```bash -sudo /opt/adguard-shield/adguard-shield report-send +sudo adguard-shield report-send ``` ### Cron-Job installieren ```bash -sudo /opt/adguard-shield/adguard-shield report-install +sudo adguard-shield report-install ``` -Erstellt die Datei `/etc/cron.d/adguard-shield-report` mit dem konfigurierten Intervall und der Versandzeit. +Erstellt die Datei `/etc/cron.d/adguard-shield-report` mit dem konfigurierten Intervall und der Versandzeit. Wenn der globale CLI-Befehl vorhanden ist, verwendet der Cron-Job `/usr/local/bin/adguard-shield`; sonst fällt er auf das installierte Binary unter `/opt/adguard-shield/adguard-shield` zurück. ### Cron-Job entfernen ```bash -sudo /opt/adguard-shield/adguard-shield report-remove +sudo adguard-shield report-remove ``` Details zum Report-System stehen in [E-Mail Report](report.md). @@ -755,7 +781,7 @@ Details zum Report-System stehen in [E-Mail Report](report.md). ## Dry-Run ```bash -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run ``` Der Dry-Run ist der sicherste Weg, neue Konfigurationen zu prüfen, bevor sie produktiv gehen. @@ -773,11 +799,11 @@ Der Dry-Run ist der sicherste Weg, neue Konfigurationen zu prüfen, bevor sie pr ```bash # Dry-Run starten (Strg+C zum Beenden) -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run # Ergebnisse prüfen -sudo /opt/adguard-shield/adguard-shield history 50 -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 80 +sudo adguard-shield history 50 +sudo adguard-shield logs --level warn --limit 80 ``` --- @@ -785,7 +811,7 @@ sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 80 ## Version ```bash -/opt/adguard-shield/adguard-shield version +adguard-shield version ``` Zeigt die installierte Version an. Aliase: `--version`, `-v`. @@ -798,15 +824,15 @@ Zeigt die installierte Version an. Aliase: `--version`, `-v`. ```bash sudo systemctl restart adguard-shield -sudo /opt/adguard-shield/adguard-shield status -sudo /opt/adguard-shield/adguard-shield logs --level info --limit 80 +sudo adguard-shield status +sudo adguard-shield logs --level info --limit 80 ``` ### Falsch gesperrte IP freigeben ```bash -sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100 -sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100 +sudo adguard-shield unban 192.168.1.100 +sudo adguard-shield reset-offenses 192.168.1.100 ``` Danach die IP dauerhaft in `WHITELIST` oder eine externe Whitelist aufnehmen. @@ -814,16 +840,16 @@ Danach die IP dauerhaft in `WHITELIST` oder eine externe Whitelist aufnehmen. ### Externe Listen neu laden ```bash -sudo /opt/adguard-shield/adguard-shield whitelist-sync -sudo /opt/adguard-shield/adguard-shield blocklist-sync -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield whitelist-sync +sudo adguard-shield blocklist-sync +sudo adguard-shield status ``` ### Firewall neu aufbauen ```bash -sudo /opt/adguard-shield/adguard-shield firewall-remove -sudo /opt/adguard-shield/adguard-shield firewall-create +sudo adguard-shield firewall-remove +sudo adguard-shield firewall-create sudo systemctl restart adguard-shield ``` @@ -834,8 +860,8 @@ Nach dem Neustart schreibt der Daemon aktive Sperren aus SQLite wieder in die Fi ```bash sudo systemctl status adguard-shield sudo journalctl -u adguard-shield --no-pager -n 100 -sudo /opt/adguard-shield/adguard-shield test -sudo /opt/adguard-shield/adguard-shield logs --level debug --limit 100 +sudo adguard-shield test +sudo adguard-shield logs --level debug --limit 100 ``` --- @@ -900,7 +926,7 @@ Die Beispielzahlen liegen bewusst nahe an den Standardlimits `RATE_LIMIT_MAX_REQ ## Eingebaute Hilfe ```bash -/opt/adguard-shield/adguard-shield --help +adguard-shield --help ``` Bei unbekannten Befehlen gibt das Binary die Usage-Ausgabe aus. diff --git a/docs/benachrichtigungen.md b/docs/benachrichtigungen.md index bfcf334..fbbec5d 100644 --- a/docs/benachrichtigungen.md +++ b/docs/benachrichtigungen.md @@ -217,9 +217,9 @@ GEOIP_NOTIFY=false Diese Befehle können viele IPs auf einmal freigeben: ```bash -sudo /opt/adguard-shield/adguard-shield flush -sudo /opt/adguard-shield/adguard-shield geoip-flush -sudo /opt/adguard-shield/adguard-shield blocklist-flush +sudo adguard-shield flush +sudo adguard-shield geoip-flush +sudo adguard-shield blocklist-flush ``` AdGuard Shield sendet dafür **nicht** eine Nachricht pro IP, sondern eine zusammenfassende Meldung mit der Anzahl der freigegebenen Sperren. @@ -326,7 +326,7 @@ Aktion: Manual-Flush Wenn keine Benachrichtigung ankommt: ```bash -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 +sudo adguard-shield logs --level warn --limit 100 sudo journalctl -u adguard-shield --no-pager -n 100 ``` diff --git a/docs/docker.md b/docs/docker.md index 82d7ef0..852f541 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -143,8 +143,8 @@ BLOCKED_PORTS="53 443 853" ```bash sudo systemctl restart adguard-shield -sudo /opt/adguard-shield/adguard-shield firewall-status -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield firewall-status +sudo adguard-shield status ``` ## Firewall neu aufbauen @@ -152,9 +152,9 @@ sudo /opt/adguard-shield/adguard-shield status Falls der Modus gewechselt wurde: ```bash -sudo /opt/adguard-shield/adguard-shield firewall-remove +sudo adguard-shield firewall-remove sudo systemctl restart adguard-shield -sudo /opt/adguard-shield/adguard-shield firewall-status +sudo adguard-shield firewall-status ``` Der Daemon erstellt die Firewall-Struktur beim Start automatisch neu und überträgt aktive Sperren aus SQLite. diff --git a/docs/konfiguration.md b/docs/konfiguration.md index 197bd97..c739a6d 100644 --- a/docs/konfiguration.md +++ b/docs/konfiguration.md @@ -20,7 +20,7 @@ Nach Änderungen muss der Service neu gestartet werden: ```bash sudo systemctl restart adguard-shield -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield status ``` ## Automatische Migration @@ -42,10 +42,10 @@ Nach dem Bearbeiten der Konfiguration: ```bash # API-Verbindung testen -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test # Dry-Run: zeigt, was gesperrt würde, ohne die Firewall zu verändern -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run ``` --- @@ -262,10 +262,10 @@ Progressive Sperren gelten für Monitor-Sperren wie `rate-limit` und `subdomain- ### Verwaltungsbefehle ```bash -sudo /opt/adguard-shield/adguard-shield offense-status # Zähler anzeigen -sudo /opt/adguard-shield/adguard-shield offense-cleanup # Abgelaufene entfernen -sudo /opt/adguard-shield/adguard-shield reset-offenses # Alle zurücksetzen -sudo /opt/adguard-shield/adguard-shield reset-offenses # Eine IP zurücksetzen +sudo adguard-shield offense-status # Zähler anzeigen +sudo adguard-shield offense-cleanup # Abgelaufene entfernen +sudo adguard-shield reset-offenses # Alle zurücksetzen +sudo adguard-shield reset-offenses # Eine IP zurücksetzen ``` --- @@ -289,9 +289,9 @@ sudo /opt/adguard-shield/adguard-shield reset-offenses # Eine IP zurück ### CLI-Befehle ```bash -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 -sudo /opt/adguard-shield/adguard-shield logs-follow debug -sudo /opt/adguard-shield/adguard-shield live +sudo adguard-shield logs --level warn --limit 100 +sudo adguard-shield logs-follow debug +sudo adguard-shield live ``` **Hinweis:** Query-Inhalte werden nicht dauerhaft ins Log geschrieben. Für Query-nahe Diagnose ist die Live-Ansicht gedacht. @@ -413,7 +413,7 @@ REPORT_MAIL_CMD="msmtp" ### Cron-Job installieren ```bash -sudo /opt/adguard-shield/adguard-shield report-install +sudo adguard-shield report-install ``` Details stehen in [E-Mail Report](report.md). @@ -642,11 +642,11 @@ Die Datenbank wird unter `/opt/adguard-shield/geoip/` gespeichert und nach 24 St ### GeoIP-Befehle ```bash -sudo /opt/adguard-shield/adguard-shield geoip-status # Status anzeigen -sudo /opt/adguard-shield/adguard-shield geoip-lookup 8.8.8.8 # IP nachschlagen -sudo /opt/adguard-shield/adguard-shield geoip-sync # Clients prüfen -sudo /opt/adguard-shield/adguard-shield geoip-flush-cache # Cache leeren -sudo /opt/adguard-shield/adguard-shield geoip-flush # Alle GeoIP-Sperren aufheben +sudo adguard-shield geoip-status # Status anzeigen +sudo adguard-shield geoip-lookup 8.8.8.8 # IP nachschlagen +sudo adguard-shield geoip-sync # Clients prüfen +sudo adguard-shield geoip-flush-cache # Cache leeren +sudo adguard-shield geoip-flush # Alle GeoIP-Sperren aufheben ``` --- @@ -739,6 +739,6 @@ NTFY_TOPIC="adguard-shield-prod" ### Vor produktiver Aktivierung ```bash -sudo /opt/adguard-shield/adguard-shield test -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield test +sudo adguard-shield dry-run ``` diff --git a/docs/report.md b/docs/report.md index 87daaf6..bb5ae97 100644 --- a/docs/report.md +++ b/docs/report.md @@ -88,13 +88,13 @@ REPORT_MAIL_CMD="msmtp" ### Konfiguration und Cron-Status anzeigen ```bash -sudo /opt/adguard-shield/adguard-shield report-status +sudo adguard-shield report-status ``` ### HTML-Report in Datei schreiben ```bash -sudo /opt/adguard-shield/adguard-shield report-generate html /tmp/adguard-shield-report.html +sudo adguard-shield report-generate html /tmp/adguard-shield-report.html ``` Die Datei kann im Browser geöffnet werden, um das Ergebnis zu prüfen. @@ -102,13 +102,13 @@ Die Datei kann im Browser geöffnet werden, um das Ergebnis zu prüfen. ### Text-Report auf stdout ausgeben ```bash -sudo /opt/adguard-shield/adguard-shield report-generate txt +sudo adguard-shield report-generate txt ``` ### Testmail senden ```bash -sudo /opt/adguard-shield/adguard-shield report-test +sudo adguard-shield report-test ``` Sendet eine einfache Testmail. Erst wenn diese ankommt, lohnt sich die Fehlersuche am eigentlichen Report. @@ -116,19 +116,19 @@ Sendet eine einfache Testmail. Erst wenn diese ankommt, lohnt sich die Fehlersuc ### Aktuellen Report erzeugen und versenden ```bash -sudo /opt/adguard-shield/adguard-shield report-send +sudo adguard-shield report-send ``` ### Cron-Job installieren ```bash -sudo /opt/adguard-shield/adguard-shield report-install +sudo adguard-shield report-install ``` ### Cron-Job entfernen ```bash -sudo /opt/adguard-shield/adguard-shield report-remove +sudo adguard-shield report-remove ``` --- @@ -148,7 +148,7 @@ REPORT_MAIL_CMD="msmtp" sudo apt install msmtp msmtp-mta # Testmail senden -sudo /opt/adguard-shield/adguard-shield report-test +sudo adguard-shield report-test ``` ### Eigene Mailprogramm-Argumente @@ -175,7 +175,7 @@ REPORT_MAIL_CMD="msmtp --account=default" ### Cron-Job installieren ```bash -sudo /opt/adguard-shield/adguard-shield report-install +sudo adguard-shield report-install ``` Dadurch wird diese Datei geschrieben: @@ -184,12 +184,14 @@ Dadurch wird diese Datei geschrieben: /etc/cron.d/adguard-shield-report ``` -Der Cron-Eintrag ruft das installierte Binary mit der installierten Konfiguration auf: +Der Cron-Eintrag ruft den globalen CLI-Befehl mit der installierten Konfiguration auf, sofern er registriert ist: ```text -/opt/adguard-shield/adguard-shield -config /opt/adguard-shield/adguard-shield.conf report-send +/usr/local/bin/adguard-shield -config /opt/adguard-shield/adguard-shield.conf report-send ``` +Falls die Installation mit `--no-register` erfolgt ist, verwendet `report-install` stattdessen `/opt/adguard-shield/adguard-shield`. + ### Zeitplan nach Intervall | Intervall | Cron-Verhalten | @@ -202,7 +204,7 @@ Der Cron-Eintrag ruft das installierte Binary mit der installierten Konfiguratio ### Cron-Job entfernen ```bash -sudo /opt/adguard-shield/adguard-shield report-remove +sudo adguard-shield report-remove ``` --- @@ -212,33 +214,33 @@ sudo /opt/adguard-shield/adguard-shield report-remove ### Schritt 1: Status prüfen ```bash -sudo /opt/adguard-shield/adguard-shield report-status +sudo adguard-shield report-status ``` ### Schritt 2: Report lokal erzeugen ```bash # HTML-Report zum Ansehen im Browser -sudo /opt/adguard-shield/adguard-shield report-generate html /tmp/adguard-shield-report.html +sudo adguard-shield report-generate html /tmp/adguard-shield-report.html # Text-Report in der Konsole -sudo /opt/adguard-shield/adguard-shield report-generate txt +sudo adguard-shield report-generate txt ``` ### Schritt 3: Versand testen ```bash # Einfache Testmail -sudo /opt/adguard-shield/adguard-shield report-test +sudo adguard-shield report-test # Vollständigen Report senden -sudo /opt/adguard-shield/adguard-shield report-send +sudo adguard-shield report-send ``` ### Schritt 4: Logs prüfen ```bash -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 +sudo adguard-shield logs --level warn --limit 100 sudo journalctl -u cron --no-pager -n 100 ``` @@ -277,7 +279,7 @@ Oder setze `REPORT_MAIL_CMD` auf dein vorhandenes Mailprogramm. Prüfe die Konfiguration und den Cron-Job: ```bash -sudo /opt/adguard-shield/adguard-shield report-send +sudo adguard-shield report-send sudo cat /etc/cron.d/adguard-shield-report ``` @@ -296,6 +298,6 @@ sudo cat /etc/cron.d/adguard-shield-report Du kannst das Format unabhängig von der Konfiguration wählen: ```bash -sudo /opt/adguard-shield/adguard-shield report-generate txt -sudo /opt/adguard-shield/adguard-shield report-generate html /tmp/report.html +sudo adguard-shield report-generate txt +sudo adguard-shield report-generate html /tmp/report.html ``` diff --git a/docs/tipps-und-troubleshooting.md b/docs/tipps-und-troubleshooting.md index 6a44b69..6e09613 100644 --- a/docs/tipps-und-troubleshooting.md +++ b/docs/tipps-und-troubleshooting.md @@ -14,19 +14,19 @@ sudo systemctl status adguard-shield sudo journalctl -u adguard-shield --no-pager -n 100 # 3. Funktioniert die API? -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test # 4. Was ist der aktuelle Zustand? -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield status # 5. Gibt es Warnungen oder Fehler? -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 +sudo adguard-shield logs --level warn --limit 100 ``` Wenn du aktuelle Queries und den Echtzeit-Zustand sehen willst: ```bash -sudo /opt/adguard-shield/adguard-shield live +sudo adguard-shield live ``` --- @@ -68,7 +68,7 @@ sudo systemctl daemon-reload ### Test ```bash -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test ``` ### Konfiguration prüfen @@ -104,9 +104,9 @@ Passe URL und Zugangsdaten entsprechend an. ### Prüfen ```bash -sudo /opt/adguard-shield/adguard-shield live --once -sudo /opt/adguard-shield/adguard-shield history 50 -sudo /opt/adguard-shield/adguard-shield logs --level debug --limit 100 +sudo adguard-shield live --once +sudo adguard-shield history 50 +sudo adguard-shield logs --level debug --limit 100 ``` ### Mögliche Ursachen und Lösungen @@ -131,8 +131,8 @@ sudo /opt/adguard-shield/adguard-shield logs --level debug --limit 100 ### Übersicht verschaffen ```bash -sudo /opt/adguard-shield/adguard-shield status -sudo /opt/adguard-shield/adguard-shield history 100 +sudo adguard-shield status +sudo adguard-shield history 100 ``` ### Ursachen und Gegenmaßnahmen @@ -149,10 +149,10 @@ sudo /opt/adguard-shield/adguard-shield history 100 ```bash # Sperre aufheben -sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100 +sudo adguard-shield unban 192.168.1.100 # Offense-Zähler zurücksetzen (damit progressive Sperren nicht sofort eskalieren) -sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100 +sudo adguard-shield reset-offenses 192.168.1.100 ``` ### Dauerhaft ausnehmen @@ -174,7 +174,7 @@ sudo systemctl restart adguard-shield ### Status über AdGuard Shield ```bash -sudo /opt/adguard-shield/adguard-shield firewall-status +sudo adguard-shield firewall-status ``` ### Direkte Prüfung mit Systembefehlen @@ -198,8 +198,8 @@ sudo iptables -n -L DOCKER-USER --line-numbers -v | grep ADGUARD ### Firewall neu aufbauen ```bash -sudo /opt/adguard-shield/adguard-shield firewall-remove -sudo /opt/adguard-shield/adguard-shield firewall-create +sudo adguard-shield firewall-remove +sudo adguard-shield firewall-create sudo systemctl restart adguard-shield ``` @@ -212,8 +212,8 @@ Nach dem Neustart werden aktive Sperren aus SQLite wieder in die ipsets geschrie ### Prüfen ```bash -sudo /opt/adguard-shield/adguard-shield status -sudo /opt/adguard-shield/adguard-shield history 100 +sudo adguard-shield status +sudo adguard-shield history 100 ``` Temporäre Sperren werden beim Start und während jedes Pollings auf Ablauf geprüft. Wenn eine Sperre als permanent angezeigt wird, wird sie nicht automatisch freigegeben. @@ -231,7 +231,7 @@ Temporäre Sperren werden beim Start und während jedes Pollings auf Ablauf gepr ### Manuell freigeben ```bash -sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100 +sudo adguard-shield unban 192.168.1.100 ``` --- @@ -242,13 +242,13 @@ Dry-Run ist ideal, um neue Konfigurationen zu prüfen, bevor sie produktiv gehen ```bash # Dry-Run starten (Strg+C zum Beenden) -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run ``` Währenddessen die Ergebnisse prüfen: ```bash -sudo /opt/adguard-shield/adguard-shield history 50 +sudo adguard-shield history 50 ``` Im Dry-Run werden mögliche Sperren als `DRY` protokolliert. Es entstehen keine aktiven Sperren und keine Firewall-Änderungen. @@ -260,13 +260,13 @@ Im Dry-Run werden mögliche Sperren als `DRY` protokolliert. Es entstehen keine ### Status prüfen ```bash -sudo /opt/adguard-shield/adguard-shield whitelist-status +sudo adguard-shield whitelist-status ``` ### Manuell synchronisieren ```bash -sudo /opt/adguard-shield/adguard-shield whitelist-sync +sudo adguard-shield whitelist-sync ``` ### Typische Probleme @@ -295,19 +295,19 @@ trusted.example.com # Hostname (wird per DNS aufgelöst) ### Status prüfen ```bash -sudo /opt/adguard-shield/adguard-shield blocklist-status +sudo adguard-shield blocklist-status ``` ### Manuell synchronisieren ```bash -sudo /opt/adguard-shield/adguard-shield blocklist-sync +sudo adguard-shield blocklist-sync ``` ### Alle Blocklist-Sperren freigeben ```bash -sudo /opt/adguard-shield/adguard-shield blocklist-flush +sudo adguard-shield blocklist-flush ``` ### Zu viele IPs gesperrt? @@ -325,25 +325,25 @@ sudo /opt/adguard-shield/adguard-shield blocklist-flush ### Status prüfen ```bash -sudo /opt/adguard-shield/adguard-shield geoip-status +sudo adguard-shield geoip-status ``` ### Einzelne IP prüfen ```bash -sudo /opt/adguard-shield/adguard-shield geoip-lookup 8.8.8.8 +sudo adguard-shield geoip-lookup 8.8.8.8 ``` ### Cache leeren ```bash -sudo /opt/adguard-shield/adguard-shield geoip-flush-cache +sudo adguard-shield geoip-flush-cache ``` ### Alle GeoIP-Sperren freigeben ```bash -sudo /opt/adguard-shield/adguard-shield geoip-flush +sudo adguard-shield geoip-flush ``` ### Typische Probleme und Lösungen @@ -368,17 +368,17 @@ Die GeoIP-Ländercodes folgen dem Standard ISO 3166-1 Alpha-2. Eine vollständig ### Status prüfen ```bash -sudo /opt/adguard-shield/adguard-shield report-status +sudo adguard-shield report-status ``` ### Funktionstest ```bash # Testmail senden -sudo /opt/adguard-shield/adguard-shield report-test +sudo adguard-shield report-test # Text-Report in der Konsole ansehen -sudo /opt/adguard-shield/adguard-shield report-generate txt +sudo adguard-shield report-generate txt ``` ### Keine Mail kommt an? @@ -396,7 +396,7 @@ sudo /opt/adguard-shield/adguard-shield report-generate txt ```bash sudo cat /etc/cron.d/adguard-shield-report -sudo /opt/adguard-shield/adguard-shield report-send +sudo adguard-shield report-send ``` --- @@ -406,7 +406,7 @@ sudo /opt/adguard-shield/adguard-shield report-send ### Prüfen ```bash -sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100 +sudo adguard-shield logs --level warn --limit 100 ``` ### Checkliste @@ -497,13 +497,13 @@ Wenn der Zustand unklar ist und ein sauberer Neustart nötig ist: sudo systemctl stop adguard-shield # Firewall-Struktur entfernen -sudo /opt/adguard-shield/adguard-shield firewall-remove +sudo adguard-shield firewall-remove # Service neu starten (baut Firewall aus SQLite wieder auf) sudo systemctl start adguard-shield # Status prüfen -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield status ``` Das entfernt die Firewall-Struktur und lässt den Daemon sie beim Start wieder aus dem SQLite-State aufbauen. Aktive Sperren bleiben in der Datenbank erhalten. @@ -515,13 +515,13 @@ Das entfernt die Firewall-Struktur und lässt den Daemon sie beim Start wieder a ### Konfiguration behalten ```bash -sudo /opt/adguard-shield/adguard-shield uninstall --keep-config +sudo adguard-shield uninstall --keep-config ``` ### Alles entfernen ```bash -sudo /opt/adguard-shield/adguard-shield uninstall +sudo adguard-shield uninstall ``` Ohne `--keep-config` werden Installationsverzeichnis, State-Verzeichnis und Logdatei entfernt. diff --git a/docs/update.md b/docs/update.md index fae0af9..aceb364 100644 --- a/docs/update.md +++ b/docs/update.md @@ -14,11 +14,13 @@ sudo ./adguard-shield update Am Ende fragt der Updater, ob AdGuard Shield direkt neu gestartet werden soll. +Der Updater registriert dabei auch den globalen CLI-Befehl `/usr/local/bin/adguard-shield`. Nach dem Update kannst du die installierte Anwendung daher direkt mit `sudo adguard-shield ` verwenden. + ### Nach dem Update prüfen ```bash -sudo /opt/adguard-shield/adguard-shield install-status -sudo /opt/adguard-shield/adguard-shield status +sudo adguard-shield install-status +sudo adguard-shield status sudo journalctl -u adguard-shield --no-pager -n 50 ``` @@ -66,11 +68,12 @@ Der Update-Befehl nutzt intern dieselbe Routine wie die Installation: | 3 | Systemabhängigkeiten prüfen (sofern nicht `--skip-deps`) | | 4 | Installationsverzeichnis sicherstellen | | 5 | Neues Binary nach `/opt/adguard-shield/adguard-shield` kopieren | -| 6 | Konfiguration migrieren (vorhandene Werte behalten, neue ergänzen) | -| 7 | systemd-Service neu schreiben | -| 8 | `systemctl daemon-reload` | -| 9 | Autostart aktivieren (sofern nicht `--no-enable`) | -| 10 | Nachfrage: Service direkt neu starten | +| 6 | CLI-Befehl `/usr/local/bin/adguard-shield` registrieren/aktualisieren (sofern nicht `--no-register`) | +| 7 | Report-Templates installieren | +| 8 | Konfiguration migrieren (vorhandene Werte behalten, neue ergänzen) | +| 9 | systemd-Service neu schreiben | +| 10 | `systemctl daemon-reload` und Autostart aktivieren (sofern nicht `--no-enable`) | +| 11 | Nachfrage: Service direkt neu starten | --- @@ -113,8 +116,8 @@ Wenn du vorher manuell prüfen möchtest: ```bash sudo ./adguard-shield update -sudo /opt/adguard-shield/adguard-shield test -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield test +sudo adguard-shield dry-run sudo systemctl restart adguard-shield ``` @@ -126,6 +129,14 @@ sudo ./adguard-shield update --skip-deps Sinnvoll, wenn `iptables`, `ip6tables`, `ipset` und `systemctl` bereits vorhanden sind oder die Paketinstallation nicht über `apt-get` laufen soll. +### Update ohne CLI-Registrierung + +```bash +sudo ./adguard-shield update --no-register +``` + +Damit wird kein Symlink unter `/usr/local/bin/adguard-shield` angelegt oder geändert. Die Anwendung bleibt dann weiterhin über `/opt/adguard-shield/adguard-shield` erreichbar. + ### Update mit expliziter Konfigurationsquelle ```bash @@ -138,7 +149,7 @@ sudo ./adguard-shield update --config-source ./adguard-shield.conf sudo ./adguard-shield update --install-dir /opt/adguard-shield-test ``` -**Hinweis:** Die systemd-Unit heißt weiterhin `adguard-shield.service`. Mehrere parallele produktive Installationen über dieselbe Unit sind nicht vorgesehen. +**Hinweis:** Die systemd-Unit heißt weiterhin `adguard-shield.service`, und der globale CLI-Befehl heißt weiterhin `/usr/local/bin/adguard-shield`. Mehrere parallele produktive Installationen über dieselbe Unit oder denselben CLI-Befehl sind nicht vorgesehen. --- @@ -178,10 +189,10 @@ sudo cp /opt/adguard-shield/adguard-shield.conf /root/adguard-shield.conf.backup sudo ./adguard-shield install --config-source /root/adguard-shield.conf.backup # 4. API-Verbindung prüfen -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test # 5. Dry-Run: prüfen, was gesperrt würde -sudo /opt/adguard-shield/adguard-shield dry-run +sudo adguard-shield dry-run # 6. Produktiven Service starten sudo systemctl start adguard-shield @@ -197,7 +208,7 @@ sudo systemctl status adguard-shield ### Installation ```bash -sudo /opt/adguard-shield/adguard-shield install-status +sudo adguard-shield install-status ``` ### Service @@ -210,20 +221,20 @@ sudo journalctl -u adguard-shield --no-pager -n 100 ### API-Verbindung ```bash -sudo /opt/adguard-shield/adguard-shield test +sudo adguard-shield test ``` ### Laufzeitstatus ```bash -sudo /opt/adguard-shield/adguard-shield status -sudo /opt/adguard-shield/adguard-shield live --once +sudo adguard-shield status +sudo adguard-shield live --once ``` ### Firewall ```bash -sudo /opt/adguard-shield/adguard-shield firewall-status +sudo adguard-shield firewall-status ``` --- diff --git a/internal/installer/installer.go b/internal/installer/installer.go index abce0b2..0a65bea 100644 --- a/internal/installer/installer.go +++ b/internal/installer/installer.go @@ -20,6 +20,7 @@ const ( DefaultInstallDir = "/opt/adguard-shield" DefaultStateDir = "/var/lib/adguard-shield" DefaultLogFile = "/var/log/adguard-shield.log" + CLICommandPath = "/usr/local/bin/adguard-shield" ServiceName = "adguard-shield.service" ServicePath = "/etc/systemd/system/adguard-shield.service" ) @@ -30,19 +31,22 @@ type Options struct { Enable bool SkipDeps bool KeepConfig bool + RegisterCLI bool } type Status struct { - InstallDir string - BinaryPath string - ConfigPath string - BinaryExists bool - ConfigExists bool - ServiceExists bool - ServiceEnabled bool - ServiceActive bool - Version string - LegacyFindings []string + InstallDir string + BinaryPath string + ConfigPath string + CLICommandPath string + BinaryExists bool + ConfigExists bool + CLICommandInstalled bool + ServiceExists bool + ServiceEnabled bool + ServiceActive bool + Version string + LegacyFindings []string } type LegacyError struct { @@ -54,30 +58,30 @@ func (e *LegacyError) Error() string { } func DefaultOptions() Options { - return Options{InstallDir: DefaultInstallDir, Enable: true} + return Options{InstallDir: DefaultInstallDir, Enable: true, RegisterCLI: true} } func Install(opts Options) error { opts = normalize(opts) fmt.Println("AdGuard Shield Go-Installation") fmt.Printf("Installationspfad: %s\n", opts.InstallDir) - fmt.Println("1/9 Pruefe Betriebssystem und root-Rechte ...") + fmt.Println("1/10 Pruefe Betriebssystem und root-Rechte ...") if err := requireLinuxRoot(); err != nil { return err } - fmt.Println("2/9 Pruefe auf scriptbasierte Altinstallation ...") + fmt.Println("2/10 Pruefe auf scriptbasierte Altinstallation ...") if findings := DetectLegacy(opts.InstallDir); len(findings) > 0 { return &LegacyError{Findings: findings} } if !opts.SkipDeps { - fmt.Println("3/9 Pruefe System-Abhaengigkeiten ...") + fmt.Println("3/10 Pruefe System-Abhaengigkeiten ...") if err := ensureDependencies(); err != nil { return err } } else { - fmt.Println("3/9 System-Abhaengigkeiten uebersprungen (--skip-deps)") + fmt.Println("3/10 System-Abhaengigkeiten uebersprungen (--skip-deps)") } - fmt.Println("4/9 Erstelle Verzeichnisse ...") + fmt.Println("4/10 Erstelle Verzeichnisse ...") if err := os.MkdirAll(opts.InstallDir, 0755); err != nil { return err } @@ -87,23 +91,31 @@ func Install(opts Options) error { if err := os.MkdirAll(filepath.Join(opts.InstallDir, "geoip"), 0755); err != nil { return err } - fmt.Println("5/9 Installiere Binary ...") + fmt.Println("5/10 Installiere Binary ...") if err := copySelf(filepath.Join(opts.InstallDir, "adguard-shield")); err != nil { return err } - fmt.Println("6/9 Installiere Report-Templates ...") + if opts.RegisterCLI { + fmt.Printf("6/10 Registriere CLI-Befehl (%s) ...\n", CLICommandPath) + if err := registerCLICommand(opts.InstallDir); err != nil { + return err + } + } else { + fmt.Println("6/10 CLI-Registrierung uebersprungen (--no-register)") + } + fmt.Println("7/10 Installiere Report-Templates ...") if err := report.InstallTemplates(filepath.Join(opts.InstallDir, "templates")); err != nil { return err } - fmt.Println("7/9 Installiere oder migriere Konfiguration ...") + fmt.Println("8/10 Installiere oder migriere Konfiguration ...") if err := ensureConfig(opts); err != nil { return err } - fmt.Println("8/9 Schreibe systemd-Service ...") + fmt.Println("9/10 Schreibe systemd-Service ...") if err := writeService(opts.InstallDir); err != nil { return err } - fmt.Println("9/9 Aktualisiere systemd ...") + fmt.Println("10/10 Aktualisiere systemd ...") _ = run("systemctl", "daemon-reload") if opts.Enable { fmt.Println("Aktiviere Autostart ...") @@ -144,6 +156,7 @@ func Uninstall(opts Options) error { } _ = os.Remove(ServicePath) _ = run("systemctl", "daemon-reload") + _ = unregisterCLICommand(opts.InstallDir) if opts.KeepConfig { for _, p := range []string{ filepath.Join(opts.InstallDir, "adguard-shield"), @@ -166,13 +179,15 @@ func GetStatus(installDir string) Status { bin := filepath.Join(installDir, "adguard-shield") conf := filepath.Join(installDir, "adguard-shield.conf") st := Status{ - InstallDir: installDir, - BinaryPath: bin, - ConfigPath: conf, - BinaryExists: fileExists(bin), - ConfigExists: fileExists(conf), - ServiceExists: fileExists(ServicePath), - LegacyFindings: DetectLegacy(installDir), + InstallDir: installDir, + BinaryPath: bin, + ConfigPath: conf, + CLICommandPath: CLICommandPath, + BinaryExists: fileExists(bin), + ConfigExists: fileExists(conf), + CLICommandInstalled: cliCommandInstalled(installDir), + ServiceExists: fileExists(ServicePath), + LegacyFindings: DetectLegacy(installDir), } if st.BinaryExists { if out, err := exec.Command(bin, "version").Output(); err == nil { @@ -253,6 +268,7 @@ func PrintStatus(st Status) string { if st.Version != "" { b.WriteString(fmt.Sprintf("Version: %s\n", st.Version)) } + b.WriteString(fmt.Sprintf("CLI-Befehl (%s): %s\n", st.CLICommandPath, yesNo(st.CLICommandInstalled))) b.WriteString(fmt.Sprintf("Konfiguration: %s\n", yesNo(st.ConfigExists))) b.WriteString(fmt.Sprintf("systemd Service: %s\n", yesNo(st.ServiceExists))) b.WriteString(fmt.Sprintf("Autostart: %s\n", yesNo(st.ServiceEnabled))) @@ -391,6 +407,62 @@ func sameFile(a, b string) bool { return errA == nil && errB == nil && os.SameFile(ai, bi) } +func registerCLICommand(installDir string) error { + target := filepath.Join(installDir, "adguard-shield") + if err := os.MkdirAll(filepath.Dir(CLICommandPath), 0755); err != nil { + return err + } + if existingTarget, err := os.Readlink(CLICommandPath); err == nil { + resolved := resolveLinkTarget(CLICommandPath, existingTarget) + if filepath.Clean(resolved) == filepath.Clean(target) { + return nil + } + return fmt.Errorf("%s existiert bereits und verweist auf %s", CLICommandPath, existingTarget) + } else if !os.IsNotExist(err) { + return err + } + if fileExists(CLICommandPath) { + return fmt.Errorf("%s existiert bereits und ist kein Symlink", CLICommandPath) + } + return os.Symlink(target, CLICommandPath) +} + +func unregisterCLICommand(installDir string) error { + existingTarget, err := os.Readlink(CLICommandPath) + if os.IsNotExist(err) { + return nil + } + if err != nil { + return nil + } + target := filepath.Join(installDir, "adguard-shield") + resolved := resolveLinkTarget(CLICommandPath, existingTarget) + if filepath.Clean(resolved) != filepath.Clean(target) { + return nil + } + return os.Remove(CLICommandPath) +} + +func cliCommandInstalled(installDir string) bool { + existingTarget, err := os.Readlink(CLICommandPath) + if err != nil { + return false + } + target := filepath.Join(installDir, "adguard-shield") + if !fileExists(target) { + return false + } + resolved := resolveLinkTarget(CLICommandPath, existingTarget) + return filepath.Clean(resolved) == filepath.Clean(target) +} + +func resolveLinkTarget(linkPath, target string) string { + if filepath.IsAbs(target) { + return target + } + return filepath.Join(filepath.Dir(linkPath), target) +} + func ensureConfig(opts Options) error { target := filepath.Join(opts.InstallDir, "adguard-shield.conf") defaults := []byte(defaultConfig)