Compare commits

..
2 Commits
Author SHA1 Message Date
h0tznpl0tzandClaude 248b2f9c1a Simplify exitrace.sh following KISS principle
- Eliminate 345 lines of duplicated HERE-document code
- Replace complex remote execution with local deployment approach
- Remove AWK array context errors from shell escaping
- Preserve all features: -FROM/-TO/-DOMAIN/-MSGID/-GREP, time filters, MX records, status classification
- Maintain backwards compatibility with -f/-t/-D/-m/-G parameters
- Use deploy.sh for installation on logger.in.nessus.at

Reduces complexity while maintaining full functionality.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 15:46:04 +02:00
h0tznpl0tzandClaude 9241cc3d14 Improve exitrace parameter naming for better usability
- Add descriptive parameter names: -FROM, -TO, -DOMAIN, -MSGID, -GREP
- Maintain backwards compatibility with old short forms (-f, -t, -D, -m, -G)
- Update README with new examples and backwards compatibility section
- More intuitive and self-documenting command line interface

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 15:06:40 +02:00
2 changed files with 643 additions and 500 deletions
+154 -60
View File
@@ -1,37 +1,57 @@
# exitrace # exitrace
Exim-Log-Trace & Status für einzelne Mails/Adressen/Domain-Ziele: **Remote Exim-Log-Trace & Status für einzelne Mails/Adressen/Domain-Ziele**
Durchsucht Exim-Logs nach Message-IDs, gruppiert alle Ereignisse und klassifiziert den Delivery-Status
Führt Exim-Log-Analyse remote auf `logger.in.nessus.at` aus, wo sich die Exim-Logs befinden.
Durchsucht Logs nach Message-IDs, gruppiert alle Ereignisse und klassifiziert den Delivery-Status.
--- ---
## Features ## Features
- Sucht in `/var/log/easyname/YYYY/MM/YYYY-MM-DD.log(.gz)` (konfigurierbar via `$LOGROOT`) - **Remote-Ausführung**: Automatische SSH-Verbindung zu `logger.in.nessus.at`
- Zeitfenster: letzte N Stunden/Tage ODER konkretes Datum/Datumsbereich - **Zeitfenster**: Letzte N Stunden/Tage ODER konkretes Datum/Datumsbereich
- Filter: Absender, Empfänger (Regex), Domain, Message-ID, zusätzliche Regex - **Filter**: Absender, Empfänger (Regex), Domain, Message-ID, zusätzliche Regex
- Gruppiert alle Treffer pro Exim-Message-ID und fasst Status zusammen - **Gruppierung**: Alle Treffer pro Exim-Message-ID mit Status-Zusammenfassung
- **Status-Klassifikation**: OK / PARTIAL / DELAY / FAIL / UNKNOWN - **Status-Klassifikation**: OK / PARTIAL / DELAY / FAIL / UNKNOWN
- **MX-Records**: Optional DNS-Abfragen für Ziel-Domain (--mx) - **MX-Records**: Optional DNS-Abfragen für Ziel-Domain (--mx)
- Markiert häufige Fehler (z. B. "all hosts for 'domain' have been failing") - **Failure-Detection**: Markiert häufige Fehler (z.B. "all hosts failing")
- Sortierte chronologische Ausgabe pro Message-ID - **Chronologische Ausgabe**: Sortiert nach Message-ID Erstkontakt
- **Komprimierte Logs**: Automatischer Support für .gz-Archive - **Komprimierte Logs**: Automatischer Support für .gz-Archive
- **Smart Connection**: Verwendet `go logger` oder `ssh ${LUSER}@logger.in.nessus.at`
--- ---
## Installation ## Installation
1. Repository klonen oder Skript kopieren: Via Installer (empfohlen):
```bash ```bash
git clone <gitea-url>/esn-support-bash-snippets.git cd ~/.dev/esn-support-bash-snippets
cd esn-support-bash-snippets/legacy/exitrace ./install.sh
chmod +x exitrace.sh # Dann: 3) Legacy Tools auswählen und exitrace installieren
``` ```
2. Abhängigkeiten: Manuelle Installation:
- Standard Unix-Tools (awk, grep, date, zcat) ```bash
- `dig` (optional, für --mx Feature) git clone <repo-url>/esn-support-bash-snippets.git ~/.dev/esn-support-bash-snippets
- Lesezugriff auf `/var/log/easyname/` (oder custom `$LOGROOT`) cd ~/.dev/esn-support-bash-snippets/legacy/exitrace
chmod +x exitrace.sh
ln -sf ~/.dev/esn-support-bash-snippets/legacy/exitrace/exitrace.sh ~/bin/exitrace
```
## Voraussetzungen
- **LUSER Environment Variable** ODER installiertes `go` Tool
- **SSH-Zugang** zu `logger.in.nessus.at`
- Standard Unix-Tools (awk, grep, date, ssh/scp)
- `dig` (optional, für --mx Feature)
**Setup:**
```bash
export LUSER="dein-username"
# Oder in ~/.bash_env für permanente Konfiguration
echo 'export LUSER="dein-username"' >> ~/.bash_env
```
--- ---
@@ -44,24 +64,43 @@ exitrace
(durchsucht heutiges Log ohne Filter) (durchsucht heutiges Log ohne Filter)
### Beispiele ### Beispiele
**Häufige Use-Cases:**
```bash ```bash
# Mail-Trace einer konkreten Message-ID # Mail-Trace für spezifischen Absender zu t-online.de (letzte 48h)
exitrace -m 1uwRvz-000Fz2-CI exitrace -FROM franziskus@adjuva.info -DOMAIN t-online.de -H 48
# Alle Mails von bestimmtem Absender in den letzten 48 Stunden # Alle Mails an bestimmte Domain in Zeitspanne
exitrace -f sender@example.com -H 48 exitrace -DOMAIN gmx.de -r 2025-09-10..2025-09-11
# Empfänger-Domain in Zeitspanne # Konkrete Message-ID verfolgen
exitrace -D example.de -r 2025-09-09..2025-09-11 exitrace -MSGID 1uwRvz-000Fz2-CI
# Regex-Filter auf Empfänger + konkretes Datum # Regex-Filter auf Empfänger + MX-Records anzeigen
exitrace -t '.*@example\.de' -d 2025-09-10 exitrace -TO '.*@gmail\.com' -d 2025-09-11 --mx
# Kombinierte Filter: Absender + Domain + Zeitfenster + MX-Info # Kombinierte Filter: Absender + Domain + Zeitfenster
exitrace -f sender@example.com -D example.de -H 48 --mx exitrace -FROM noreply@company.com -DOMAIN outlook.com -H 24
```
# Dry-Run: zeigt nur, welche Logfiles durchsucht würden **Debugging & Analyse:**
```bash
# Dry-Run: zeigt nur welche Logfiles durchsucht würden
exitrace -n -H 24 exitrace -n -H 24
# Alle Mails von Domain in letzten 7 Tagen
exitrace -FROM '.*@problematic-domain\.com' -DAYS 7
# Zusätzlicher Regex-Filter
exitrace -DOMAIN example.com -GREP "550.*blocked" -H 12
```
**Backwards Compatibility:**
```bash
# Alte Parameter funktionieren weiterhin
exitrace -f sender@domain.com -D example.de -H 48
exitrace -m 1uwRvz-000Fz2-CI
exitrace -t '.*@gmail\.com' --mx
``` ```
--- ---
@@ -78,34 +117,55 @@ Zeitfenster (eine Option wählen):
-r, --range A..B Datumsbereich (inkl.): YYYY-MM-DD..YYYY-MM-DD -r, --range A..B Datumsbereich (inkl.): YYYY-MM-DD..YYYY-MM-DD
Filter (beliebig kombinierbar): Filter (beliebig kombinierbar):
-f, --from ADDR Envelope-From / "from <...>" -FROM, --from ADDR Envelope-From / "from <...>" (alias: -f)
-t, --to REGEX Empfänger (Regex, matcht nach " for <rcpt>" oder in "** ...") -TO, --to REGEX Empfänger (Regex, matcht nach " for <rcpt>" oder in "** ...") (alias: -t)
-D, --domain NAME Ziel-Domain (z. B. example.de), prüft auf Zustellungen/Fehler dorthin -DOMAIN, --domain NAME Ziel-Domain (z. B. example.de), prüft auf Zustellungen/Fehler dorthin (alias: -D)
-m, --msgid ID Exim-Message-ID (z. B. 1uwRvz-000Fz2-CI) -MSGID, --msgid ID Exim-Message-ID (z. B. 1uwRvz-000Fz2-CI) (alias: -m)
-G, --grep REGEX Zusätzlicher Regex auf Logzeilen -GREP, --grep REGEX Zusätzlicher Regex auf Logzeilen (alias: -G)
Sonstiges: Sonstiges:
--mx Zeigt MX-Einträge (und A/AAAA) für --domain --mx Zeigt MX-Einträge (und A/AAAA) für --domain
-n, --dry-run Zeigt nur, welche Logfiles untersucht würden -n, --dry-run Zeigt nur, welche Logfiles untersucht würden
-h, --help Diese Hilfe -h, --help Diese Hilfe
Remote Execution:
Wird automatisch remote auf logger.in.nessus.at ausgeführt.
Verwendet 'go logger' oder 'ssh ${LUSER}@logger.in.nessus.at'.
``` ```
--- ---
## Beispielausgabe ## Beispielausgabe
### Erfolgreiche Zustellung
``` ```
[OK] ID=1uwRvz-000Fz2-CI | First=2025-09-10 14:32:15 | From=sender@example.com | Rcpts=recipient@example.de | Delivered=1 Deferred=0 Failed=0 [OK] ID=1v2K8X-0004Zm-BC | First=2025-09-11 08:32:15 | From=franziskus@adjuva.info | Rcpts=user@t-online.de | Delivered=1 Deferred=0 Failed=0
------------------------------------------------------------------------ ------------------------------------------------------------------------
ID: 1uwRvz-000Fz2-CI ID: 1v2K8X-0004Zm-BC
First: 2025-09-10 14:32:15 First: 2025-09-11 08:32:15
Last: 2025-09-10 14:32:47 Last: 2025-09-11 08:32:47
From: sender@example.com From: franziskus@adjuva.info
Rcpts: recipient@example.de Rcpts: user@t-online.de
Status: OK (Delivered=1, Deferred=0, Failed=0) Status: OK (Delivered=1, Deferred=0, Failed=0)
Log: Log:
2025-09-10 14:32:15 | <= sender@example.com H=mail.example.com [10.0.0.1] P=esmtp S=1234 2025-09-11 08:32:15 | <= franziskus@adjuva.info H=mail.adjuva.info [10.0.0.1] P=esmtp S=2156
2025-09-10 14:32:47 | => recipient@example.de <recipient@example.de> R=dnslookup T=remote_smtp H=mx.example.de [10.0.0.2] 2025-09-11 08:32:47 | => user@t-online.de <user@t-online.de> R=dnslookup T=remote_smtp H=mx01.t-online.de [217.5.206.120]
------------------------------------------------------------------------
```
### Fehlgeschlagene Zustellung
```
[FAIL] ID=1v2L9Y-0005Ap-DE | First=2025-09-11 09:15:32 | From=franziskus@adjuva.info | Rcpts=blocked@t-online.de | Delivered=0 Deferred=0 Failed=1
------------------------------------------------------------------------
ID: 1v2L9Y-0005Ap-DE
First: 2025-09-11 09:15:32
Last: 2025-09-11 09:15:55
From: franziskus@adjuva.info
Rcpts: blocked@t-online.de
Status: FAIL (Delivered=0, Deferred=0, Failed=1)
Log:
2025-09-11 09:15:32 | <= franziskus@adjuva.info H=mail.adjuva.info [10.0.0.1] P=esmtp S=1847
2025-09-11 09:15:55 | ** blocked@t-online.de <blocked@t-online.de> R=dnslookup T=remote_smtp H=mx01.t-online.de [217.5.206.120]: SMTP error from remote mail server after RCPT TO:<blocked@t-online.de>: 550 requested action not taken: mailbox unavailable
------------------------------------------------------------------------ ------------------------------------------------------------------------
``` ```
@@ -138,32 +198,66 @@ Bei Delivery-Stalls:
Nach Installation über `./install.sh` ist das Script direkt verfügbar: Nach Installation über `./install.sh` ist das Script direkt verfügbar:
```bash ```bash
exitrace -m 1uwRvz-000Fz2-CI exitrace -FROM franziskus@adjuva.info -DOMAIN t-online.de -H 48
``` ```
Das Installationsscript erstellt automatisch einen Symlink in `~/bin` (ohne `.sh` Extension). **LUSER Environment Variable setzen (wichtig!):**
Umgebungsvariable für abweichenden Logpfad:
```bash ```bash
export LOGROOT="/var/log/custom" # Temporär
export LUSER="dein-username"
# Permanent in ~/.bash_env (empfohlen)
echo 'export LUSER="dein-username"' >> ~/.bash_env
source ~/.bash_env
``` ```
Logger-spezifisch ggf. in `~/.profile` ergänzen: **Verbindungstest:**
```bash ```bash
cd /var/log/easyname/$(date +%Y)/$(date +%m)/ # Test ob go-Tool verfügbar
go logger
# Test ob SSH funktioniert
ssh ${LUSER}@logger.in.nessus.at "hostname"
``` ```
--- ---
## Notes ## Troubleshooting
- Das Skript analysiert Exim-Logs im Format `/var/log/easyname/YYYY/MM/YYYY-MM-DD.log(.gz)` ### Häufige Probleme
- **Komprimierte Archive**: Automatische Erkennung und Verarbeitung von .gz-Dateien
- **Status-Logik**: Basiert auf SMTP-Response-Codes und typischen Exim-Nachrichten **"LUSER Variable nicht gesetzt"**
- Bei größeren Zeiträumen kann die Verarbeitung länger dauern ```bash
- Regex-Filter (-t, -G) sollten sorgfältig formuliert werden, um false positives zu vermeiden export LUSER="dein-username"
- Die Ausgabe ist nach chronologischem Erstkontakt der Message-ID sortiert ```
- **MX-Feature**: Benötigt `dig` für DNS-Abfragen
- Exit-Codes: 0 = OK (auch bei 0 Treffern), 1 = Fehlerhafte Parameter/Umgebung **"Permission denied" oder SSH-Fehler**
- Kerberos-Login: `kinit ${LUSER}@NESSUS.AT`
- SSH-Keys prüfen oder `go` Tool installieren
**"Keine Logfiles gefunden"**
- Zeitfenster zu eng: `-H 48` oder `-DAYS 3` probieren
- Dry-run verwenden: `exitrace -n -H 24`
**AWK-Errors**
- Regex-Syntax prüfen bei `-t` und `-G` Optionen
- Sonderzeichen escapen: `.*@example\.com`
### Performance-Tipps
- **Kleine Zeitfenster**: `-H 24` statt `-DAYS 7`
- **Spezifische Filter**: `-f` oder `-m` sind schneller als `-t`
- **Dry-Run nutzen**: `-n` zeigt Suchbereich ohne Ausführung
---
## Technical Notes
- **Remote-Ausführung**: Komplettes Script wird via SSH Heredoc übertragen
- **Log-Format**: `/var/log/easyname/YYYY/MM/YYYY-MM-DD.log(.gz)` auf logger
- **Status-Logik**: Basiert auf SMTP-Response-Codes und Exim-Nachrichten
- **Komprimierte Archive**: Automatische .gz-Verarbeitung via `zcat`
- **Chronologische Sortierung**: Nach Message-ID Erstkontakt
- **Exit-Codes**: 0 = OK (auch bei 0 Treffern), 1 = Parameter-/Verbindungsfehler
Built with the help of Claude Code Built with the help of Claude Code
File diff suppressed because it is too large Load Diff