Compare commits

...
75 Commits
Author SHA1 Message Date
loki 105395c62d Merge pull request 'Peignerpausz patch 1' (#22) from peignerpausz-patch-1 into main
Reviewed-on: #22
Reviewed-by: Loki <alexander@dominikus.one>
2026-09-24 17:15:54 +02:00
peignerpausz e0df6c5405 Repair an inconsistancy within sslchecker. Now it works both interactively as well as directly via cli 2026-09-24 16:53:51 +02:00
peignerpausz 083f42ca51 Added sslchecker.sh to domaintools 2026-09-16 17:52:06 +02:00
loki 2fca686b56 Merge pull request 'remove uneceesary update folder' (#20) from loki/remove_update_folder into main
Reviewed-on: #20
2026-09-07 11:26:32 +02:00
loki 9a4b1ef83d remove uneceesary update folder 2026-09-07 11:25:01 +02:00
loki c950d17582 Merge pull request 'improved wpchecker while in vacation' (#19) from peignerpausz-patch-1 into main
Reviewed-on: #19
Reviewed-by: Loki <alexander@dominikus.one>
2026-09-07 11:12:04 +02:00
peignerpausz e87a48cd7a improved wpchecker while in vacation 2026-09-07 10:01:17 +02:00
loki cf1852fd0a Merge pull request 'Peignerpausz patch 1' (#18) from peignerpausz-patch-1 into main
Reviewed-on: #18
Reviewed-by: Loki <alexander@dominikus.one>
2026-08-20 16:20:53 +02:00
peignerpausz 7c192a0e05 Merge branch 'main' into peignerpausz-patch-1 2026-08-20 14:24:58 +02:00
peignerpausz 83c3b620e9 Updated Main README.md of Repo to reflect addition of new scripts. 2026-08-20 14:19:56 +02:00
peignerpausz 6444a814b0 Improved domainchecker.sh (non-interactive and interactive), various addendums to the documentation. 2026-08-20 14:10:03 +02:00
loki 56c5255442 Merge pull request 'Moved domainchecker into domaintools and improved the barren previous version. Now interactive.' (#17) from peignerpausz-patch-1 into main
Reviewed-on: #17
Reviewed-by: Loki <alexander@dominikus.one>
2026-08-18 20:33:20 +02:00
peignerpausz d248af483d Moved domainchecker into domaintools and improved the barren previous version. Now interactive. 2026-08-18 18:01:06 +02:00
loki 495713b5c2 Merge pull request 'Peignerpausz patch 1' (#16) from peignerpausz-patch-1 into main
Reviewed-on: #16
Reviewed-by: Loki <alexander@dominikus.one>
2026-08-18 13:43:57 +02:00
peignerpausz 28f6958ae3 Fixed typo XD 2026-08-18 13:01:44 +02:00
peignerpausz 8685420f24 Initial commit of histodomain.sh 2026-08-18 12:59:13 +02:00
peignerpausz fdfe0f3594 Apparently adding domainchecker.sh. 2026-05-12 16:31:14 +02:00
peignerpausz 4863322ee3 Merge pull request 'peignerpausz-patch-1' (#15) from peignerpausz-patch-1 into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/15
Reviewed-by: Loki <alexander@dominikus.one>
2026-04-22 14:22:37 +02:00
peignerpausz 99a712ffa4 Added damagereport, improved adspam and donaspam and a Serverliste for internal refrence. And memes ofc. 2026-04-17 13:25:22 +02:00
peignerpausz e9f493bc63 Improved spamcheck with eyecatching emojis and thereby improving visability for adspam and donaspam 2026-04-15 17:10:47 +02:00
peignerpausz de44af64b4 Improved spamcheck and thereby donaspam and adspam 2026-04-15 13:31:27 +02:00
Patrick Eigner-Pausz a1046bda79 Added Spamcheck, adspam and donaspam-scritps for wh20 2026-04-14 14:04:35 +02:00
peignerpausz b361f27241 Merge pull request 'go-improved' (#13) from peignerpausz-patch-1 into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/13
Reviewed-by: Loki <alexander@dominikus.one>
2026-04-14 12:18:07 +02:00
Patrick Eigner-Pausz 55529624c2 Added missing log Option go logger 2026-04-14 12:15:51 +02:00
loki 473cf80c62 Merge pull request 'Added IP address exclusion' (#14) from loki/checkms_ip_addresses into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/14
2026-04-13 13:42:12 +02:00
loki bbe2db2700 Added IP address exclusion 2026-04-13 13:41:20 +02:00
peignerpausz a6ff8e5a6f go-improved
- go-Skript um Quicknav zu wh20, adino und inname-Server ergänzt
- go-Skript um Serverliste in Info-Text erweitert
2026-04-07 11:37:12 +02:00
loki 5ae6001157 Merge pull request 'Fix permission for mail.sh' (#12) from loki/fix_permission_mail.sh into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/12
2026-03-03 14:21:30 +01:00
loki fa2bf9d50d Fix permission for mail.sh 2026-03-03 14:21:05 +01:00
loki e283a519b8 Merge pull request 'added 'log' as Logger destination' (#11) from loki/add_logger_destination into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/11
2026-03-03 14:11:19 +01:00
loki 1bc0c2eb5e added 'log' as Logger destination 2026-03-03 14:10:44 +01:00
loki 50e0126dd3 Merge pull request 'fix permission for wh20.sh' (#10) from loki/fix_permission into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/10
2026-03-03 13:58:27 +01:00
loki 60856b0312 fix permission for wh20.sh 2026-03-03 13:57:31 +01:00
loki 84e6a6eefe Merge pull request 'fixing ip addresses output' (#9) from loki/fix_ip_addresses_output into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/9
2026-03-02 10:43:47 +01:00
loki aa7cab41d7 fixing ip addresses output 2026-03-02 10:43:27 +01:00
loki c299e074b8 Merge pull request 'fixed log navigation - thanks cursor' (#8) from loki/fix_checkms into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/8
2026-03-02 09:29:35 +01:00
loki fc48de8132 fixed log navigation - thanks cursor 2026-03-02 09:28:41 +01:00
loki 93089d6eac Merge pull request 'Enhance mail.sh to prevent file name collisions during downloads' (#7) from loki_bugfix_mail.sh into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/7
2026-01-28 12:51:41 +01:00
loki 00fac9ff89 Enhance mail.sh to prevent file name collisions during downloads 2026-01-28 12:51:19 +01:00
loki 52dfa9de5f Merge pull request 'added wh20 quick ssh connect script' (#6) from loki/mailing-project-menu into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/6
2025-12-30 13:32:36 +01:00
loki 75d5680364 added wh20 quick ssh connect script 2025-12-30 13:30:51 +01:00
loki 9810a03376 Merge pull request 'loki/mailing-project-menu' (#5) from loki/mailing-project-menu into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/5
2025-12-15 14:13:02 +01:00
loki 6116e9283e updated mail.sh README 2025-12-15 14:11:48 +01:00
loki 10b000feef Refactor mail.sh to enhance user input handling and project selection
- Replaced parameter input with interactive prompts for customer number and project selection.
- Updated remote directory path based on user-selected project.
- Adjusted local save path and file pattern to use the customer number input.
2025-12-15 14:08:59 +01:00
ljp 0d56365fcf Merge pull request 'added getIps.sh script' (#4) from getIps into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/4
2025-09-15 12:32:01 +02:00
loki b657d768ee added getIps.sh script 2025-09-15 12:04:43 +02:00
ljp c39398637b Merge pull request 'added reinis mysql_backup script, renamed it to mysqltool.sh, added README.md for mysqltool.sh' (#3) from peignerpausz/eign01 into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/3
2025-09-11 23:32:17 +02:00
ljp 1befa79366 Merge pull request 'feature/deploy-system' (#2) from feature/deploy-system into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/2
2025-09-11 17:56:20 +02:00
Philipp Ljubeko 6c0a9749d0 Merge branch 'main' of https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets into feature/deploy-system 2025-09-11 17:38:37 +02:00
Philipp Ljubeko f1f7babfd7 Merge branch 'feature/exitrace-modular' of https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets into feature/deploy-system 2025-09-11 17:09:20 +02:00
h0tznpl0tzandClaude 06647a1bf1 Improve deployment organization and bashrc structure
Script Organization:
- Deploy scripts to ~/scripts/ instead of ~/ directly
- Create proper symlinks ~/bin/script -> ~/scripts/script
- Libraries go to ~/scripts/lib_scriptname/ for better organization

Bashrc Improvements:
- Add modular .bashrc with .bash_env, .bash_aliases, .bash_paths
- Include HISTTIMEFORMAT and enhanced history settings
- Smart PATH detection - only adds ~/bin if not already present
- Proper bash completion and dircolors setup
- Maintains all original functionality from complex version

Deployment now creates clean, organized structure on target servers.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 16:25:37 +02:00
h0tznpl0tzandClaude 034018de87 Fix syntax error in select statement
Remove invalid stderr redirection from select statement.
Select cannot be redirected with >&2 syntax.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 16:21:53 +02:00
h0tznpl0tzandClaude 012d3158a0 Fix SSH target parsing bug in deploy.sh
- Redirect select UI output to stderr to prevent multiline capture
- Only SSH target goes to stdout for clean variable assignment
- Fixes 'invalid user name' error from corrupted ssh_target variable
- SSH connection now works properly like manual ssh command

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 16:19:28 +02:00
Patrick Eigner-Pausz 55efaf776d added reinis mysql_backup script, renamed it to mysqltool.sh, added README.md for mysqltool.sh 2025-09-11 16:03:02 +02:00
h0tznpl0tzandClaude 63121c71f8 Simplify deploy.sh following KISS principle
- Reduce from 419 to 230 lines (45% reduction)
- Replace complex find-based script detection with simple for loop
- Use bash select builtin instead of manual state management
- Consolidate server selection into single function
- Simplify bashrc deployment with direct PATH setup
- Remove unnecessary abstractions while preserving all features

Features preserved:
- Auto-detection of scripts via ~/bin symlinks
- Interactive script and server selection
- Support for web N, mx N, logger, support servers
- Bashrc deployment with PATH configuration
- Lib dependencies handling
- Dry-run functionality
- Symlink creation in ~/bin

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 15:48:14 +02:00
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 fb66a3a014 Add interactive deployment system for easyname server infrastructure
- Auto-detects scripts via symlinks in ~/bin
- Interactive script and server selection
- Supports bashrc deployment
- Handles lib/ dependencies
- Includes security improvements

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 15:14:57 +02:00
ljp ad6666d901 Merge pull request 'Added bashprofile for eign01' (#1) from peignerpausz/eign01 into main
Reviewed-on: https://vps.dominikus.one:3443/ljp/esn-support-bash-snippets/pulls/1
2025-09-11 15:08:08 +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
h0tznpl0tzandClaude 0774ed0729 Fix AWK array initialization error
- Initialize rcpts array properly to avoid scalar/array error
- Skip empty recipient strings in output formatting
- Ensures proper 2D array handling in AWK

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 15:02:08 +02:00
h0tznpl0tzandClaude aa6a470b0d Fix AWK regex syntax error in exitrace
- Fix unterminated regexp in deferred detection
- Simplify regex pattern for 'all hosts failing' detection
- Removes problematic single quote escaping in AWK

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 15:00:48 +02:00
h0tznpl0tzandClaude 7d5d4cb7b1 Refactor exitrace to remote execution model
- Complete rewrite following checkms pattern
- Remote execution on logger.in.nessus.at via SSH/go-tool
- Inline all functions for remote heredoc execution
- Remove lib/ directory - no longer needed
- Maintains full API compatibility
- Automatic fallback: go tool -> LUSER ssh -> error

Fixes issue where exitrace could not access logs on logger.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 14:59:00 +02:00
h0tznpl0tzandClaude 124337e0a4 Fix symlink resolution in exitrace
- Make SCRIPT_DIR robust for symlink execution
- Resolves lib/ dependency loading when called via ~/bin symlink
- Maintains compatibility with direct execution

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 14:29:52 +02:00
Patrick Eigner-Pausz 5877e71982 Added bashprofile for eign01 2025-09-11 14:23:30 +02:00
h0tznpl0tzandClaude 72537749c5 Fix file permissions for legacy scripts
- Make checkms.sh and go.sh executable
- Required for proper script execution

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 14:16:57 +02:00
h0tznpl0tzandClaude d1e28599c9 Refactor exitrace to modular architecture
- Split monolithic exitrace.sh into focused lib/ modules
- date_utils.sh: Date validation and generation functions
- mx_lookup.sh: MX record lookup functionality
- log_analyzer.awk: Core log analysis logic extracted from main script
- Maintains full backward compatibility with existing interface
- Improves maintainability, testability, and code organization

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 14:04:12 +02:00
loki a0ca330492 added adino and dona to plesk script 2025-09-11 13:10:50 +02:00
peignerpausz aa1fdc4811 README.md extended concerning adino and dona 2025-09-11 13:07:01 +02:00
peignerpausz 1e6c621dd9 now with the proper user name XD 2025-09-11 13:01:41 +02:00
= 530c4f730b added variations of plesk script for dona and adino 2025-09-11 12:56:49 +02:00
h0tznpl0tz bddb3cf1e9 Add exitrace tool and improve documentation
- Add exitrace: Enhanced Exim log analyzer with status classification
- Add Maintainer: ljp to all ljp-owned scripts
- Update READMEs: Use installer-compatible command examples
- Update main and legacy READMEs to include exitrace tool
2025-09-11 12:35:48 +02:00
h0tznpl0tzandClaude 84ecfaf278 Update legacy/README.md for new repository structure
- Changed title from "Connect Tools" to "Legacy Tools"
- Updated description and overview text
- Fixed outdated file paths (connect/ -> legacy/)
- Aligned with current repository structure

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 12:03:39 +02:00
h0tznpl0tzandClaude 87b5c60437 Update README for new repository structure
- Updated WH20 section: no longer empty, now includes plesk tool
- Fixed installer categories description
- Updated How-To examples (removed connect/ references)
- Fixed script extension examples (.sh)
- Aligned documentation with current repo structure

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 12:02:03 +02:00
h0tznpl0tz 10d3459678 Merge branch 'main' of http://vps.dominikus.one:3000/ljp/esn-support-bash-snippets 2025-09-11 12:00:44 +02:00
h0tznpl0tzandClaude 6036648d76 Update install.sh with auto-discovery and README with Quick Start
- Enhanced install.sh with script auto-discovery functionality
- Added Quick Start section to README with one-liner commands
- Created update.sh for repository updates
- Resolved merge conflicts from upstream changes

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 11:58:15 +02:00
45 changed files with 3817 additions and 168 deletions
+81 -11
View File
@@ -5,12 +5,14 @@ Hier sammeln wir kleine Helfer für Log-Analysen, Automatisierungen und typische
## Inhaltsverzeichnis
- [Quick Start](#quick-start)
- [Übersicht](#übersicht)
- [Bash-Profile](#bash-profile)
- [Connect Tools](#connect-tools)
- [Domaintools](#domaintools)
- [Legacy Snippets](#legacy-snippets)
- [WH20 Snippets](#wh20-snippets)
- [Installation](#installation)
- [Updates](#updates)
- [How-To: Neues Skript anlegen](#how-to-neues-skript-anlegen)
- [Lizenz / Sichtbarkeit](#lizenz--sichtbarkeit)
@@ -21,7 +23,8 @@ Hier sammeln wir kleine Helfer für Log-Analysen, Automatisierungen und typische
Die Skripte sind nach Kategorie getrennt:
- [**Bashprofiles**](./bashprofiles/README.md) – Optimierte Bash-Konfigurationen
- [**Legacy**](./legacy/README.md) – Snippets für Legacy-Umgebungen
- [**Domaintools**](./domaintools/README.md) - Tools für Domainabfragen
- [**Legacy**](./legacy/README.md) – Snippets für Legacy-Umgebungen (inkl. Connect Tools)
- [**WH20**](./wh20/README.md) – Snippets für WH20-Umgebungen
@@ -32,6 +35,17 @@ Optimierte Bash-Konfigurationen für verschiedene Support-Umgebungen:
- [`pl`](./bashprofiles/pl)
→ [Dokumentation & Beispiele](./bashprofiles/README.md)
Basis-Profil mit erweiterter History, farbigem Prompt und modularer Struktur
- [`eign01`](./bashprofiles/eign01/)
Sicherungskopie der aktuellen `.bashrc` von `eign01`.
## Domaintools
- [`domainchecker`](./domaintools/domainchecker/README.md)
Tool zur `dig`-Massenabfrage von Domains und DNS-Records.
- [`histodomain`](./domaintools/histodomain/README.md)
Abfrage zu historischen DNS-Einträgen über die [Securitytrails-API](https://securitytrails.com).
- [`sslchecker`](./domaintools/sslchecker/README.md)
Tool zur schnellen SSL-Prüfung mehrerer Domains gleichzeitig.
## Legacy Snippets
@@ -44,10 +58,36 @@ Optimierte Bash-Konfigurationen für verschiedene Support-Umgebungen:
- [`pincMails`](./legacy/pincMails)
Sucht nach versendeten PINC Mails einer bestimmten Kundennummer und kopiert diese in einen lokalen Unterordner
- [`exitrace`](./legacy/exitrace)
Exim-Log-Trace & Status für einzelne Mails/Adressen/Domain-Ziele mit Status-Klassifikation (OK/PARTIAL/DELAY/FAIL)
## WH20 Snippets
- [`plesk`](./wh20/plesk)
Dieses Skript stellt eine SSH-Verbindung zu einem angegebenen Webserver her und generiert so einen einmaligen Login-Link für das Plesk Admin Panel des gewünschten Servers.
- [`wh20`](./wh20/wh20)
Dieses Skript verbindet zum angegbenen Webserver via SSH
- [`damagecontrol`](./wh20/damagereport)
Dieses Skript ermöglicht die kombinierte Abfrage zu geläufigen Problemen mit MS365-Empfängern über [`checkms`](./legacy/checkms), [`adspam`](./wh20/adspam), [`donaspam`](wh20/donaspam) sowie [`spamcheck` selbst](.wh20/spamcheck).
- [`adspam`](./adspam)
Dieses Skript ermöglicht die Prüfung auf geläufige MS365- und Spamhaus-Fehlermeldungen auf Adino-Servern direkt von der Connect aus.
- [`donaspam`](./donaspam)
Dieses Skript ermöglicht die Prüfung auf geläufige MS365- und Spamhaus-Fehlermeldungen auf inname-Servern direkt von der Connect aus.
- [`spamcheck`](./spamcheck)
Dieses Skript ermöglicht die Prüfung auf geläufige MS365- und Spamhaus-Fehlermeldungen auf einem Plesk-Server.
---
## Quick Start
**One-liner Installation:**
```bash
git clone http://vps.dominikus.one:3000/ljp/esn-support-bash-snippets.git esn-support-tools && cd esn-support-tools && ./install.sh
```
**One-liner Update:**
```bash
cd esn-support-tools && ./update.sh
```
## Installation
@@ -56,7 +96,10 @@ Nach dem Klonen des Repositories steht ein interaktives Installationsscript zur
```bash
# Repository klonen
git clone http://vps.dominikus.one:3000/ljp/esn-support-bash-snippets.git
cd esn-support-bash-snippets
# WICHTIG: Repository umbenennen (empfohlen)
mv esn-support-bash-snippets esn-support-tools
cd esn-support-tools
# Installation testen (empfohlen)
./install.sh --dry-run
@@ -68,6 +111,26 @@ cd esn-support-bash-snippets
./install.sh --help
```
> **⚠️ Wichtiger Hinweis zu Symlinks:**
> Das Installationsscript erstellt Symlinks zu den Scripts im **aktuellen Repository-Pfad**.
> Wenn du das Repository später verschiebst oder umbenennst, funktionieren die installierten Tools nicht mehr.
> **Empfehlung:** Repository vor der Installation in einen permanenten Pfad legen (z.B. `~/tools/esn-support-tools`).
## Updates
Für Updates bestehender Installationen:
```bash
# In Repository-Verzeichnis wechseln
cd /pfad/zu/esn-support-tools
# Update testen (empfohlen)
./update.sh --dry-run
# Update durchführen
./update.sh
```
**Features des Installers:**
- **Dry-Run Modus**: `--dry-run` testet Installation ohne Dateiveränderungen
- **Interaktive Auswahl**: Kategorien und einzelne Tools wählbar
@@ -78,9 +141,8 @@ cd esn-support-bash-snippets
**Verfügbare Kategorien:**
- **Bash-Profile**: .bashrc Optimierungen und modulare Konfiguration
- **Connect Tools**: SSH-Shortcuts (go-Tool) mit Kerberos-Setup
- **Legacy Tools**: checkms, quicknav für Legacy-Infrastruktur
- **WH20 Tools**: Platzhalter für zukünftige WH20-Tools
- **Legacy Tools**: checkms, go, pincMails, exitrace für Legacy-Infrastruktur
- **WH20 Tools**: plesk für WH20-Infrastruktur
@@ -89,10 +151,10 @@ cd esn-support-bash-snippets
Um ein neues Bash-Skript in dieses Repository aufzunehmen, bitte folgende Schritte:
1. **Ordnerstruktur anlegen**
Je nach Kategorie (`bashprofiles`, `connect`, `legacy` oder `wh20`) einen Unterordner erstellen:
Je nach Kategorie (`bashprofiles`, `domaintools`, `legacy` oder `wh20`) einen Unterordner erstellen:
```
bashprofiles/<username>/
connect/<scriptname>/
domaintools/<scriptname>/
legacy/<scriptname>/
wh20/<scriptname>/
```
@@ -100,6 +162,10 @@ Um ein neues Bash-Skript in dieses Repository aufzunehmen, bitte folgende Schrit
2. **Skript hinzufügen**
Das eigentliche Skript im neuen Ordner ablegen:
```
domaintools/<scriptname>/<scriptname>
```
oder
```
legacy/<scriptname>/<scriptname>
```
oder
@@ -108,8 +174,8 @@ Um ein neues Bash-Skript in dieses Repository aufzunehmen, bitte folgende Schrit
```
und ausführbar machen:
```bash
chmod +x legacy/<scriptname>/<scriptname>
chmod +x wh20/<scriptname>/<scriptname>
chmod +x legacy/<scriptname>/<scriptname>.sh
chmod +x wh20/<scriptname>/<scriptname>.sh
```
3. **README.md erstellen**
@@ -117,6 +183,10 @@ Um ein neues Bash-Skript in dieses Repository aufzunehmen, bitte folgende Schrit
[README_template_script.md](./README_template.md)
→ kopieren, anpassen und ins Skript-Verzeichnis legen:
```
domaintools/<scriptname>/README.md
```
oder
```
legacy/<scriptname>/README.md
```
oder
@@ -127,7 +197,7 @@ Um ein neues Bash-Skript in dieses Repository aufzunehmen, bitte folgende Schrit
4. **Übersicht aktualisieren**
Das Skript in die Übersicht der passenden Kategorie-README eintragen:
- [`bashprofiles/README.md`](./bashprofiles/README.md)
- [`connect/README.md`](./connect/README.md)
- [`domaintools/README.md`](./domaintools/README.md)
- [`legacy/README.md`](./legacy/README.md)
- [`wh20/README.md`](./wh20/README.md)
+26
View File
@@ -0,0 +1,26 @@
### CUSTOM ALIASES BASH FILE ###
# Schutz vor versehentlichem Überschreiben
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
# Navigation
alias ..='cd ..'
alias ...='cd ../..'
# Komfort
alias grep='grep --color=auto'
alias df='df -h'
alias free='free -m'
# Netzwerk-Shortcuts
alias ip4='ip -4 -brief addr'
alias ip6='ip -6 -brief addr'
alias myip='curl -s https://ifconfig.me || true'
# LS Aliase
alias ls='ls --color=auto'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
+14
View File
@@ -0,0 +1,14 @@
### CUSTOM ENV BASH FILE ###
# Standard-User für interne Tools
export LUSER="${LUSER:-peignerpausz}"
export WHUSER="${WHUSER:-peignerpausz}"
# sinnvolle Defaults
export EDITOR="${EDITOR:-vi}"
export PAGER="${PAGER:-less}"
export LESSHISTFILE=-
export GPG_TTY=$(tty 2>/dev/null || true)
# LS Optionen (wird von ls-Alias genutzt)
export LS_OPTIONS='--color=auto -h'
+18
View File
@@ -0,0 +1,18 @@
### CUSTOM PATH BASH FILE ###
# ~/bin und ~/.local/bin vorne anhängen, falls vorhanden
if [ -d "$HOME/bin" ]; then
case ":$PATH:" in
*":$HOME/bin:"*) : ;;
*) PATH="$HOME/bin:$PATH" ;;
esac
fi
if [ -d "$HOME/.local/bin" ]; then
case ":$PATH:" in
*":$HOME/.local/bin:"*) : ;;
*) PATH="$HOME/.local/bin:$PATH" ;;
esac
fi
export PATH
+66
View File
@@ -0,0 +1,66 @@
# CLEANED UPDATED BASHRC
# ~/.bashrc — interactive non-login shells
# Exit early if non-interactive
case $- in
*i*) ;;
*) return;;
esac
##### History #####
HISTCONTROL=ignoreboth:erasedups
shopt -s histappend
HISTSIZE=99999999
HISTFILESIZE=99999999
HISTTIMEFORMAT="%Y-%m-%d %T "
PROMPT_COMMAND='history -a; history -n'
shopt -s cmdhist
shopt -s lithist
shopt -s checkwinsize
##### Debian chroot prompt helper #####
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
##### Prompt #####
if [ -x /usr/bin/tput ] && tput setaf 1 >/dev/null 2>&1; then
color_prompt=yes
else
color_prompt=
fi
if [ "$color_prompt" = yes ]; then
PS1='\[\033[01;31m\]\u\[\033[01;33m\]@\[\033[01;36m\]\h \[\033[01;33m\]\w \[\033[01;35m\]\$ \[\033[00m\]'
else
PS1='\u@\h \w \$ '
fi
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
esac
##### LS-Farben & dircolors #####
if [ -x /usr/bin/dircolors ]; then
if [ -r "$HOME/.dircolors" ]; then
eval "$(dircolors -b "$HOME/.dircolors")"
else
eval "$(dircolors -b)"
fi
fi
##### Bash-Completion #####
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
##### Ausgelagerte Dateien #####
[ -f "$HOME/.bash_aliases" ] && . "$HOME/.bash_aliases"
[ -f "$HOME/.bash_env" ] && . "$HOME/.bash_env"
[ -f "$HOME/.bash_paths" ] && . "$HOME/.bash_paths"
Executable
+258
View File
@@ -0,0 +1,258 @@
#!/usr/bin/env bash
# deploy.sh - Einfaches Deployment-Tool für esn-support-bash-snippets
# Maintainer: ljp
#
# Erkennt installierte Scripts in ~/bin und ermöglicht einfache Auswahl
set -euo pipefail
# Prüfe LUSER Environment
LUSER="${LUSER:?Bitte LUSER setzen! (siehe go-Script)}"
# Script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BIN_DIR="$HOME/bin"
usage() {
cat <<'USAGE'
Usage: deploy.sh
EINFACHES DEPLOYMENT:
- Erkennt automatisch installierte Scripts in ~/bin
- Einfache Auswahl mit bash select
- Einfache Server-Auswahl (web, mx, logger, support)
- Optional: bashrc deployment
FEATURES:
- Auto-Detection von Scripts in ~/bin
- Symlink-basiertes Deployment
- PATH-Setup für target servers
- Dry-run verfügbar
ENVIRONMENT:
LUSER Required: Username für SSH-Verbindungen
USAGE
}
# Einfache Script-Detection
get_deployable_scripts() {
local scripts=()
[[ ! -d "$BIN_DIR" ]] && { echo "Warnung: $BIN_DIR existiert nicht" >&2; return 0; }
# Finde alle Symlinks die auf unser Repository zeigen
for symlink in "$BIN_DIR"/*; do
[[ -L "$symlink" ]] || continue
local target=$(readlink -f "$symlink" 2>/dev/null || continue)
[[ "$target" == "$SCRIPT_DIR"* ]] || continue
scripts+=("$(basename "$symlink")")
done
printf '%s\n' "${scripts[@]}" | sort
}
# Einfache Server-Auswahl (nur Target zurückgeben)
select_server() {
local servers=("web" "mx" "logger" "support")
local server
select server in "${servers[@]}"; do
[[ -n "$server" ]] || { echo "Ungültige Auswahl" >&2; continue; }
case "$server" in
web|mx)
echo -n "Server-Nummer eingeben: " >&2
read -r number
[[ "$number" =~ ^[0-9]+$ ]] || { echo "Ungültige Nummer" >&2; continue; }
echo "${LUSER}@${server}${number}.in.easyname.com"
return 0
;;
logger)
echo "${LUSER}@logger.in.nessus.at"
return 0
;;
support)
echo "${LUSER}@support.in.easyname.com"
return 0
;;
esac
done
}
# Einfaches Script-Deployment
deploy_script() {
local script_name="$1"
local ssh_target="$2"
local dry_run="$3"
# Folge Symlink zum Original
local symlink_path="$BIN_DIR/$script_name"
[[ -L "$symlink_path" ]] || { echo "Fehler: $script_name ist kein Symlink" >&2; return 1; }
local original_script=$(readlink -f "$symlink_path")
local script_dir=$(dirname "$original_script")
echo "=== Deploying $script_name to $ssh_target ==="
if (( dry_run )); then
echo " [DRY-RUN] Würde deployment ausführen:"
echo " Script: $original_script -> ~/$script_name"
echo " Symlink: ~/bin/$script_name -> ~/$script_name"
[[ -d "$script_dir/lib" ]] && echo " Lib: $script_dir/lib/ -> ~/lib_$script_name/"
return 0
fi
# Deployment ausführen - ordentlich in ~/scripts/
ssh "$ssh_target" "mkdir -p ~/scripts ~/bin"
scp "$original_script" "$ssh_target:scripts/$script_name"
ssh "$ssh_target" "chmod +x ~/scripts/$script_name && ln -sf ~/scripts/$script_name ~/bin/$script_name"
# Lib-Dependencies falls vorhanden
if [[ -d "$script_dir/lib" ]]; then
echo " Deploying lib dependencies..."
scp -r "$script_dir/lib" "$ssh_target:scripts/lib_$script_name"
ssh "$ssh_target" "sed -i 's|\$SCRIPT_DIR/lib/|~/scripts/lib_$script_name/|g' ~/scripts/$script_name"
fi
echo " ✓ $script_name deployed successfully"
}
# Einfaches bashrc-Deployment
deploy_bashrc() {
local ssh_target="$1"
local dry_run="$2"
echo "=== Deploying bashrc to $ssh_target ==="
if (( dry_run )); then
echo " [DRY-RUN] Würde default bashrc mit PATH-Setup erstellen"
return 0
fi
# Erstelle modulare .bashrc + config files
ssh "$ssh_target" 'cat > .bashrc << "EOF"
# .bashrc - Optimierte Bash-Konfiguration für easyname Support
##### History #####
HISTCONTROL=ignoredups:erasedups
HISTSIZE=50000
HISTFILESIZE=100000
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
shopt -s histappend
shopt -s cmdhist
##### Prompt #####
if [[ "$TERM" != "dumb" ]]; then
PS1="\[\e[01;32m\]\u@\h\[\e[00m\]:\[\e[01;34m\]\w\[\e[00m\]\\$ "
fi
##### Modular configs #####
[[ -f ~/.bash_aliases ]] && source ~/.bash_aliases
[[ -f ~/.bash_env ]] && source ~/.bash_env
[[ -f ~/.bash_paths ]] && source ~/.bash_paths
##### Standard settings #####
if [[ -f /etc/bash_completion ]]; then
source /etc/bash_completion
fi
if [[ -x /usr/bin/dircolors ]]; then
eval "$(dircolors -b)"
fi
# Built with the help of Claude Code
EOF'
# Erstelle modulare Config-Files mit PATH-Check
ssh "$ssh_target" 'echo "# Add your custom aliases here" > .bash_aliases'
ssh "$ssh_target" 'echo "# Add your PATH extensions here" > .bash_paths'
# Prüfe ob ~/bin bereits in PATH ist, wenn nicht -> zu .bash_env hinzufügen
ssh "$ssh_target" 'if [[ ":$PATH:" != *":$HOME/bin:"* ]]; then
echo "# Add ~/bin to PATH for deployed scripts" > .bash_env
echo "export PATH=\"\$HOME/bin:\$PATH\"" >> .bash_env
else
echo "# Add your environment variables here" > .bash_env
fi'
echo " ✓ bashrc deployed successfully"
}
# MAIN - Vereinfachte Ausführung
main() {
# Argument parsing
local dry_run=0
while [[ $# -gt 0 ]]; do
case "$1" in
-n|--dry-run) dry_run=1; shift ;;
-h|--help) usage; exit 0 ;;
*) echo "Unbekannte Option: $1" >&2; usage; exit 1 ;;
esac
done
echo "=== easyname Support Scripts Deployment ==="
echo
# Script-Auswahl
local -a available_scripts
mapfile -t available_scripts < <(get_deployable_scripts)
[[ "${#available_scripts[@]}" -eq 0 ]] && {
echo "Keine deployable Scripts in $BIN_DIR gefunden" >&2
exit 1
}
echo "Verfügbare Scripts:"
local script
select script in "${available_scripts[@]}" "ALL SCRIPTS"; do
[[ -n "$script" ]] && break
echo "Ungültige Auswahl"
done
# Server-Auswahl
echo "=== Server-Auswahl ==="
local ssh_target
ssh_target=$(select_server)
# Optionen
echo -n "Bashrc auch deployen? [y/N]: "
read -r deploy_bashrc_choice
local deploy_bashrc=0
[[ "$deploy_bashrc_choice" =~ ^[yY]$ ]] && deploy_bashrc=1
# Bestätigung
echo
echo "=== Deployment-Zusammenfassung ==="
echo "Target: $ssh_target"
echo "Scripts: $script"
[[ "$deploy_bashrc" -eq 1 ]] && echo "Bashrc: Ja"
[[ "$dry_run" -eq 1 ]] && echo "Modus: DRY-RUN"
echo
echo -n "Deployment starten? [y/N]: "
read -r confirm
[[ "$confirm" =~ ^[yY]$ ]] || { echo "Abgebrochen."; exit 0; }
# Deployment ausführen
echo
echo "=== Deployment wird ausgeführt ==="
# Bashrc deployment
(( deploy_bashrc )) && deploy_bashrc "$ssh_target" "$dry_run"
# Script deployment
if [[ "$script" == "ALL SCRIPTS" ]]; then
for s in "${available_scripts[@]}"; do
deploy_script "$s" "$ssh_target" "$dry_run"
done
else
deploy_script "$script" "$ssh_target" "$dry_run"
fi
echo
echo "=== Deployment abgeschlossen ==="
[[ "$dry_run" -eq 1 ]] && echo "(DRY-RUN - nichts wurde tatsächlich deployed)"
}
# Script starten
main "$@"
# Built with the help of Claude Code
+73
View File
@@ -0,0 +1,73 @@
# Domain Tools
Sammlung von Bash-Skripten für diversen Abfragen zu Domains. Enthält Tools zur Massenabfrage von DNS-Einträgen sowie zur Anzeige historischer DNS-Einträge.
---
### Inhaltsverzeichnis
- [Übersicht](#Übersicht)
- [Enthaltene Tools](#enthaltene-Tools)
- [Voraussetzungen](#Voraussetzungen)
- [Lizenz/Sichtbarkeit](#lizenz--sichtbarkeit)
---
## Übersicht
******
---
## enthaltene Tools
### [`domainchecker`](./domainchecker/)
Tool zur dig-Massenabfrage von Domains und DNS-Records.
- [Dokumentation & Beispiele](./domainchecker/README.md)
### [`histodomain`](./histodomain/)
Abfrage zu historischen DNS-Einträgen über die Securitytrails-API.
- [Dokumentation & Beispiele](./histodomain/README.md)
### [`sslchecker`](./sslchecker/)
Tool zur schnellen SSL-Prüfung mehrerer Domains gleichzeitig.
---
## Voraussetzungen
### generelle Voraussetzungen
- kann auch von außerhalb der Connect genutzt werden, sofern eine lokale `bash` verwendbar ist
- **Kerberos-Setup**: Funktionierende Kerberos-Konfiguration
- **SSH-Zugriff**: Berechtigungen für easyname-Infrastruktur
### Setup-Anleitung
1. Kerberos-Ticket erstellen:
```bash
kinit deinusername@NESSUS.AT
# oder mit go-Tool:
go kinit
```
2. Tool in PATH hinzufügen oder Alias erstellen:
```bash
# Option 1: Alias
alias domainchecker="/pfad/zu/domaintools/domainchecker/domainchecker.sh"
# Option 2: Symlink
ln -s /pfad/zu/domaintools/domainchecker/domainchecker.sh ~/bin/domainchecker
```
---
## Lizenz / Sichtbarkeit
> Dieses Repository ist **intern** für easyname Support.
> Falls eine Freigabe nach extern geplant ist, bitte vorab mit Teamleitung abklären.
---
*Diese Tools wurden mit Hilfe von Microsoft Copilot erstellt.*
+96
View File
@@ -0,0 +1,96 @@
# domainchecker
Domainchecker für schnelle Prüfung eines beliebigen DNS-Records für eine beliebige Anzahl an Domains
---
## Features
- Ausgabe einer Liste von DNS-Records für eine beliebige in einem Array übergebene Anzahl Domains
---
## Installation
1. Repository klonen oder Skript kopieren:
```bash
git clone git.in.loki-net.at/esn-support-bash-snippets.git
cd esn-support-bash-snippets/domaintools/domainchecker
chmod +x domainchecker.sh
```
2. Abhängigkeiten (falls vorhanden) installieren:
- dnsutils (dig), also vorinstalliert auf connect-lej.
---
## Nutzung
### Standardaufruf
```bash
./domainchecker.sh
```
### Beispiele
```bash
bash domainchecker.sh
> Welche Domains sollen gesucht werden?
> domain1.tld domain2.tld domain3.tld domain4.tld
> Welcher Record soll untersucht werden?
> A
domain1.tld A-Records:
⤷
====
domain2.tld A-Records:
⤷91.151.18.26
====
domain3.tld A-Records:
⤷91.151.18.26
====
domain4.tld A-Records:
⤷91.151.18.28
====
```
---
## Optionen
```
Usage: ./<scriptname> [OPTIONS]
--help Zeigt diese Hilfe
--option Beispieloption
YYYY-MM-DD Beispiel für Datumsargument
```
---
## Beispielausgabe
```
Hier ein Beispieloutput des Skripts.
```
```
---
## Setup-Hinweise
Falls notwendig, Alias in `~/.bashrc` setzen:
```bash
alias <scriptname>='~/pfad/zum/repo/<legacy|wh20>/<scriptname>/<scriptname>'
```
Logger-spezifisch ggf. in `~/.profile` ergänzen:
```bash
cd /var/log/easyname/$(date +%Y)/$(date +%m)/
```
---
## Notes
- Weitere Hinweise, Einschränkungen, Besonderheiten
- Ggf. bekannte Bugs oder ToDos
@@ -0,0 +1,70 @@
#! /usr/bin/env bash
# Domainchecker für schnelle Prüfung der MX-Records
# Maintainer: peignerpausz
# Version: 1.2
set -eo pipefail
declare -a DOMAINS=()
declare -a RECORDS=()
usage() {
cat <<USAGE
Verwendung:
$0 [OPTIONEN]
Oder interaktiv: $0
Optionen:
-d, --domains DOMAIN [DOMAINS...]
Zu prüfende Domains
-r, --records RECORD [RECORDS...]
Zu prüfende DNS-Records, z.B. A MX TXT
-h, --help
Diese Hilfe anzeigen
Beispiele:
$0 -d domain1.tld domain2.tld -r MX TXT
$0 --domains domain1.tld domain2.tld --records MX TXT
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
-d | --domains)
shift
while [[ $# -gt 0 && "$1" != -* ]]; do
DOMAINS+=("$1")
shift
done
;;
-r | --records)
shift
while [[ $# -gt 0 && "$1" != -* ]]; do
RECORDS+=("$1")
shift
done
;;
-h | --help)
usage
exit 0
;;
esac
done
[[ ${#DOMAINS[@]} -eq 0 ]] && read -ra DOMAINS -p "Welche Domains sollen gesucht werden? " DOMAINS
[[ ${#RECORDS[@]} -eq 0 ]] && read -ra RECORDS -p "Welcher Records sollen gesucht werden? "
for domain in "${DOMAINS[@]}"; do
printf "\n==== %s ====\n" "$domain"
for record in "${RECORDS[@]}"; do
printf "++++ %s ++++\n" "$record"
result=$(dig +short "$record" "$domain")
if [[ -n "$result" ]]; then
printf "%s" "$result"
else
printf "Keine Einträge gefunden."
fi
echo
done
done
+80
View File
@@ -0,0 +1,80 @@
# histodomain - historische DNS-Abfragen
Skript zur schnellen Abfrage historischer Domain-Records im json-Format. Zur Abfrage wird ein API-Key von Securitytrails.com benötigt.
---
## Features
- Abfrage historischer DNS-Records inklusive TTLs und Prioritäten
---
## Installation
1. Repository klonen oder Skript kopieren:
```bash
git clone git.int.loki-net.at/esn-support-bash-snippets.git
cd esn-support-bash-snippets/domaintools/histodomain
chmod +x histodomain
```
---
## Nutzung
### Standardaufruf
```bash
./histodomain.sh
```
### Beispiele
```bash
./<scriptname> --option foo
./<scriptname> 2025-09-08
```
---
## Optionen
```
Usage: ./<scriptname> [OPTIONS]
--help Zeigt diese Hilfe
--option Beispieloption
YYYY-MM-DD Beispiel für Datumsargument
```
---
## Beispielausgabe
Hier ein Beispieloutput des Skripts.
``` bash
histodomain
> Welche Domain?
> domain.tld
> Welcher DNS-Typ?
> a
> API-Key für Securitytrails angeben:
```
---
## Setup-Hinweise
Falls notwendig, Alias in `~/.bashrc` setzen:
```bash
alias <scriptname>='~/pfad/zum/repo/domaintools/histodomain/histodomain.sh'
```
---
## Notes
- Free-Version von Securitytrails ermöglicht bis zu 50 kostenlose Abpfragen über die API/Monat
- To-Do
- Non-interaktive Version bauen
+43
View File
@@ -0,0 +1,43 @@
#!/usr/bin/env bash
# Domaintool zum Abfragen von historischen DNS-Einträgen über die Securitytrails-API
# Maintainer: peignerpausz
# Version: 1
set -eou pipefail
usage() {
cat <<USAGE
Verwendung:
histodomain
> Welche Domain? Domain ohne http oder https!
> domain.tld
> Welcher DNS-Typ? Eintrag in lower case!
> a/aaaa/txt/ns/soa/...
USAGE
}
echo "Welche Domain? Achtung: Domain ohne http oder https! "
read domain
if [[ -z "$domain" ]]; then
{
echo -e "Fehler: keine Domain angegeben. \n" >&2
usage
exit 1
}
fi
echo "Welcher DNS-Typ? Achtung: Eintrag in lower case! "
read dnstype
if [[ -z "$dnstype" ]]; then
{
echo -e "Fehler: keinen DNS-Typ angegeben. \n" >&2
usage
exit 1
}
fi
# Prüfung ob Securitytrails-API-Key übergeben wurde oder als Umgebungsvariable existiert.
if [[ -z "$SECURITYTRAILSAPI" ]]; then
read -rsp "API-Key für Securitytrails angeben: " SECURITYTRAILSAPI
echo
fi
# Hier folgt die eigentliche Abfrage über die Securitytrails-API.
curl --request GET --url \
https://api.securitytrails.com/v1/history/$domain/dns/$dnstype \
--include --header "APIKEY: $SECURITYTRAILSAPI" --header 'Accept: application/json'
+101
View File
@@ -0,0 +1,101 @@
# SSLChecker
Skript zum schnellen Prüfen der Gültigkeit und des Typs von SSL-Certs
---
## Features
- Prüft Gültigkeit
- Prüft Typ (LE oder was anderes)
- Prüft Restgültigkeit des SSL-Certs
---
## Installation
1. Repository klonen oder Skript kopieren:
```bash
git clone git.in.loki-net.at/esn-support-bash-snippets.git
cd esn-support-bash-snippets/domaintools/sslchecker
chmod +x sslchecker.sh
```
2. Abhängigkeiten (falls vorhanden) installieren:
- `curl`
- `openssl`
- beide auf der connect vorinstalliert
---
## Nutzung
### Standardaufruf
```bash
./sslchecker.sh
```
### Beispiele
```bash
./sslchecker.sh -d domain1.tld domain2.tld domain3.tld -t le
```
---
## Optionen
```
Verwendung:
bash sslchecker.sh [OPTIONEN]
Oder interaktiv: bash sslchecker.sh
Optionen:
-d, --domains DOMAIN [DOMAINS...]
Zu prüfende Domains
-t, --type Typ
Prüft gegen erwarteten Issuer, etwa Let's Encrypt, Sectigo oder GlobalSign
-h, --help
Diese Hilfe anzeigen
```
---
## Beispielausgabe
```
bash sslchecker.sh -d ironsites.at myrealis.at orf.at -t le
+++SSLCHECKER v0.1+++
====== ironsites.at =========
OK valid SSL
OK SSL-Zertifikat gültig bis Nov 1 23:23:54 2026 GMT (46 Tage verbleibend)
OK Cert ist von Let's Encrypt
====== myrealis.at =========
OK valid SSL
OK SSL-Zertifikat gültig bis Nov 5 07:16:41 2026 GMT (49 Tage verbleibend)
OK Cert ist von Let's Encrypt
====== orf.at =========
OK valid SSL
OK SSL-Zertifikat gültig bis Jan 3 08:17:00 2027 GMT (108 Tage verbleibend)
X Cert ist nicht von Let's Encrypt (gefunden: GlobalSign nv-sa)
```
---
## Setup-Hinweise
Falls notwendig, Alias in `~/.bashrc` setzen:
```bash
alias sslchecker='~/esn-support-tools/domaintools/sslchecker/sslchecker.sh'
```
---
## Notes
- To-Do:
Timeouts abfangen
eventuell Umbau auf `openssl` statt `curl`
Optionen ausbauen
+119
View File
@@ -0,0 +1,119 @@
#!/usr/bin/env bash
# Tool zum Prüfen von SSL-Gültigkeit mehrer Domains
# Maintainer: peignerpausz
set -o pipefail
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
RESET="\033[0m"
declare -a DOMAINS
usage() {
cat <<USAGE
Verwendung:
bash $0 [OPTIONEN]
Oder interaktiv: bash $0
Optionen:
-d, --domains DOMAIN [DOMAINS...]
Zu prüfende Domains
-t, --type
Prüft gegen erwarteten Issuer, etwa Let's Encrypt, Sectigo oder GlobalSign
-h, --help
Diese Hilfe anzeigen
Beispiele:
$0 -d domain1.tld domain2.tld -t le
$0 --domains domain1.tld domain2.tld --type le
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
-d | --domains)
shift
while [[ $# -gt 0 && "$1" != -* ]]; do
DOMAINS+=("$1")
shift
done
;;
-t | --type)
ISSUER="$2"
case "$ISSUER" in
le)
EXPECTED_ISSUER="Let's Encrypt"
;;
digicert)
EXPECTED_ISSUER="DigiCert"
;;
sectigo)
EXPECTED_ISSUER="Sectigo"
;;
global)
EXPECTED_ISSUER="GlobalSign"
;;
*)
echo "Fehler: Ungültiger Typ '$ISSUER'"
echo "Erlaubte Werte: le, digicert, sectigo, global"
exit 1
;;
esac
shift 2
;;
-h | --help)
usage
exit 0
;;
*)
echo "Unbekannte Option: $1"
usage
exit 1
;;
esac
done
printf "+++SSLCHECKER v0.1+++\n"
[[ ${#DOMAINS[@]} -eq 0 ]] && read -ra DOMAINS -p "Welche Domains sollen gesucht werden? " DOMAINS
for domain in "${DOMAINS[@]}"; do
printf "\n========= %s =========\n" "$domain"
VALIDITY=$(curl -vI https://$domain 2>&1 | grep -F "SSL certificate verify ok")
EXPIRE=$(echo | openssl s_client -connect $domain:443 -servername $domain 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
ISSUER=$(echo | openssl s_client -connect "$domain:443" -servername "$domain" 2>/dev/null |
openssl x509 -noout -issuer |
grep -o 'O *= *[^,]*' |
sed 's/O *= *//')
expire_ts=$(date -d "$EXPIRE" +%s)
now_ts=$(date +%s)
days_left=$(((expire_ts - now_ts) / 86400))
if [[ -n "$VALIDITY" ]]; then
printf "${GREEN}OK${RESET} valid SSL\n"
else
printf "${RED}X${RESET} not valid SSL\n"
fi
if [ "$days_left" -lt 0 ]; then
printf "${RED}CRITICAL${RESET} Zertifikat ist seit %d Tagen abgelaufen (%s)\n" "$((-days_left))" "$EXPIRE"
elif [ "$days_left" -lt 7 ]; then
printf "${RED}CRITICAL${RESET} Zertifikat läuft in %d Tagen ab (%s)\n" "$days_left" "$EXPIRE"
elif [ "$days_left" -lt 30 ]; then
printf "${YELLOW}WARNING${RESET} SSL-Zertifikat läuft in $days_left Tagen ab ($EXPIRE)\n"
else
printf "${GREEN}OK${RESET} SSL-Zertifikat gültig bis $EXPIRE ($days_left Tage verbleibend)\n"
fi
if [[ -n $EXPECTED_ISSUER ]]; then
if [[ "$ISSUER" == *"$EXPECTED_ISSUER"* ]]; then
printf "${GREEN}OK${RESET} Cert ist von %s" "$EXPECTED_ISSUER"
else
printf "${YELLOW}X${RESET} Cert ist nicht von %s (gefunden: %s)" "$EXPECTED_ISSUER" "$ISSUER"
fi
else
printf "${GREEN}INFO${RESET} Cert-Aussteller: %s" "$ISSUER"
fi
printf "\n"
done
+237 -60
View File
@@ -1,5 +1,6 @@
#!/usr/bin/env bash
# install.sh - Installationsscript für easyname Support Bash-Snippets
# Maintainer: ljp
# Modular erweiterbar für neue Tools und Kategorien
set -euo pipefail
@@ -39,6 +40,53 @@ log_dry_run() {
echo -e "${YELLOW}[DRY-RUN]${NC} $1"
}
# Auto-Discovery Funktionen
discover_scripts() {
local category="$1"
local scripts=()
if [[ ! -d "$SCRIPT_DIR/$category" ]]; then
echo "0"
return
fi
# Finde alle .sh Dateien in Unterverzeichnissen
while IFS= read -r -d '' script; do
# Extrahiere Scriptname und Verzeichnis
local script_dir="$(dirname "$script")"
local script_name="$(basename "$script_dir")"
local script_file="$(basename "$script")"
# Überspringe wenn Script-Name nicht dem Verzeichnis entspricht
if [[ "$script_file" == "$script_name.sh" ]]; then
scripts+=("$script_name:$script")
fi
done < <(find "$SCRIPT_DIR/$category" -name "*.sh" -type f -print0 2>/dev/null)
# Rückgabe: Anzahl:script1:path1:script2:path2...
local result="${#scripts[@]}"
for script_info in "${scripts[@]}"; do
result="$result:$script_info"
done
echo "$result"
}
get_script_description() {
local category="$1"
local script_name="$2"
# Versuche Beschreibung aus README zu extrahieren
local readme="$SCRIPT_DIR/$category/$script_name/README.md"
if [[ -f "$readme" ]]; then
# Erste Zeile nach "# scriptname"
grep -A 2 "^# $script_name" "$readme" 2>/dev/null | tail -n 1 | sed 's/^[[:space:]]*//'
else
# Fallback: Erste Kommentarzeile aus Script
local script_file="$SCRIPT_DIR/$category/$script_name/$script_name.sh"
grep -m 1 "^# " "$script_file" 2>/dev/null | sed 's/^# //' || echo "Keine Beschreibung verfügbar"
fi
}
# Hilfsfunktionen
backup_file() {
local file="$1"
@@ -126,21 +174,16 @@ install_bashprofiles() {
esac
}
# Installation: Connect Tools
install_connect() {
log_info "=== Connect Tools Installation ==="
# Generische Script-Installation
install_script() {
local category="$1"
local script_name="$2"
local script_path="$3"
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
echo "1) go - SSH-Shortcuts für easyname Server"
echo "0) Überspringen"
log_info "Installiere $script_name..."
read -p "Tools auswählen [0-1]: " connect_choice
case "$connect_choice" in
1)
log_info "Installiere go SSH-Shortcut Tool..."
# Prüfe LUSER Variable
# Spezielle Behandlung für go-Tool (LUSER check)
if [[ "$script_name" == "go" ]]; then
if [[ -z "${LUSER:-}" ]]; then
log_warning "LUSER Umgebungsvariable nicht gesetzt"
if [[ "$DRY_RUN" == "true" ]]; then
@@ -157,15 +200,20 @@ install_connect() {
else
log_info "LUSER bereits gesetzt: $LUSER"
fi
fi
# Script installieren
local go_script="$SCRIPT_DIR/connect/go/go.sh"
make_executable "$go_script"
# Script ausführbar machen
make_executable "$script_path"
# Symlink in ~/bin oder PATH erstellen
if [[ -d "$HOME/bin" ]]; then
create_symlink "$go_script" "$HOME/bin/go" "go-Tool"
else
# Symlink erstellen
ensure_bin_dir
create_symlink "$script_path" "$HOME/bin/$script_name" "$script_name-Tool"
log_success "$script_name installiert"
}
ensure_bin_dir() {
if [[ ! -d "$HOME/bin" ]]; then
if [[ "$DRY_RUN" == "true" ]]; then
log_dry_run "Würde Verzeichnis erstellen: ~/bin"
log_dry_run "Würde PATH erweitern: export PATH=\"\$HOME/bin:\$PATH\" >> ~/.bash_paths"
@@ -175,68 +223,197 @@ install_connect() {
log_info "Füge ~/bin zu PATH hinzu (in ~/.bash_paths)"
echo 'export PATH="$HOME/bin:$PATH"' >> "$HOME/.bash_paths"
fi
create_symlink "$go_script" "$HOME/bin/go" "go-Tool"
fi
}
# Installation: Connect Tools
install_connect() {
log_info "=== Connect Tools Installation ==="
# Auto-discover verfügbare Scripts
local discovery_result
discovery_result=$(discover_scripts "connect")
local script_count
script_count=$(echo "$discovery_result" | cut -d':' -f1)
if [[ "$script_count" -eq 0 ]]; then
log_info "Keine Connect Tools gefunden"
return
fi
log_success "go-Tool installiert"
;;
0)
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
# Parse discovery result und zeige Menu
local scripts=()
local counter=1
IFS=':' read -ra PARTS <<< "$discovery_result"
for ((i=1; i<${#PARTS[@]}; i+=2)); do
local script_name="${PARTS[i]}"
local script_path="${PARTS[i+1]}"
local description
description=$(get_script_description "connect" "$script_name")
echo "$counter) $script_name - $description"
scripts+=("$script_name:$script_path")
((counter++))
done
echo "$counter) Alle Connect Tools"
echo "0) Überspringen"
read -p "Tools auswählen [0-$counter]: " connect_choice
if [[ "$connect_choice" -eq 0 ]]; then
log_info "Connect Tools übersprungen"
;;
*)
elif [[ "$connect_choice" -eq "$counter" ]]; then
# Alle installieren
for script_info in "${scripts[@]}"; do
IFS=':' read -r script_name script_path <<< "$script_info"
install_script "connect" "$script_name" "$script_path"
done
elif [[ "$connect_choice" -ge 1 && "$connect_choice" -lt "$counter" ]]; then
# Einzelnes Tool installieren
local selected_script="${scripts[$((connect_choice-1))]}"
IFS=':' read -r script_name script_path <<< "$selected_script"
install_script "connect" "$script_name" "$script_path"
else
log_error "Ungültige Auswahl"
;;
esac
fi
}
# Installation: Legacy Tools
install_legacy() {
log_info "=== Legacy Tools Installation ==="
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
echo "1) checkms - MS-Fehlercode Analyse"
echo "2) quicknav - Bash-Funktion für schnelle Navigation"
echo "3) Alle Legacy Tools"
echo "0) Überspringen"
# Auto-discover verfügbare Scripts
local discovery_result
discovery_result=$(discover_scripts "legacy")
read -p "Tools auswählen [0-3]: " legacy_choice
local script_count
script_count=$(echo "$discovery_result" | cut -d':' -f1)
case "$legacy_choice" in
1|3)
log_info "Installiere checkms..."
local checkms_script="$SCRIPT_DIR/legacy/checkms/checkms.sh"
make_executable "$checkms_script"
if [[ -d "$HOME/bin" ]]; then
create_symlink "$checkms_script" "$HOME/bin/checkms" "checkms"
else
mkdir -p "$HOME/bin"
create_symlink "$checkms_script" "$HOME/bin/checkms" "checkms"
if [[ "$script_count" -eq 0 ]]; then
log_info "Keine Legacy Tools gefunden"
return
fi
log_success "checkms installiert"
;;&
2|3)
log_info "Installiere quicknav..."
local quicknav_func="$SCRIPT_DIR/legacy/quicknav/quicknav.sh"
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
log_warning "quicknav ist eine Bash-Funktion und muss manuell in .bashrc eingebunden werden"
log_info "Füge folgende Zeile zu ~/.bashrc hinzu:"
echo -e "${YELLOW}source \"$quicknav_func\"${NC}"
;;&
0)
# Parse discovery result und zeige Menu
local scripts=()
local counter=1
IFS=':' read -ra PARTS <<< "$discovery_result"
for ((i=1; i<${#PARTS[@]}; i+=2)); do
local script_name="${PARTS[i]}"
local script_path="${PARTS[i+1]}"
local description
description=$(get_script_description "legacy" "$script_name")
echo "$counter) $script_name - $description"
scripts+=("$script_name:$script_path")
((counter++))
done
echo "$counter) Alle Legacy Tools"
echo "0) Überspringen"
read -p "Tools auswählen [0-$counter]: " legacy_choice
if [[ "$legacy_choice" -eq 0 ]]; then
log_info "Legacy Tools übersprungen"
;;
*)
elif [[ "$legacy_choice" -eq "$counter" ]]; then
# Alle installieren
for script_info in "${scripts[@]}"; do
IFS=':' read -r script_name script_path <<< "$script_info"
install_legacy_script "$script_name" "$script_path"
done
elif [[ "$legacy_choice" -ge 1 && "$legacy_choice" -lt "$counter" ]]; then
# Einzelnes Tool installieren
local selected_script="${scripts[$((legacy_choice-1))]}"
IFS=':' read -r script_name script_path <<< "$selected_script"
install_legacy_script "$script_name" "$script_path"
else
log_error "Ungültige Auswahl"
;;
esac
fi
}
# Installation: WH20 Tools (Platzhalter für zukünftige Tools)
# Spezielle Legacy Script Installation (für quicknav Behandlung)
install_legacy_script() {
local script_name="$1"
local script_path="$2"
log_info "Installiere $script_name..."
if [[ "$script_name" == "quicknav" ]]; then
# quicknav ist eine Bash-Funktion, keine Binary
log_warning "quicknav ist eine Bash-Funktion und muss manuell in .bashrc eingebunden werden"
if [[ "$DRY_RUN" == "true" ]]; then
log_dry_run "Würde Hinweis anzeigen: source \"$script_path\" zu ~/.bashrc hinzufügen"
else
log_info "Füge folgende Zeile zu ~/.bashrc hinzu:"
echo -e "${YELLOW}source \"$script_path\"${NC}"
fi
else
# Normale Script Installation
install_script "legacy" "$script_name" "$script_path"
fi
}
# Installation: WH20 Tools
install_wh20() {
log_info "=== WH20 Tools Installation ==="
# Auto-discover verfügbare Scripts
local discovery_result
discovery_result=$(discover_scripts "wh20")
local script_count
script_count=$(echo "$discovery_result" | cut -d':' -f1)
if [[ "$script_count" -eq 0 ]]; then
log_info "Noch keine WH20 Tools verfügbar"
return
fi
echo -e "\n${PURPLE}Verfügbare Tools:${NC}"
# Parse discovery result und zeige Menu
local scripts=()
local counter=1
IFS=':' read -ra PARTS <<< "$discovery_result"
for ((i=1; i<${#PARTS[@]}; i+=2)); do
local script_name="${PARTS[i]}"
local script_path="${PARTS[i+1]}"
local description
description=$(get_script_description "wh20" "$script_name")
echo "$counter) $script_name - $description"
scripts+=("$script_name:$script_path")
((counter++))
done
echo "$counter) Alle WH20 Tools"
echo "0) Überspringen"
read -p "Tools auswählen [0-$counter]: " wh20_choice
if [[ "$wh20_choice" -eq 0 ]]; then
log_info "WH20 Tools übersprungen"
elif [[ "$wh20_choice" -eq "$counter" ]]; then
# Alle installieren
for script_info in "${scripts[@]}"; do
IFS=':' read -r script_name script_path <<< "$script_info"
install_script "wh20" "$script_name" "$script_path"
done
elif [[ "$wh20_choice" -ge 1 && "$wh20_choice" -lt "$counter" ]]; then
# Einzelnes Tool installieren
local selected_script="${scripts[$((wh20_choice-1))]}"
IFS=':' read -r script_name script_path <<< "$selected_script"
install_script "wh20" "$script_name" "$script_path"
else
log_error "Ungültige Auswahl"
fi
}
# Hilfsfunktion
+10 -5
View File
@@ -1,6 +1,6 @@
# Connect Tools
# Legacy Tools
SSH-Verbindungstools und Shortcuts für den schnellen Zugriff auf easyname-Infrastruktur.
Sammlung von Bash-Skripten für die Legacy-Infrastruktur von easyname. Enthält Tools für Log-Analyse, SSH-Verbindungen und Support-Automatisierung.
---
@@ -15,7 +15,7 @@ SSH-Verbindungstools und Shortcuts für den schnellen Zugriff auf easyname-Infra
## Übersicht
Die Connect-Tools vereinfachen den Zugriff auf verschiedene easyname-Server durch intelligente SSH-Shortcuts mit Kerberos-Authentifizierung. Sie reduzieren wiederkehrende Eingaben und ermöglichen schnelle Verbindungen zu Web-, Mail-, Logger- und Support-Servern.
Die Legacy-Tools unterstützen bei typischen Support-Aufgaben in der Legacy-Infrastruktur. Von Log-Analyse über SSH-Shortcuts bis hin zu Mail-Suche - alle Tools sind darauf ausgelegt, wiederkehrende Aufgaben zu automatisieren und zu beschleunigen.
---
@@ -36,6 +36,11 @@ Sucht nach versendeten PINC Mails einer bestimmten Kundennummer und kopiert dies
- [Dokumentation & Beispiele](./pincMails/README.md)
### [`exitrace`](./exitrace)
Exim-Log-Trace & Status für einzelne Mails/Adressen/Domain-Ziele. Durchsucht und analysiert Exim-Logs nach Message-IDs und gruppiert alle Ereignisse einer Mail.
- [Dokumentation & Beispiele](./exitrace/README.md)
---
## Voraussetzungen
@@ -61,10 +66,10 @@ Sucht nach versendeten PINC Mails einer bestimmten Kundennummer und kopiert dies
3. Tool in PATH hinzufügen oder Alias erstellen:
```bash
# Option 1: Alias
alias go="/pfad/zu/connect/go/go.sh"
alias go="/pfad/zu/legacy/go/go.sh"
# Option 2: Symlink
ln -s /pfad/zu/connect/go/go.sh ~/bin/go
ln -s /pfad/zu/legacy/go/go.sh ~/bin/go
```
---
+13 -14
View File
@@ -24,11 +24,10 @@ Neben der Auswertung kann das Skript auch die Konfiguration (Fehlercodes, SSH-Us
## Installation
1. Repository klonen:
1. Installation über Installer:
```bash
git clone <gitea-url>/esn-support-bash-snippets.git
cd esn-support-bash-snippets/legacy/checkms
chmod +x checkms
# Im Repository-Hauptverzeichnis
./install.sh
```
2. Beim ersten Start erstellt `checkms` automatisch die Konfiguration unter:
@@ -46,21 +45,21 @@ Neben der Auswertung kann das Skript auch die Konfiguration (Fehlercodes, SSH-Us
### Standardanalyse
```bash
./checkms
checkms
```
→ analysiert das heutige Logfile komplett.
### Tageslog
```bash
./checkms 2025-09-08
checkms 2025-09-08
```
→ analysiert das Logfile vom 08.09.2025
(automatisch `.log` oder `.log.gz`).
### Zeitfenster
```bash
./checkms --minutes 30 # letzte 30 Minuten
./checkms --hours 2 # letzte 2 Stunden
checkms --minutes 30 # letzte 30 Minuten
checkms --hours 2 # letzte 2 Stunden
```
---
@@ -69,7 +68,7 @@ Neben der Auswertung kann das Skript auch die Konfiguration (Fehlercodes, SSH-Us
### Aktuelle Config ansehen
```bash
./checkms --show-config
checkms --show-config
```
Beispielausgabe:
@@ -96,18 +95,18 @@ ID CODE
### SSH-User ändern
```bash
./checkms --set-user alice --show-config
checkms --set-user alice --show-config
```
### Code hinzufügen
```bash
./checkms --add-code S77714
./checkms --add-code 'S77[0-9]{3}' --show-config
checkms --add-code S77714
checkms --add-code 'S77[0-9]{3}' --show-config
```
### Code löschen
```bash
./checkms --del-code 2 --show-config
checkms --del-code 2 --show-config
```
→ löscht den Code mit ID `2` (siehe `--show-config`).
@@ -116,7 +115,7 @@ ID CODE
## Optionen
```
Usage: ./checkms [OPTIONS] [YYYY-MM-DD]
Usage: checkms [OPTIONS] [YYYY-MM-DD]
Analyse von MS-Fehlercodes im Exim-Log und Pflege der Codes.
Regular → Executable
+15 -5
View File
@@ -1,5 +1,6 @@
#!/usr/bin/env bash
# checkms - Analyse von MS-Fehlercodes im Exim-Log + Code-Management
# Maintainer: ljp
set -euo pipefail
@@ -189,6 +190,8 @@ else
fi
[[ -n "${CODES_REGEX// }" ]] || CODES_REGEX="S3150|S775|S7771[0-9]*"
year="${DATE:0:4}"
month="${DATE:5:2}"
LOGFILE="${DATE}.log"
# --- Remote-Kommando ---
@@ -201,7 +204,7 @@ fi
# --- Analyse (remote) ---
$REMOTE bash -s <<EOF
set -euo pipefail
cd /var/log/easyname/\$(date +%Y/%m)
cd /var/log/easyname/$year/$month
if [ -f "$LOGFILE" ]; then SRC="cat \"$LOGFILE\""
elif [ -f "$LOGFILE.gz" ]; then SRC="zcat \"$LOGFILE.gz\""
@@ -210,6 +213,7 @@ $REMOTE bash -s <<EOF
exit 1
fi
echo "⚠️ Starte checkms für $DATE"
echo "Analysiere $LOGFILE"
echo
printf "%-8s %-16s %-8s\n" "COUNT" "IP" "CODE"
@@ -233,11 +237,17 @@ $REMOTE bash -s <<EOF
{
code="NA"; ip="NA";
for (i=1;i<=NF;i++) {
if (\$i ~ /\(S[0-9]+\)/) { t=\$i; gsub(/[()]/,"",t); code=t }
else if (\$i ~ /^S[0-9]+/) { code=\$i }
if (\$i ~ /^\[[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\]$/) {
ip=\$i; gsub(/[\[\]]/,"",ip)
if (\$i ~ /\(S[0-9]+\)/) { t=\$i; gsub(/[()]/,"",t); sub(/\\.$/,"",t); code=t }
else if (\$i ~ /^S[0-9]+/) { code=\$i; sub(/\\.$/,"",code) }
if (\$i ~ /^\[[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
ip=\$i; gsub(/^\[|\].*$/,"",ip)
}
else if (ip == "NA" && \$i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) {
ip=\$i
}
}
if (ip ~ /^77\.244\.243\.(9|10|11|12)$/) {
next
}
print code, ip
}
+263
View File
@@ -0,0 +1,263 @@
# exitrace
**Remote Exim-Log-Trace & Status für einzelne Mails/Adressen/Domain-Ziele**
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
- **Remote-Ausführung**: Automatische SSH-Verbindung zu `logger.in.nessus.at`
- **Zeitfenster**: Letzte N Stunden/Tage ODER konkretes Datum/Datumsbereich
- **Filter**: Absender, Empfänger (Regex), Domain, Message-ID, zusätzliche Regex
- **Gruppierung**: Alle Treffer pro Exim-Message-ID mit Status-Zusammenfassung
- **Status-Klassifikation**: OK / PARTIAL / DELAY / FAIL / UNKNOWN
- **MX-Records**: Optional DNS-Abfragen für Ziel-Domain (--mx)
- **Failure-Detection**: Markiert häufige Fehler (z.B. "all hosts failing")
- **Chronologische Ausgabe**: Sortiert nach Message-ID Erstkontakt
- **Komprimierte Logs**: Automatischer Support für .gz-Archive
- **Smart Connection**: Verwendet `go logger` oder `ssh ${LUSER}@logger.in.nessus.at`
---
## Installation
Via Installer (empfohlen):
```bash
cd ~/.dev/esn-support-bash-snippets
./install.sh
# Dann: 3) Legacy Tools auswählen und exitrace installieren
```
Manuelle Installation:
```bash
git clone <repo-url>/esn-support-bash-snippets.git ~/.dev/esn-support-bash-snippets
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
```
---
## Nutzung
### Standardaufruf
```bash
exitrace
```
(durchsucht heutiges Log ohne Filter)
### Beispiele
**Häufige Use-Cases:**
```bash
# Mail-Trace für spezifischen Absender zu t-online.de (letzte 48h)
exitrace -FROM franziskus@adjuva.info -DOMAIN t-online.de -H 48
# Alle Mails an bestimmte Domain in Zeitspanne
exitrace -DOMAIN gmx.de -r 2025-09-10..2025-09-11
# Konkrete Message-ID verfolgen
exitrace -MSGID 1uwRvz-000Fz2-CI
# Regex-Filter auf Empfänger + MX-Records anzeigen
exitrace -TO '.*@gmail\.com' -d 2025-09-11 --mx
# Kombinierte Filter: Absender + Domain + Zeitfenster
exitrace -FROM noreply@company.com -DOMAIN outlook.com -H 24
```
**Debugging & Analyse:**
```bash
# Dry-Run: zeigt nur welche Logfiles durchsucht würden
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
```
---
## Optionen
```
Usage: exitrace [OPTS]
Zeitfenster (eine Option wählen):
-H, --hours N Letzte N Stunden durchsuchen
-DAYS, --days N Letzte N Tage durchsuchen
-d, --date YYYY-MM-DD Exaktes Datum
-r, --range A..B Datumsbereich (inkl.): YYYY-MM-DD..YYYY-MM-DD
Filter (beliebig kombinierbar):
-FROM, --from ADDR Envelope-From / "from <...>" (alias: -f)
-TO, --to REGEX Empfänger (Regex, matcht nach " for <rcpt>" oder in "** ...") (alias: -t)
-DOMAIN, --domain NAME Ziel-Domain (z. B. example.de), prüft auf Zustellungen/Fehler dorthin (alias: -D)
-MSGID, --msgid ID Exim-Message-ID (z. B. 1uwRvz-000Fz2-CI) (alias: -m)
-GREP, --grep REGEX Zusätzlicher Regex auf Logzeilen (alias: -G)
Sonstiges:
--mx Zeigt MX-Einträge (und A/AAAA) für --domain
-n, --dry-run Zeigt nur, welche Logfiles untersucht würden
-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
### Erfolgreiche Zustellung
```
[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: 1v2K8X-0004Zm-BC
First: 2025-09-11 08:32:15
Last: 2025-09-11 08:32:47
From: franziskus@adjuva.info
Rcpts: user@t-online.de
Status: OK (Delivered=1, Deferred=0, Failed=0)
Log:
2025-09-11 08:32:15 | <= franziskus@adjuva.info H=mail.adjuva.info [10.0.0.1] P=esmtp S=2156
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
------------------------------------------------------------------------
```
**Status-Klassifikation:**
- `OK`: Alle Mails erfolgreich zugestellt
- `PARTIAL`: Teilweise zugestellt, aber auch Fehler/Delays
- `DELAY`: Noch in Warteschlange (Deferred)
- `FAIL`: Permanent fehlgeschlagen
- `UNKNOWN`: Status unklar
Bei MX-Abfrage (--mx) wird zusätzlich angezeigt:
```
== MX für example.de ==
10 mx1.example.de.
20 mx2.example.de.
-- A/AAAA der MX:
mx1.example.de. | 192.0.2.1,192.0.2.2
mx2.example.de. | 192.0.2.3
========================================================================
```
Bei Delivery-Stalls:
```
Note: DELIVERY STALL erkannt: 'all hosts for domain failing (retry/backoff)'
```
---
## Setup-Hinweise
Nach Installation über `./install.sh` ist das Script direkt verfügbar:
```bash
exitrace -FROM franziskus@adjuva.info -DOMAIN t-online.de -H 48
```
**LUSER Environment Variable setzen (wichtig!):**
```bash
# Temporär
export LUSER="dein-username"
# Permanent in ~/.bash_env (empfohlen)
echo 'export LUSER="dein-username"' >> ~/.bash_env
source ~/.bash_env
```
**Verbindungstest:**
```bash
# Test ob go-Tool verfügbar
go logger
# Test ob SSH funktioniert
ssh ${LUSER}@logger.in.nessus.at "hostname"
```
---
## Troubleshooting
### Häufige Probleme
**"LUSER Variable nicht gesetzt"**
```bash
export LUSER="dein-username"
```
**"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
+567
View File
@@ -0,0 +1,567 @@
#!/usr/bin/env bash
# exitrace - Remote Exim-Log-Trace & Status für einzelne Mails/Adressen/Domain-Ziele
# Maintainer: ljp
# -----------------------------------------------------------------------------
# Features:
# - Läuft lokal auf logger.in.nessus.at (wo die Exim-Logs liegen)
# - Sucht in /var/log/easyname/YYYY/MM/YYYY-MM-DD.log(.gz)
# - Zeitfenster: letzte N Stunden/Tage ODER konkretes Datum/Spanne
# - Filter: Absender (-FROM), Empfänger-Regex (-TO), Ziel-Domain (-DOMAIN), Message-ID (-MSGID), Extra-Regex (-GREP)
# - Gruppiert Treffer pro Exim-Message-ID und fasst Status zusammen
# - Klassifikation: OK / PARTIAL / DELAY / FAIL / UNKNOWN
# - Optional: MX-Übersicht für -DOMAIN mittels --mx
#
# Deployment: Mit deploy.sh auf logger.in.nessus.at installieren
# Usage: ssh logger.in.nessus.at exitrace [OPTS]
#
# Beispiele:
# exitrace -FROM sender@example.com -DOMAIN example.de -H 48
# exitrace -MSGID 1uwRvz-000Fz2-CI
# exitrace -TO '.*@example.de' -r 2025-09-09..2025-09-11 --mx
#
# Exitcodes: 0=OK (Treffer evtl. 0), 1=Fehlerhafte Parameter/Umgebung
# -----------------------------------------------------------------------------
set -euo pipefail
# Standardwerte
HOURS=""
DAYS=""
DATE=""
RANGE=""
FROM=""
TO=""
DOMAIN=""
MSGID=""
GREP=""
MX=0
DRY_RUN=0
usage() {
cat <<'USAGE'
Usage: exitrace [OPTS]
Zeitfenster (eine Option wählen):
-H, --hours N Letzte N Stunden durchsuchen
-DAYS, --days N Letzte N Tage durchsuchen
-d, --date YYYY-MM-DD Exaktes Datum
-r, --range A..B Datumsbereich (inkl.): YYYY-MM-DD..YYYY-MM-DD
Filter (beliebig kombinierbar):
-FROM, --from ADDR Envelope-From / "from <...>" (alias: -f)
-TO, --to REGEX Empfänger (Regex, matcht ' for <rcpt>' oder in '** rcpt') (alias: -t)
-DOMAIN, --domain NAME Ziel-Domain (z. B. example.de) (alias: -D)
-MSGID, --msgid ID Exim-Message-ID (z. B. 1uwRvz-000Fz2-CI) (alias: -m)
-GREP, --grep REGEX Zusätzlicher Regex auf Logzeilen (alias: -G)
Sonstiges:
--mx Zeigt MX-Einträge (und A/AAAA) für --domain
-n, --dry-run Zeigt nur, welche Logfiles untersucht würden
-h, --help Diese Hilfe
Beispiele:
exitrace -FROM sender@example.com -DOMAIN example.de -H 48
exitrace -MSGID 1uwRvz-000Fz2-CI
exitrace -TO '.*@example.de' -r 2025-09-09..2025-09-11 --mx
Backwards Compatibility:
exitrace -f sender@domain.com -D example.de -H 48
exitrace -m 1uwRvz-000Fz2-CI
exitrace -t '.*@gmail\\.com' --mx
USAGE
}
# Parse Arguments
while [[ $# -gt 0 ]]; do
case $1 in
-H|--hours)
HOURS="$2"
[[ "$HOURS" =~ ^[0-9]+$ ]] || { echo "Fehler: --hours benötigt eine Zahl" >&2; exit 1; }
shift 2
;;
-DAYS|--days)
DAYS="$2"
[[ "$DAYS" =~ ^[0-9]+$ ]] || { echo "Fehler: --days benötigt eine Zahl" >&2; exit 1; }
shift 2
;;
-d|--date)
DATE="$2"
[[ "$DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] || { echo "Fehler: --date benötigt YYYY-MM-DD" >&2; exit 1; }
shift 2
;;
-r|--range)
RANGE="$2"
[[ "$RANGE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}\.\.[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] || { echo "Fehler: --range benötigt YYYY-MM-DD..YYYY-MM-DD" >&2; exit 1; }
shift 2
;;
-FROM|--from|-f)
FROM="$2"
shift 2
;;
-TO|--to|-t)
TO="$2"
shift 2
;;
-DOMAIN|--domain|-D)
DOMAIN="$2"
shift 2
;;
-MSGID|--msgid|-m)
MSGID="$2"
shift 2
;;
-GREP|--grep|-G)
GREP="$2"
shift 2
;;
--mx)
MX=1
shift
;;
-n|--dry-run)
DRY_RUN=1
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unbekannte Option: $1" >&2
usage
exit 1
;;
esac
done
# Validierung: Nur ein Zeitfenster
time_options=0
[[ -n "$HOURS" ]] && ((time_options++))
[[ -n "$DAYS" ]] && ((time_options++))
[[ -n "$DATE" ]] && ((time_options++))
[[ -n "$RANGE" ]] && ((time_options++))
if [[ $time_options -gt 1 ]]; then
echo "Fehler: Nur ein Zeitfenster (-H/-DAYS/-d/-r) erlaubt" >&2
exit 1
fi
# Default: Heutiges Datum
if [[ $time_options -eq 0 ]]; then
DATE=$(date +%Y-%m-%d)
fi
# Datum-Validierung für DATE
validate_date() {
local d="$1"
if ! date -d "$d" >/dev/null 2>&1; then
echo "Fehler: Ungültiges Datum: $d" >&2
exit 1
fi
}
# Bestimme Logfiles basierend auf Zeitfenster
determine_logfiles() {
local logfiles=()
if [[ -n "$DATE" ]]; then
validate_date "$DATE"
local year month
year=$(date -d "$DATE" +%Y)
month=$(date -d "$DATE" +%m)
logfiles+=("/var/log/easyname/$year/$month/$DATE.log")
elif [[ -n "$RANGE" ]]; then
local start_date end_date
start_date="${RANGE%%..*}"
end_date="${RANGE##*..}"
validate_date "$start_date"
validate_date "$end_date"
local current_date="$start_date"
while [[ "$current_date" <= "$end_date" ]]; do
local year month
year=$(date -d "$current_date" +%Y)
month=$(date -d "$current_date" +%m)
logfiles+=("/var/log/easyname/$year/$month/$current_date.log")
current_date=$(date -d "$current_date + 1 day" +%Y-%m-%d)
done
elif [[ -n "$HOURS" ]]; then
# Bestimme Datumsbereich für letzte N Stunden
local start_ts end_ts
end_ts=$(date +%s)
start_ts=$((end_ts - HOURS * 3600))
local current_ts="$start_ts"
local seen_dates=()
while [[ $current_ts -le $end_ts ]]; do
local date_str
date_str=$(date -d "@$current_ts" +%Y-%m-%d)
# Füge Datum nur einmal hinzu
local found=0
for seen in "${seen_dates[@]}"; do
[[ "$seen" == "$date_str" ]] && found=1 && break
done
if [[ $found -eq 0 ]]; then
seen_dates+=("$date_str")
local year month
year=$(date -d "$date_str" +%Y)
month=$(date -d "$date_str" +%m)
logfiles+=("/var/log/easyname/$year/$month/$date_str.log")
fi
current_ts=$((current_ts + 86400)) # +1 Tag
done
elif [[ -n "$DAYS" ]]; then
# Bestimme Datumsbereich für letzte N Tage
for ((i=0; i<DAYS; i++)); do
local date_str
date_str=$(date -d "-$i days" +%Y-%m-%d)
local year month
year=$(date -d "$date_str" +%Y)
month=$(date -d "$date_str" +%m)
logfiles+=("/var/log/easyname/$year/$month/$date_str.log")
done
fi
printf '%s\n' "${logfiles[@]}"
}
# MX Record Lookup
show_mx_records() {
[[ -n "$DOMAIN" ]] || return 0
[[ $MX -eq 1 ]] || return 0
if ! command -v dig >/dev/null 2>&1; then
echo "Warnung: 'dig' nicht gefunden - MX-Records werden übersprungen" >&2
return 0
fi
echo "== MX für $DOMAIN =="
# MX Records
local mx_records
mx_records=$(dig +short MX "$DOMAIN" | sort -n)
if [[ -z "$mx_records" ]]; then
echo "Keine MX-Records gefunden"
else
echo "$mx_records"
# A/AAAA Records für MX-Hosts
echo "-- A/AAAA der MX:"
while read -r priority mx_host; do
[[ -n "$mx_host" ]] || continue
mx_host="${mx_host%.}" # Trailing dot entfernen
local a_records aaaa_records all_records
a_records=$(dig +short A "$mx_host" | paste -sd',' -)
aaaa_records=$(dig +short AAAA "$mx_host" | paste -sd',' -)
all_records=""
[[ -n "$a_records" ]] && all_records="$a_records"
[[ -n "$aaaa_records" ]] && {
[[ -n "$all_records" ]] && all_records="$all_records,"
all_records="$all_records$aaaa_records"
}
printf "%-40s | %s\n" "$mx_host" "${all_records:-<keine A/AAAA Records>}"
done <<< "$mx_records"
fi
echo "========================================================================"
}
# Log Analysis - der Hauptalgorithmus
analyze_logs() {
local logfiles=()
mapfile -t logfiles < <(determine_logfiles)
if [[ $DRY_RUN -eq 1 ]]; then
echo "=== DRY-RUN: Würde folgende Logfiles untersuchen ==="
for logfile in "${logfiles[@]}"; do
if [[ -f "$logfile" ]]; then
echo " [EXISTS] $logfile"
elif [[ -f "$logfile.gz" ]]; then
echo " [EXISTS] $logfile.gz (komprimiert)"
else
echo " [MISSING] $logfile(.gz)"
fi
done
return 0
fi
# MX Records anzeigen falls gewünscht
show_mx_records
# Sammle alle relevanten Logzeilen
local temp_file
temp_file=$(mktemp)
trap "rm -f '$temp_file'" EXIT
for logfile in "${logfiles[@]}"; do
local cat_cmd=""
if [[ -f "$logfile" ]]; then
cat_cmd="cat '$logfile'"
elif [[ -f "$logfile.gz" ]]; then
cat_cmd="zcat '$logfile.gz'"
else
continue
fi
# Zeitfilter für Stunden/Tage
local time_filter=""
if [[ -n "$HOURS" ]]; then
local start_time
start_time=$(date -d "-$HOURS hours" '+%b %_d %H:%M')
time_filter="awk -v start='$start_time' '\$0 ~ start,0'"
elif [[ -n "$DAYS" && $DAYS -lt 7 ]]; then # Nur für kleine Tageszahlen
local start_time
start_time=$(date -d "-$DAYS days" '+%b %_d')
time_filter="awk -v start='$start_time' '\$0 ~ start,0'"
fi
# Baue Grep-Filter Pipeline
local filter_pipeline=""
# Basis-Filter: Envelope-From
[[ -n "$FROM" ]] && filter_pipeline="$filter_pipeline | grep -F ' <= $FROM '"
# TO-Filter: Empfänger-Regex
[[ -n "$TO" ]] && filter_pipeline="$filter_pipeline | grep -E '( for <.*$TO.*>|\\*\\* .*$TO)'"
# Domain-Filter: Ziel-Domain
[[ -n "$DOMAIN" ]] && filter_pipeline="$filter_pipeline | grep -E '(@$DOMAIN>|to $DOMAIN|for $DOMAIN)'"
# Message-ID Filter
[[ -n "$MSGID" ]] && filter_pipeline="$filter_pipeline | grep -F '$MSGID'"
# Zusätzlicher Regex
[[ -n "$GREP" ]] && filter_pipeline="$filter_pipeline | grep -E '$GREP'"
# Kommando zusammensetzen und ausführen
local full_cmd="$cat_cmd"
[[ -n "$time_filter" ]] && full_cmd="$full_cmd | $time_filter"
full_cmd="$full_cmd$filter_pipeline"
eval "$full_cmd" >> "$temp_file" 2>/dev/null || true
done
# Verarbeite gesammelte Logzeilen
process_log_entries "$temp_file"
}
# Verarbeitung der Logeinträge und Gruppierung nach Message-ID
process_log_entries() {
local input_file="$1"
[[ -s "$input_file" ]] || {
echo "Keine passenden Logeinträge gefunden."
return 0
}
# AWK-Script für Gruppierung und Status-Klassifikation
awk '
BEGIN {
# Arrays für Message-ID Daten
# msgid_data[id]["first"] = erste Zeitstempel
# msgid_data[id]["last"] = letzte Zeitstempel
# msgid_data[id]["from"] = Absender
# msgid_data[id]["rcpts"] = Empfänger (getrennt durch ",")
# msgid_data[id]["delivered"] = Anzahl erfolgreich zugestellt
# msgid_data[id]["deferred"] = Anzahl wartend
# msgid_data[id]["failed"] = Anzahl fehlgeschlagen
# msgid_data[id]["logs"] = Alle Logzeilen (getrennt durch "\n")
}
# Extrahiere Message-ID aus jeder Zeile
function extract_msgid(line) {
# Exim Message-ID Format: 1uwRvz-000Fz2-CI
match(line, /[0-9a-zA-Z]{6}-[0-9a-zA-Z]{6}-[0-9a-zA-Z]{2}/)
if (RSTART > 0) {
return substr(line, RSTART, RLENGTH)
}
return ""
}
# Extrahiere Zeitstempel (Format: 2025-09-11 08:32:15)
function extract_timestamp(line) {
match(line, /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/)
if (RSTART > 0) {
return substr(line, RSTART, RLENGTH)
}
return ""
}
# Hauptverarbeitung jeder Logzeile
{
msgid = extract_msgid($0)
if (msgid == "") next
timestamp = extract_timestamp($0)
# Initialisiere Message-ID falls neu
if (!(msgid in msgid_data)) {
msgid_data[msgid]["first"] = timestamp
msgid_data[msgid]["last"] = timestamp
msgid_data[msgid]["from"] = ""
msgid_data[msgid]["rcpts"] = ""
msgid_data[msgid]["delivered"] = 0
msgid_data[msgid]["deferred"] = 0
msgid_data[msgid]["failed"] = 0
msgid_data[msgid]["logs"] = ""
}
# Aktualisiere Zeitstempel
if (timestamp < msgid_data[msgid]["first"] || msgid_data[msgid]["first"] == "") {
msgid_data[msgid]["first"] = timestamp
}
if (timestamp > msgid_data[msgid]["last"] || msgid_data[msgid]["last"] == "") {
msgid_data[msgid]["last"] = timestamp
}
# Füge Logzeile hinzu
if (msgid_data[msgid]["logs"] == "") {
msgid_data[msgid]["logs"] = timestamp " | " $0
} else {
msgid_data[msgid]["logs"] = msgid_data[msgid]["logs"] "\n" timestamp " | " $0
}
# Analysiere Logzeile für Status und Details
if ($0 ~ / <= /) {
# Eingehende Mail: Extract Sender
match($0, / <= ([^ ]+)/, arr)
if (arr[1] != "") {
msgid_data[msgid]["from"] = arr[1]
}
}
else if ($0 ~ / => /) {
# Erfolgreiche Zustellung
msgid_data[msgid]["delivered"]++
# Extrahiere Empfänger
match($0, / => ([^ ]+)/, arr)
if (arr[1] != "" && index(msgid_data[msgid]["rcpts"], arr[1]) == 0) {
if (msgid_data[msgid]["rcpts"] == "") {
msgid_data[msgid]["rcpts"] = arr[1]
} else {
msgid_data[msgid]["rcpts"] = msgid_data[msgid]["rcpts"] "," arr[1]
}
}
}
else if ($0 ~ / == /) {
# Verzögerte Zustellung (deferred)
msgid_data[msgid]["deferred"]++
# Extrahiere Empfänger
match($0, / == ([^ ]+)/, arr)
if (arr[1] != "" && index(msgid_data[msgid]["rcpts"], arr[1]) == 0) {
if (msgid_data[msgid]["rcpts"] == "") {
msgid_data[msgid]["rcpts"] = arr[1]
} else {
msgid_data[msgid]["rcpts"] = msgid_data[msgid]["rcpts"] "," arr[1]
}
}
}
else if ($0 ~ / \*\* /) {
# Fehlgeschlagene Zustellung
msgid_data[msgid]["failed"]++
# Extrahiere Empfänger
match($0, / \*\* ([^ ]+)/, arr)
if (arr[1] != "" && index(msgid_data[msgid]["rcpts"], arr[1]) == 0) {
if (msgid_data[msgid]["rcpts"] == "") {
msgid_data[msgid]["rcpts"] = arr[1]
} else {
msgid_data[msgid]["rcpts"] = msgid_data[msgid]["rcpts"] "," arr[1]
}
}
}
}
END {
# Sortiere Message-IDs nach erstem Auftreten
n = 0
for (msgid in msgid_data) {
sorted_msgids[++n] = msgid
}
# Einfache Sortierung nach first timestamp
for (i = 1; i <= n; i++) {
for (j = i + 1; j <= n; j++) {
if (msgid_data[sorted_msgids[i]]["first"] > msgid_data[sorted_msgids[j]]["first"]) {
temp = sorted_msgids[i]
sorted_msgids[i] = sorted_msgids[j]
sorted_msgids[j] = temp
}
}
}
# Ausgabe aller gefundenen Message-IDs
for (i = 1; i <= n; i++) {
msgid = sorted_msgids[i]
# Status-Klassifikation
delivered = msgid_data[msgid]["delivered"]
deferred = msgid_data[msgid]["deferred"]
failed = msgid_data[msgid]["failed"]
if (failed > 0 && delivered == 0 && deferred == 0) {
status = "FAIL"
} else if (delivered > 0 && failed == 0 && deferred == 0) {
status = "OK"
} else if (deferred > 0 && delivered == 0 && failed == 0) {
status = "DELAY"
} else if (delivered > 0 && (failed > 0 || deferred > 0)) {
status = "PARTIAL"
} else {
status = "UNKNOWN"
}
# Kurze Übersicht
printf "[%s] ID=%s | First=%s | From=%s | Rcpts=%s | Delivered=%d Deferred=%d Failed=%d\n",
status, msgid, msgid_data[msgid]["first"], msgid_data[msgid]["from"],
msgid_data[msgid]["rcpts"], delivered, deferred, failed
# Detaillierte Ausgabe
print "------------------------------------------------------------------------"
printf "ID: %s\n", msgid
printf "First: %s\n", msgid_data[msgid]["first"]
printf "Last: %s\n", msgid_data[msgid]["last"]
printf "From: %s\n", msgid_data[msgid]["from"]
printf "Rcpts: %s\n", msgid_data[msgid]["rcpts"]
printf "Status: %s (Delivered=%d, Deferred=%d, Failed=%d)\n", status, delivered, deferred, failed
print "Log:"
print msgid_data[msgid]["logs"]
# Check für bekannte Delivery-Probleme
if (msgid_data[msgid]["logs"] ~ /all hosts for.*have been failing/) {
print " Note: DELIVERY STALL erkannt: '\''all hosts for domain failing (retry/backoff)'\''"
}
print "------------------------------------------------------------------------"
print ""
}
if (n == 0) {
print "Keine passenden Exim-Message-IDs gefunden."
}
}
' "$input_file"
}
# Main Execution
main() {
analyze_logs
}
# Script ausführen
main "$@"
# Built with the help of Claude Code
+76
View File
@@ -0,0 +1,76 @@
# getIps.sh
A bash script that resolves hostnames to their IPv4 and IPv6 addresses using DNS lookups.
## Description
This script reads a list of hostnames from an input file and performs DNS lookups to find their corresponding IPv4 and IPv6 addresses. The results are written to an output file in a tab-separated format.
## Usage
```bash
./getIps.sh <input_file> <output_file>
```
### Arguments
- `input_file`: Path to a text file containing hostnames (one per line)
- `output_file`: Path where the results will be written
### Example
```bash
./getIps.sh hosts.txt results.txt
```
## Input Format
The input file should contain hostnames, one per line:
```
google.com
github.com
stackoverflow.com
```
## Output Format
The output file will contain tab-separated values with the following columns:
```
hostname IPv4_address IPv6_address
```
Example output:
```
google.com 142.250.191.14 2a00:1450:4001:80e::200e
github.com 140.82.112.4 N/A
stackoverflow.com 151.101.1.69 N/A
```
## Features
- Resolves both IPv4 (A records) and IPv6 (AAAA records) addresses
- Handles empty lines in input file gracefully
- Shows "N/A" for addresses that cannot be resolved
- Clears previous output file before writing new results
- Provides usage information if incorrect arguments are provided
## Requirements
- `dig` command (part of dnsutils package)
- Bash shell
## Installation
Make the script executable:
```bash
chmod +x getIps.sh
```
## Error Handling
- The script will exit with an error if the wrong number of arguments is provided
- Empty lines in the input file are automatically skipped
- DNS resolution failures are handled gracefully (shows "N/A")
+28
View File
@@ -0,0 +1,28 @@
#!/bin/bash
# Check if required arguments are provided
if [ $# -ne 2 ]; then
echo "Usage: $0 <input_file> <output_file>"
echo "Example: $0 hosts.txt output.txt"
exit 1
fi
# Input and output files from command line arguments
INPUT_FILE="$1"
OUTPUT_FILE="$2"
# Clear previous output
> "$OUTPUT_FILE"
# Process each hostname
while read -r host; do
# Skip empty lines
[[ -z "$host" ]] && continue
ipv4=$(dig +short A "$host" | head -n 1)
ipv6=$(dig +short AAAA "$host" | head -n 1)
echo -e "$host\t${ipv4:-N/A}\t${ipv6:-N/A}" >> "$OUTPUT_FILE"
done < "$INPUT_FILE"
echo "Done. Results written to $OUTPUT_FILE"
+4 -7
View File
@@ -15,16 +15,13 @@ Bash-Skript für schnelle SSH-Verbindungen zu easyname-Servern mit Kerberos-Auth
export LUSER="deinusername"
```
2. **Skript ausführbar machen**:
2. **Installation über Installer**:
```bash
chmod +x go.sh
# Im Repository-Hauptverzeichnis
./install.sh
```
3. **Optional: In PATH hinzufügen** oder Alias erstellen:
```bash
# Alias in ~/.bashrc
alias go="/pfad/zu/go.sh"
```
Das Installationsscript erstellt automatisch einen Symlink in `~/bin`, sodass `go` direkt verfügbar ist.
## Verwendung
Regular → Executable
+38 -5
View File
@@ -1,23 +1,31 @@
#!/usr/bin/env bash
# go - SSH-Shortcuts für easyname Server
# go improved - SSH-Shortcuts für easyname, WH20, adino und inname Server
# Maintainer: ljp
set -euo pipefail
LUSER="${LUSER:?Bitte LUSER setzen!}"
WHUSER="${WHUSER:?Bitte WHUSER setzen!}"
usage() {
cat <<USAGE
Usage:
go k|kinit
go w|web <NR> [EUSER] [-- <REMOTE-CMD>...]
go m|mx <NR> [-- <REMOTE-CMD>...]
go l|logger [-- <REMOTE-CMD>...]
go l|log|logger [-- <REMOTE-CMD>...]
go s|support [-- <REMOTE-CMD>...]
go a|adino
go i|inname
go o|wh20
Beispiele:
go web 42
go web 42 e110604
go mx 12 -- bash -lc 'hostname; uptime'
go logger -- bash -s # für Here-Doc
Serverliste:
Legacy-Server 01..26, 107, 114, 119, 501..532
WH20-Server 1..25
Adino-Server 212 237 244 251 252 268 272 279 280 285 307 327 353 358 395
inname-Server 20..30
USAGE
}
@@ -56,7 +64,7 @@ case "$cmd" in
exec ssh "$host" "$@"
;;
l|logger)
l|log|logger)
# go logger [-- REMOTE-CMD...]
host="${LUSER}@logger.in.nessus.at"
[[ $# -ge 1 && "$1" == "--" ]] && shift || true
@@ -70,6 +78,31 @@ case "$cmd" in
exec ssh "$host" "$@"
;;
o|wh20)
# go wh20 web NR
[[ $# -ge 1 ]] || { echo "Fehler: 'go wh20' benötigt <NR>." >&2; usage; exit 1; }
nr="$1"; shift || true
host="${WHUSER}@web${nr}.wh20.easyname.systems"
exec ssh "$host" "$@"
;;
a|adino)
# go adino srv NR
[[ $# -ge 1 ]] || { echo "Fehler: 'go adino' benötigt <NR>." >&2; usage; exit 1; }
nr="$1"; shift || true
host="${WHUSER}@srv${nr}.adino.at"
exec ssh "$host" "$@"
;;
i|inname)
# go adino srv NR
[[ $# -ge 1 ]] || { echo "Fehler: 'go inname' benötigt <NR>." >&2; usage; exit 1; }
nr="$1"; shift || true
host="${WHUSER}@ws${nr}.inname.net"
exec ssh "$host" "$@"
;;
*)
usage; exit 1
;;
+89
View File
@@ -0,0 +1,89 @@
# MYSQL Tool
Bashskript, das schnellere Datenbank-Downloads, Restore und sogar Backup-Restors vom BackupFTP ermöglicht.
---
## Features
- Datenbanken prüfen
- Datenbanken dumpen
- Datenbanken droppen
- Datenbanken aus SQL-File restoren
- Backups vom Backup-FTP direkt in das aktuelle Verzeichnis herunterladen
- Datenbanken aus einzelnen Tables und Schmemes mergen
---
## Installation
1. Als easyuser einloggen
2. Skript herunterladen
```bash
git clone <gitea-url>/esn-support-bash-snippets.git
cd esn-support-bash-snippets/<legacy|wh20>/<scriptname>
chmod +x <scriptname>
```
3. Skript ausführen
```bash
./mysqltool.sh
```
4. Skript nach erfolgreicher Bearbeitung im Kundencontainer entfernen
---
## Nutzung
### Standardaufruf
```bash
./mysqltool.sh
```
### Beispiele
```bash
./mysqltool.sh
./<scriptname> --option foo
./<scriptname> 2025-09-08
```
---
## Optionen
```
Usage: ./<scriptname> [OPTIONS]
--help Zeigt diese Hilfe
--option Beispieloption
YYYY-MM-DD Beispiel für Datumsargument
```
---
## Beispielausgabe
```
Hier ein Beispieloutput des Skripts.
```
---
## Setup-Hinweise
Falls notwendig, Alias in `~/.bashrc` setzen:
```bash
alias <scriptname>='~/pfad/zum/repo/<legacy|wh20>/<scriptname>/<scriptname>'
```
Logger-spezifisch ggf. in `~/.profile` ergänzen:
```bash
cd /var/log/easyname/$(date +%Y)/$(date +%m)/
```
---
## Notes
- Derzeit muss das Skript als eUser ausgeführt werden
- To-Do: Skript anpassen, sodass es ohne eUser ausgeführt werden kann
+225
View File
@@ -0,0 +1,225 @@
function mysql_tool ()
{
while :
do
PS3='Please enter your choice: '
echo "Press (1) fuer Datenbank Pruefung."
echo "Press (2) fuer Datenbank Dump."
echo "Press (3) fuer Datenbank Drop."
echo "Press (4) fuer Datenbank Restore."
echo "Press (5) fuer Backup download."
echo "Press (6) fuer Datenbank zusammen mergen."
echo "Press (q) fuer QUIT."
read -n1 wahl
echo ""
if [ "$wahl" == "q" ]
then
break
fi
case $wahl in
"1")
echo "Datenbank Name eingeben:"
read db_name
echo "Datenbank-Version MySQL 8:[y/n]:"
read -n1 db_ver
echo ""
db_host=localhost
read -s -p "Datenbank Passwort:" MYSQL_PWD
if [ "$db_ver" == "y" ]
then
db_host=$(awk '/mysql80.local/ {print $1}' /etc/hosts)
fi
echo [client] > $HOME/tmp/.my.cnf
echo "host=$db_host" >> $HOME/tmp/.my.cnf
echo "port=3307" >> $HOME/tmp/.my.cnf
echo "user=$db_name" >> $HOME/tmp/.my.cnf
echo "password=$MYSQL_PWD" >> $HOME/tmp/.my.cnf
echo ""
echo "Starte die Pruefung der Datenbank $db_name."
mysqlcheck --defaults-extra-file="$HOME/tmp/.my.cnf" -c --all-databases
rm $HOME/tmp/.my.cnf
;;
"2")
echo "Datenbank Name eingeben:"
read db_name
echo "Datenbank-Version MySQL 8:[y/n]:"
read -n1 db_ver
echo ""
db_host=localhost
read -s -p "Datenbank Passwort:" MYSQL_PWD
if [ "$db_ver" == "y" ]
then
db_host=$(awk '/mysql80.local/ {print $1}' /etc/hosts)
fi
echo [client] > $HOME/tmp/.my.cnf
echo "host=$db_host" >> $HOME/tmp/.my.cnf
echo "port=3307" >> $HOME/tmp/.my.cnf
echo "user=$(echo "$db_name"|awk -F/ '{print $NF}'|awk -F_ '{print $1}')" >> $HOME/tmp/.my.cnf
echo "password=$MYSQL_PWD" >> $HOME/tmp/.my.cnf
echo ""
echo "Zielverzeichnis eingeben:"
echo "Default = html"
read target_folder
if [ ! -n "target_folder" ]
then
target_folder=html
fi
echo "Starte einen Datenbank Dump fuer Datenbank $db_name nach $target_folder."
mysqldump --defaults-extra-file=$HOME/tmp/.my.cnf $db_name | gzip > "$HOME/$target_folder/$db_name$(date +_%M-%H-%d-%m-%Y).sql.gz"
rm $HOME/tmp/.my.cnf
;;
"3")
echo "Datenbank Name eingeben:"
read db_name
echo "Datenbank-Version MySQL 8:[y/n]:"
read -n1 db_ver
echo ""
db_host=localhost
read -s -p "Datenbank Passwort:" MYSQL_PWD
if [ "$db_ver" == "y" ]
then
db_host=$(awk '/mysql80.local/ {print $1}' /etc/hosts)
fi
echo [client] > $HOME/tmp/.my.cnf
echo "host=$db_host" >> $HOME/tmp/.my.cnf
echo "port=3307" >> $HOME/tmp/.my.cnf
echo "user=$db_name" >> $HOME/tmp/.my.cnf
echo "password=$MYSQL_PWD" >> $HOME/tmp/.my.cnf
echo ""
echo "Starte drop fuer Datenbank $db_name."
mysql --defaults-extra-file="$HOME/tmp/.my.cnf" -e "SHOW TABLES FROM $db_name"|grep -v "Tables_in_$db_name"|while read a
do
mysql --defaults-extra-file="$HOME/tmp/.my.cnf" -e "DROP TABLE $db_name"."$a"
done
rm $HOME/tmp/.my.cnf
;;
"4")
echo "Datenbank Name eingeben:"
read db_name
echo "Datenbank-Version MySQL 8:[y/n]:"
read -n1 db_ver
echo ""
db_host=localhost
read -s -p "Datenbank Passwort:" MYSQL_PWD
if [ "$db_ver" == "y" ]
then
db_host=$(awk '/mysql80.local/ {print $1}' /etc/hosts)
fi
echo [client] > $HOME/tmp/.my.cnf
echo "host=$db_host" >> $HOME/tmp/.my.cnf
echo "port=3307" >> $HOME/tmp/.my.cnf
echo "user=$(echo "$db_name"|awk -F/ '{print $NF}'|awk -F_ '{print $1}'|awk -F. '{print $1}')" >> $HOME/tmp/.my.cnf
echo "password=$MYSQL_PWD" >> $HOME/tmp/.my.cnf
echo ""
ndb_name=$(echo $db_name|awk -F/ '{print $NF}'|awk -F_ '{print $1}'|awk -F. '{print $1}')
echo "Starte Restore fuer Datenbank $ndb_name."
datend=$(echo $HOME/$db_name|awk -F. '{print $NF}')
if [ "$datend" == "gz" ]
then
zcat $HOME/$db_name|mysql --defaults-extra-file="$HOME/tmp/.my.cnf" $ndb_name
else
cat $HOME/$db_name|mysql --defaults-extra-file="$HOME/tmp/.my.cnf" $ndb_name
fi
rm $HOME/tmp/.my.cnf
;;
"5")
echo -n "Backupserver eingeben:"
read backup_serv
echo -n "Benutzername eingeben:"
read ftp_uname
read -s -p "FTP Passwort:" FTP_PWD
echo "machine $backup_serv" > $HOME/.netrc
echo "login $ftp_uname" >> $HOME/.netrc
echo "password $FTP_PWD" >> $HOME/.netrc
echo ""
wget_verz=""
while :
do
exec wget -O - ftp://"$backup_serv":21/"$wget_verz" 2>/dev/null|grep '^ '|sed 's/<a href="ftp:\/\/'$backup_serv':21//g'|awk -F\" '{print $1}'
echo "(Verzeichnis) oder (d) fuer Download listing. (q) fuer Quit."
read in_put
case $in_put in
"q")
rm $HOME/.netrc
break
;;
"d")
wget_opt="-r"
wget -r -l 100 ftp://"$backup_serv":21/"$wget_verz"
;;
*)
wget_verz=$(echo $in_put|sed 's/^\///g')
;;
esac
done
;;
"6")
while :
do
echo -n "Quell Ordner angeben:"
read infold
if [ -d "$infold" ]
then
break
else
echo "Quell Ordner $infold nicht gefunden."
fi
done
while :
do
echo -n "Quell Datenbank angeben:"
read indb
testf=$(find $infold -maxdepth 1 -type f -name $indb\*.sql)
if [ "$testf" != "" ]
then
break
else
echo "Quell Datenbank $infold/$indb nicht gefunden"
fi
done
echo -n "Ziel Datenbank angeben:"
read targetdb
if [ -f "$targetdb" ]
then
echo "$targetdb ueberschreiben [y/n]:"
read userwrite
if [ $userwrite == y -o $userwrite == j ]
then
> "$targetdb"
find $infold -maxdepth 1 -type f -name $indb\*schema.sql|grep -v schema-post.sql|while read a
do
cat "$a" 2>/dev/null >> "$targetdb"
echo "$(basename "$a") zu $(basename "$targetdb") erfolgreich hinzugefuegt"
done
echo "# Schemas der Datenbank $indb zu $targetdb erfolgreich hinzugefuegt"
find $infold -maxdepth 1 -type f -name $indb\*00000.sql|grep -v schema-post.sql|while read a
do
cat "$a" 2>/dev/null >> "$targetdb"
echo "$(basename "$a") zu $(basename "$targetdb") erfolgreich hinzugefuegt"
done
echo "# Tables der Datenbank $indb erfolgreich in Datenbank $targetdb hinzugefuegt."
else
echo "Benutzer Abbruch"
exit 1
fi
else
find $infold -maxdepth 1 -type f -name $indb\*schema.sql|grep -v schema-post.sql|while read a
do
cat "$a" 2>/dev/null >> "$targetdb"
echo "$(basename "$a") zu $(basename "$targetdb") erfolgreich hinzugefuegt"
done
echo "# Schemas der Datenbank $indb zu $targetdb erfolgreich hinzugefuegt"
find $infold -maxdepth 1 -type f -name $indb\*00000.sql|grep -v schema-post.sql|while read a
do
cat "$a" 2>/dev/null >> "$targetdb"
echo "$(basename "$a") zu $(basename "$targetdb") erfolgreich hinzugefuegt"
done
echo "# Tables der Datenbank $indb erfolgreich in Datenbank $targetdb hinzugefuegt."
fi
;;
*)
echo "invalid option $REPLY"
;;
esac
done
}
+24 -9
View File
@@ -1,4 +1,4 @@
# mail.sh – Remote Datei-Downloader für PINC-Mails
# mail.sh – Remote Datei-Downloader für E-Mail-Dateien
**Wichtig:**
Bevor du das Skript verwendest, führe folgende Schritte aus:
@@ -19,19 +19,33 @@ Bevor du das Skript verwendest, führe folgende Schritte aus:
## Beschreibung
Dieses Skript lädt Dateien, die einem bestimmten Muster entsprechen, von einem Remote-Server herunter. Es sucht in allen Subdirectories unter `/Apps/easyname/run/pinc*/` nach Dateien, die mit der angegebenen Kundennummer beginnen.
Dieses Skript lädt E-Mail-Dateien (.eml), die einem bestimmten Muster entsprechen, von einem Remote-Server herunter. Es bietet ein interaktives Menü zur Auswahl des Projekts (pinc oder php-es-info) und sucht dann in allen Subdirectories unter `/Apps/easyname/run/<projekt>*/` nach Dateien, die mit der angegebenen Kundennummer beginnen.
## Nutzung
```bash
./mail.sh <Kundennummer>
./mail.sh
```
Das Skript führt Sie interaktiv durch folgende Schritte:
1. **Kundennummer eingeben:** Das Skript fragt nach der Kundennummer, die nicht leer sein darf.
2. **Projekt auswählen:** Wählen Sie zwischen:
- `1` für **pinc**
- `2` für **php-es-info**
**Beispiel:**
```bash
./mail.sh 123
./mail.sh
Bitte geben Sie eine Kundennummer ein:
Kundennummer: 123
Bitte wählen Sie ein Projekt:
1) pinc
2) php-es-info
Ihre Auswahl (1 oder 2): 1
```
Das Skript sucht dann nach allen Dateien, die mit `123-` beginnen, und lädt sie in ein lokales Verzeichnis `./123/` herunter.
Das Skript sucht dann nach allen `.eml`-Dateien, die mit `123` beginnen, und lädt sie in ein lokales Verzeichnis `./123/` herunter.
## Voraussetzungen
@@ -41,10 +55,11 @@ Das Skript sucht dann nach allen Dateien, die mit `123-` beginnen, und lädt sie
## Ablauf
1. Das Skript prüft, ob eine Nummer als Argument übergeben wurde.
2. Es verbindet sich per SSH mit dem Server und sucht in allen passenden Subdirectories nach Dateien, die mit `<Kundennummer>-` beginnen.
3. Gefundene Dateien werden in ein lokales Verzeichnis mit dem Namen der Nummer heruntergeladen (z.B. `./123/`).
4. Das lokale Verzeichnis wird automatisch erstellt, falls es noch nicht existiert.
1. Das Skript fragt interaktiv nach der Kundennummer (darf nicht leer sein).
2. Das Skript zeigt ein Menü zur Auswahl des Projekts (pinc oder php-es-info).
3. Es verbindet sich per SSH mit dem Server und sucht in allen passenden Subdirectories unter `/Apps/easyname/run/<projekt>*/` nach `.eml`-Dateien, die mit der eingegebenen Kundennummer beginnen.
4. Gefundene Dateien werden in ein lokales Verzeichnis mit dem Namen der Kundennummer heruntergeladen (z.B. `./123/`).
5. Das lokale Verzeichnis wird automatisch erstellt, falls es noch nicht existiert.
## Fehlerbehandlung
Regular → Executable
+45 -12
View File
@@ -1,26 +1,55 @@
#!/bin/bash
# Überprüfen, ob ein Parameter übergeben wurde
if [ -z "$1" ]; then
echo "Bitte geben Sie eine Nummer als Argument an. Beispiel: $0 123"
exit 1
# Kundennummer eingeben
while true; do
echo "Bitte geben Sie eine Kundennummer ein:"
read -p "Kundennummer: " customerNumber
if [ -z "$customerNumber" ]; then
echo "Kundennummer darf nicht leer sein."
echo ""
else
break
fi
done
# Definieren Sie die Verbindungsdetails
# Server und LUSER definieren
server="appdb02.in.easyname.com"
LUSER="${LUSER:?Bitte LUSER setzen!}" # Setzen Sie hier Ihren Benutzernamen ein, wenn LUSER nicht als Umgebungsvariable gesetzt ist
# Menu zur Auswahl des Remote-Directories
while true; do
echo "Bitte wählen Sie ein Projekt:"
echo "1) pinc"
echo "2) php-es-info"
read -p "Ihre Auswahl (1 oder 2): " choice
case $choice in
1)
remoteDir="pinc"
break
;;
2)
remoteDir="php-es-info"
break
;;
*)
echo "Ungültige Auswahl. Bitte wählen Sie 1 oder 2."
echo ""
;;
esac
done
# Remote-Directory überprüfen und Subdirectories auflisten, unter Verwendung von bash
remoteDirectories=$(ssh "$LUSER@$server" "bash -c 'ls -d /Apps/easyname/run/pinc*/*/'")
remoteDirectories=$(ssh "$LUSER@$server" "bash -c 'ls -d /Apps/easyname/run/${remoteDir}*/*/'")
# Wenn keine Verzeichnisse gefunden wurden, Skript beenden
if [ -z "$remoteDirectories" ]; then
echo "Keine Subdirectories in /Apps/easyname/run/pinc/ gefunden."
echo "Keine Subdirectories in /Apps/easyname/run/${remoteDir}/ gefunden."
exit 1
fi
localSavePath="$PWD/$1" # Setzt den lokalen Speicherpfad relativ zum aktuellen Verzeichnis
filePattern="$1-*"
localSavePath="$PWD/$customerNumber" # Setzt den lokalen Speicherpfad relativ zum aktuellen Verzeichnis
filePattern="$customerNumber*.eml"
# Schleife über die gefundenen Verzeichnisse und in jedem Verzeichnis nach Dateien suchen
fileList=""
@@ -52,14 +81,18 @@ if [ ! -d "$localSavePath" ]; then
fi
fi
# Herunterladen der Dateien vom Remote-Server
# Herunterladen der Dateien vom Remote-Server (mit Nummernpräfix gegen Überschreiben gleicher Namen aus verschiedenen Unterordnern)
counter=1
for file in $fileList; do
scp "$LUSER@$server:$file" "$localSavePath/"
basename=$(basename "$file")
localFile="${localSavePath}/${counter}_${basename}"
scp "$LUSER@$server:$file" "$localFile"
if [ $? -ne 0 ]; then
echo "Fehler beim Herunterladen der Datei $file."
else
echo "Datei $file erfolgreich heruntergeladen."
echo "Datei $file erfolgreich heruntergeladen als ${counter}_${basename}."
fi
((counter++))
done
echo "Alle Dateien wurden im Verzeichnis $localSavePath gespeichert."
+99
View File
@@ -0,0 +1,99 @@
# wpchecker
Tool zum Schnellen prüfen mehrerer WordPress-Installationen
---
## Features
- Prüfen der Coreversion
- Prüfen der Core Checksums
- Prüfen der Plugin Checksums
- Prüfen der Adminnutzer
---
## Installation
1. Repository klonen oder Skript kopieren:
```bash
git clone git.int.loki-net.at/esn-support-bash-snippets.git
cd esn-support-bash-snippets/legacy/wpchecker
chmod +x wpchecker.sh
```
2. Abhängigkeiten (falls vorhanden) installieren:
- [`wp-cli`](https://group-one.atlassian.net/wiki/spaces/EASYNAME/pages/33673314407/WP-CLI-Mastery)
---
## Nutzung
Skript kann im Prinzip von überall aus dem Usercontainer abgesetzt werden, da es über die $HOME-Variable direkt das html-Verzeichnis prüft.
### Standardaufruf
```bash
./wpchecker.sh
```
### Beispiele
```bash
./wpchecker.sh
```
---
## Optionen
```
Usage: ./<scriptname> [OPTIONS]
--help Zeigt diese Hilfe
--option Beispieloption
YYYY-MM-DD Beispiel für Datumsargument
```
---
## Beispielausgabe
```bash
bash wpchecker
WPChecker wird gestartet...
Führe zu prüfenden Usernamen an: yun
yun
Führe Stammverzeichnis der zu prüfenden WordPress-Installationen an: html
html
Beginne Prüfung der WordPress-Installationen
++++++++++++++++++++
Prüfe html/pbtest/classicp
+++++++++++++++++
6.2.9
X Coresum-Fehler!
OK Kein eindeutiger Hinweis auf wp2shell!
OK Plugins okay!
Prüfe html/apps/wordpress-134151
+++++++++++++++++
7.1
OK Kein eindeutiger Hinweis auf wp2shell!
OK Plugins okay!
```
---
## Setup-Hinweise
Falls notwendig, Alias in `~/.bashrc` des Kunden setzen:
```bash
alias wpchecker='~/bin/wpchecker.sh'
```
---
## Notes
- WP-CLI muss unter /data/web/eUser/bin abgelegt und ausführbar sein
- ToDos
- non-interaktive Version bauen
+66
View File
@@ -0,0 +1,66 @@
#! /usr/bin/env bash
# Tool zum Schnellen prüfen mehrerer WordPress-Installationen
# Maintainer: peignerpausz
set -ou pipefail
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
RESET="\033[0m"
declare -a wpuser
declare wppath
declare uploads
printf "WPChecker wird gestartet...\n\n"
printf "Führe zu prüfenden Usernamen an: "
read -a wpuser
echo "${wpuser[@]}"
printf "Führe Stammverzeichnis der zu prüfenden WordPress-Installationen an: "
read wppath
echo "$wppath"
printf "Beginne Prüfung der WordPress-Installationen\n++++++++++++++++++++\n"
for wordpress in $(find $wppath -type f -name "wp-config.php" -exec dirname {} \;); do
[[ -d "$wordpress" ]] || continue
# Setzt Prüfung nur für alle Verzeichnisse mit einer vorhandenen wp-config.php fort.
# Wenn viele Verzeichnisse geprüft werden ist für die Übersichtlichkeit die Unterdrückung von Fehlern mittels 2>/dev/null empfehlenswert.
printf "\nPrüfe $wordpress\n+++++++++++++++++\n"
corev=$(php ~/bin/wp-cli.phar core version --path="$wordpress")
printf "${YELLOW}%s${RESET}\n" "$corev"
coresum=$(php ~/bin/wp-cli.phar core verify-checksums --path="$wordpress" 2>/dev/null)
if [[ $? > 0 ]]; then
printf "${RED}X${RESET} Coresum-Fehler!\n"
else
printf="${GREEN}OK${RESET} Coresum okay!\n"
fi
userlist=$(php ~/bin/wp-cli.phar user list --role=administrator --path="$wordpress")
for a in "${wpuser[@]}"; do
if printf "%s" "$userlist" | grep -Fq -- $a; then
printf "${RED}X${RESET} Hinweis auf wp2hsell gefunden! Username: %s\n Rate zur Prüfung von wp-content/uploads auf .htaccess und php-Files.\n" "$a"
else
printf "${GREEN}OK${RESET} Kein eindeutiger Hinweis auf wp2shell!\n"
fi
done
plugincheck=$(php ~/bin/wp-cli.phar plugin verify-checksums --all --path="$wordpress" 2>/dev/null)
if [[ $? > 0 ]]; then
printf "${RED}X${RESET} Plugins prüfen!\n Rate zur Prüfung von wp-content/uploads auf .htaccess- und .php-Files\n"
else
printf "${GREEN}OK${RESET} Plugins okay!\n"
fi
for uploads in $(find $wppath -type d -wholename "wp-content/uploads" -exec dirname {} \;); do
[[ -d "$uploads" ]] || continue
printf "Prüfe Upload-Folder auf verdächtige .htaccess-Files\n"
htaccesschecker=$(find "$uploads" -type f -name ".htaccess")
if printf "%s" "$htaccesschecker" | grep "*.php"; then
printf "${RED}X${RESET} .htaccess im Uploadfolder gefunden: %s\n" "$htaccesschecker"
else
printf"${GREEN}OK${RESET} keine .htaccess im Uploadfolder gefunden!\n"
fi
printf "Prüfe Upload-Folder auf verdächtige php-Files\n"
phpchecker=$(find "$uploads" -type f -name "*.php" | wc -l)
if [[ "$phpchecker" > 0 ]]; then
printf "${RED}X${RESET} PHP-Files im Uploadfolder gefunden: %s\n" "$phpchecker"
else
printf "${GREEN}OK${RESET} keine PHP-Files im Uploadfolder gefunden!\n"
fi
done
done
Executable
+248
View File
@@ -0,0 +1,248 @@
#!/usr/bin/env bash
# update.sh - Update-Script für easyname Support Bash-Snippets
# Maintainer: ljp
# Aktualisiert Repository und re-linkt installierte Tools
set -euo pipefail
# Farben für Output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
# Script-Verzeichnis ermitteln
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Dry-run Modus
DRY_RUN=false
# Logging-Funktionen
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_dry_run() {
echo -e "${YELLOW}[DRY-RUN]${NC} $1"
}
# Hilfsfunktionen
check_git_repo() {
if [[ ! -d "$SCRIPT_DIR/.git" ]]; then
log_error "Kein Git-Repository gefunden in $SCRIPT_DIR"
log_error "Bitte das Repository ordnungsgemäß klonen!"
exit 1
fi
}
backup_current_state() {
local backup_dir="$SCRIPT_DIR/.update_backup_$(date +%Y%m%d_%H%M%S)"
if [[ "$DRY_RUN" == "true" ]]; then
log_dry_run "Würde Backup erstellen: $backup_dir"
return
fi
log_info "Erstelle Backup des aktuellen Zustands..."
mkdir -p "$backup_dir"
# Backup wichtiger Dateien falls sie modifiziert wurden
for file in "install.sh" "update.sh" "README.md"; do
if [[ -f "$SCRIPT_DIR/$file" ]]; then
cp "$SCRIPT_DIR/$file" "$backup_dir/"
fi
done
log_success "Backup erstellt: $backup_dir"
}
update_repository() {
log_info "Aktualisiere Repository..."
if [[ "$DRY_RUN" == "true" ]]; then
log_dry_run "Würde ausführen: git fetch origin"
log_dry_run "Würde ausführen: git pull origin main"
return
fi
# Fetch latest changes
if ! git fetch origin; then
log_error "Fehler beim Fetch der Remote-Änderungen"
exit 1
fi
# Check if updates available
local local_commit
local_commit=$(git rev-parse HEAD)
local remote_commit
remote_commit=$(git rev-parse origin/main)
if [[ "$local_commit" == "$remote_commit" ]]; then
log_info "Repository ist bereits auf dem neuesten Stand"
return 0
fi
log_info "Updates gefunden, führe Pull durch..."
if ! git pull origin main; then
log_error "Fehler beim Pull der Änderungen"
log_error "Bitte manuell lösen und erneut versuchen"
exit 1
fi
log_success "Repository erfolgreich aktualisiert"
return 1 # Updates wurden angewendet
}
find_installed_tools() {
local installed_tools=()
# Suche nach Symlinks in ~/bin die auf dieses Repository zeigen
if [[ -d "$HOME/bin" ]]; then
while IFS= read -r -d '' symlink; do
local target
target=$(readlink "$symlink")
# Prüfe ob Symlink auf dieses Repository zeigt
if [[ "$target" == "$SCRIPT_DIR"* ]]; then
local tool_name
tool_name=$(basename "$symlink")
installed_tools+=("$tool_name:$target")
fi
done < <(find "$HOME/bin" -type l -print0 2>/dev/null || true)
fi
printf '%s\n' "${installed_tools[@]}"
}
relink_tools() {
log_info "Suche installierte Tools..."
local installed_tools
mapfile -t installed_tools < <(find_installed_tools)
if [[ ${#installed_tools[@]} -eq 0 ]]; then
log_info "Keine installierten Tools gefunden"
return
fi
log_info "Gefundene Tools: ${#installed_tools[@]}"
for tool_info in "${installed_tools[@]}"; do
IFS=':' read -r tool_name old_target <<< "$tool_info"
local symlink_path="$HOME/bin/$tool_name"
log_info "Aktualisiere Symlink für: $tool_name"
if [[ "$DRY_RUN" == "true" ]]; then
log_dry_run "Würde Symlink aktualisieren: $symlink_path -> $old_target"
else
# Symlink neu erstellen (aktualisiert automatisch den Pfad)
ln -sf "$old_target" "$symlink_path"
log_success "$tool_name Symlink aktualisiert"
fi
done
}
# Hilfsfunktion
show_help() {
cat <<HELP
Usage: $0 [OPTIONS]
Update-Script für easyname Support Bash-Snippets
Optionen:
--dry-run, -n Zeigt nur was gemacht würde, ohne Änderungen
--help, -h Zeigt diese Hilfe an
Das Script:
1. Erstellt ein Backup des aktuellen Zustands
2. Aktualisiert das Repository (git pull)
3. Erneuert Symlinks der installierten Tools
4. Macht neue Scripts ausführbar
Beispiele:
$0 Führt Update durch
$0 --dry-run Testet Update ohne Änderungen
HELP
}
# Hauptfunktion
main() {
# Argumente parsen
while [[ $# -gt 0 ]]; do
case $1 in
--dry-run|-n)
DRY_RUN=true
shift
;;
--help|-h)
show_help
exit 0
;;
*)
log_error "Unbekannte Option: $1"
show_help
exit 1
;;
esac
done
if [[ "$DRY_RUN" == "true" ]]; then
log_info "=== DRY-RUN MODUS AKTIVIERT ==="
log_info "Keine Änderungen werden vorgenommen!"
echo ""
fi
log_info "=== easyname Support Bash-Snippets Updater ==="
if [[ "$DRY_RUN" == "true" ]]; then
echo -e "${YELLOW}(DRY-RUN MODUS)${NC}"
fi
log_info "Repository-Pfad: $SCRIPT_DIR"
# Validierungen
check_git_repo
# Backup erstellen
backup_current_state
# Repository aktualisieren
if update_repository; then
log_info "Keine Updates verfügbar, überspringe Relink"
exit 0
fi
# Tools re-linken
relink_tools
# Scripts ausführbar machen
log_info "Stelle sicher dass neue Scripts ausführbar sind..."
if [[ "$DRY_RUN" == "true" ]]; then
log_dry_run "Würde neue .sh Dateien ausführbar machen"
else
find "$SCRIPT_DIR" -name "*.sh" -type f -exec chmod +x {} \;
log_success "Scripts sind ausführbar"
fi
log_success "Update erfolgreich abgeschlossen!"
if [[ "$DRY_RUN" == "false" ]]; then
echo -e "\n${YELLOW}Hinweis: Starte eine neue Shell oder führe 'source ~/.bashrc' aus${NC}"
fi
}
# Script starten
main "$@"
+15 -1
View File
@@ -20,9 +20,23 @@ Die Dokumentationen werden in Unterordnern zu den jeweiligen Skripten gepflegt.
### [`plesk`](./plesk)
Dieses Skript stellt eine SSH-Verbindung zu einem angegebenen Webserver her und generiert so einen einmaligen Login-Link für das Plesk Admin Panel des gewünschten Servers.
- [Dokumentation & Beispiele](./plesk/README.md)
### [`wh20`](./wh20)
Dieses Skript verbindet zum angegbenen Webserver via SSH
- [Dokumentation & Beispiele](./wh20/README.md)
### [`spamcheck`](./spamcheck)
Dieses Skript ermöglicht den schnellen Check nach MS365-Fehlercodes, sowie für Spamhaus-Blockmeldungen.
- [Dokumentation & Beispiele](./spamcheck/README.md)
### [`adspam`](./adspam)
Dieses Skript ermöglicht den schnellen Check nach MS365-Fehlercodes, sowie für Spamhaus-Blockmeldungen auf Adino-Server direkt von der Connect aus.
- [Dokumentation & Beispiele](./adspam/README.md)
### [`donaspam`](./donaspam)
Dieses Skript ermöglicht den schnellen Check nach MS365-Fehlercodes, sowie für Spamhaus-Blockmeldungen auf DONA-Server direkt von der Connect aus.
- [Dokumentation & Beispiele](./donaspam/README.md)
## Lizenz / Sichtbarkeit
+64
View File
@@ -0,0 +1,64 @@
# adspam - schneller Spamcheck für MS365 und Spamhaus auf Adino-Server
## Funktion
Dieses Skript führt am jeweiligen adino-Host ein grep für geläufige MS365-Fehlercodes sowie Spamhaus auf /var/log/maillog durch und gibt die Anzahl der Treffer für dieses an.
Sofern keine Ergebnisse für den jeweiligen Tag gefunden werden, werden nur die Beginn- und Endzeile des Checks ausgegeben.
## Voraussetzungen
- SSH-Zugriff auf den Zielserver
- Das [`spamcheck`](../spamcheck/spamcheck.sh)-Skript muss auf den Zielservern installiert und ausführbar sein.
- Das [`adspam`](./adspam.sh)-Skript ist korrekt auf der connect installiert und ausführbar.
## Installation
```bash
cd
mkdir bin && cd bin
vi adspam
chmod +x adspam
```
## Verwendung
```bash
USER@connect-lej ~ $ adspam
```
## Syntax
```bash
adspam
```
## Beispiele
```bash
# Von der Connect aus abgesetzt.
USER@connect-lej ~ $ adspam
=== Todays Spamcheck on Wed Apr 15 13:13:22 CEST 2026 ===
=== srv244.adino.at Spamcheck ===
✅ All systems green.
=== srv251.adino.at Spamcheck ===
✅ All systems green.
=== srv252.adino.at Spamcheck ===
✅ All systems green.
=== srv268.adino.at Spamcheck ===
✅ All systems green.
=== srv272.adino.at Spamcheck ===
✅ All systems green.
```
## Troubleshooting
# zu hohe Anzahl an S3150
Am jeweiligen adino-Webserver prüfen durch gezieltes grep nach `S3150`, ob es sich hierbei um einen anderen String handelt, da Plesk leider auch den String verwendet. -->
```bash
sudo grep -F 'S3150' /var/log/maillog
```
---
*Maintainer: peignerpausz*
+9
View File
@@ -0,0 +1,9 @@
#! /usr/bin/env bash
# Automatisierter Spamcheck für MS365 error-codes und Spamhaus rejections auf Adino-Server
# Maintainer: peignerpausz
printf '⚠️ Initiating Spamcheck for adino-servers! ⚠️ \n \n'
for a in 244 251 252 268 272
do ssh srv$a.adino.at -- bash -lc '~/bin/spamcheck'
done
echo
+144
View File
@@ -0,0 +1,144 @@
# damagereport - 📬 your daily dose of mail-damage
Kurzbeschreibung des Skripts:
![Damage Report Picard](https://i.imgflip.com/1hdas2.jpg)
Am besten in die .bashrc packen, damit es bei jedem Systemstart einem Schlecht wird. 🥴
---
## Features
- Kombinierte Abfrage von checkms, adspam und donaspam
---
## Installation
1. Repository klonen oder Skript kopieren:
```bash
git clone <gitea-url>/esn-support-bash-snippets.git
cd esn-support-bash-snippets/wh20/damagereport.sh
chmod +x damagereport.sh
```
2. Abhängigkeiten installieren:
- [`checkms`](../../legacy/checkms/checkms.sh)
- [`adspam`](../adspam/adspam.sh)
- [`donaspam`](../donaspam/donaspam.sh)
- [`spamcheck`](../spamcheck/spamcheck.sh) --> muss auf jedem zu prüfenden Server unter `~/bin/spamcheck` hinterlegt sein. Siehe [Serverliste](./serverliste.md)
---
## Nutzung
### Standardaufruf
```bash
./damagereport.sh
```
### Beispiele
```bash
./damagereport.sh
./damagereport.sh 2025-09-08 # Variable Logabfrage muss erst in adspam, donaspam und spamcheck implementiert werden
```
---
## Optionen
```bash
Usage: ./damagereport.sh [OPTIONS]
--help Zeigt diese Hilfe
--option Beispieloption
YYYY-MM-DD Beispiel für Datumsargument
```
---
## Beispielausgabe
```bash
eign01@connect-lej ~ $ damagereport
Bridge, give me Fri Apr 17 12:49:51 CEST 2026 damagereport!
🚨 Initiating damagereport for mailservices!
Starte checkms fuer 2026-04-17
Analysiere 2026-04-17.log
COUNT IP CODE
----- ---------------- ------
⚠️ Initiating Spamcheck for adino-servrs ⚠️
🚀 srv212.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv237.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv244.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv251.adino.at Spamcheck 🛠️
❌ Anzahl S7772: 6
🚀 srv252.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv268.adino.at Spamcheck 🛠️
❌ Anzahl S7772: 6
🚀 srv272.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv279.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv280.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv285.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv307.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv327.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv353.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv358.adino.at Spamcheck 🛠️
✅ All systems green.
🚀 srv395.adino.at Spamcheck 🛠️
✅ All systems green.
⚠️ Initiating spamcheck on inname-servers
=== ws20.inname.net Spamcheck ===
✅ All systems green.
=== ws21.inname.net Spamcheck ===
✅ All systems green.
=== ws22.inname.net Spamcheck ===
✅ All systems green.
=== ws23.inname.net Spamcheck ===
✅ All systems green.
=== ws24.inname.net Spamcheck ===
✅ All systems green.
=== ws25.inname.net Spamcheck ===
✅ All systems green.
=== ws26.inname.net Spamcheck ===
✅ All systems green.
=== ws27.inname.net Spamcheck ===
❌ Anzahl S3150: 5
=== ws28.inname.net Spamcheck ===
✅ All systems green.
=== ws29.inname.net Spamcheck ===
✅ All systems green.
=== ws30.inname.net Spamcheck ===
✅ All systems green.
```
---
## Setup-Hinweise
Falls notwendig, Alias in `~/.bashrc` setzen:
```bash
alias damagereport='~/pfad/zum/repo/wh20/damagereport/damagereport.sh'
```
---
## Notes
- Derzeit kombiniert dieses Skript wirklich nur die Standardausgaben von checkms, adspam und donaspam in einen zusammenhängenden Bericht.
- ToDos
- `spamcheck` - und damit `adspam` und `donaspam` - auch auf andere Logs als `/var/log/maillog` zugreifen lassen
+26
View File
@@ -0,0 +1,26 @@
#! /usr/bin/env bash
# Damagereport - kombinierte Ausgabe von checkms, adspam und donaspam
# Maintainer: peignerpausz
# --- Funktionen ---
usage() {
cat <<USAGE
Usage: $0 [OPTIONS] [YYYY-MM-DD]
kombinierte Ausgabe von checkms, adspam und donaspam
Konfig-Optionen:
--help Diese Hilfe
USAGE
}
# --- Argumente parsen ---
while [[ $# -gt 0 ]]; do
case "$1" in
--help) usage; exit 0 ;;
*) echo "Unbekannte Option: $1" >&2; usage; exit 1 ;;
esac
done
printf "Bridge, give me %s damagereport! \n \n" "$(date)"
printf "⚠️ Initiating damagereport for our mailservers! \n"
bash ~/bin/checkms && ~/bin/adspam && ~/bin/donaspam
+47
View File
@@ -0,0 +1,47 @@
# Serverliste
# Legacy-Server
![The good stuff](https://media.npr.org/assets/img/2023/05/26/honest-work-meme-c7034f8bd7b11467e1bfbe14b87a5f6a14a5274b.jpg)
- web01.in.easyname.com..web26.in.easyname.com
- web107
- web114
- web119
- web501.in.easyname.com..web532.in.easyname.com
# WH20-Server
![The not so good stuff](https://i.imgflip.com/9r6lbk.jpg)
- web1.wh20.easyname.systems .. web25.wh20.easyname.systems
## inname
![DONA - where servers go to die](https://thenib.com/wp-content/uploads/2019/08/this-is-not-fine-004-4f0492-1.png)
- ws20.inname.net
- ws21.inname.net
- ws22.inname.net
- ws23.inname.net
- ws24.inname.net
- ws25.inname.net
- ws26.inname.net
- ws27.inname.net
- ws28.inname.net
- ws29.inname.net
- ws30.inname.net
## adino
![adino beim Benamsen der Server so](https://www.gifcen.com/wp-content/uploads/2022/05/kylo-ren-more-gif.gif)
- srv212.adino.at
- srv237.adino.at
- srv244.adino.at
- srv251.adino.at
- srv252.adino.at
- srv268.adino.at
- srv272.adino.at
- srv279.adino.at
- srv280.adino.at
- srv285.adino.at
- srv307.adino.at
- srv327.adino.at
- srv353.adino.at
- srv358.adino.at
- srv395.adino.at
+76
View File
@@ -0,0 +1,76 @@
# adspam - schneller Spamcheck für MS365 und Spamhaus auf inname-Server
## Funktion
Dieses Skript führt am jeweiligen inname-Host ein grep für geläufige MS365-Fehlercodes sowie Spamhaus auf /var/log/maillog durch und gibt die Anzahl der Treffer für dieses an.
Sofern keine Ergebnisse für den jeweiligen Tag gefunden werden, werden nur die Beginn- und Endzeile des Checks ausgegeben.
## Voraussetzungen
- SSH-Zugriff auf den Zielserver
- Das [`spamcheck`](../spamcheck/spamcheck.sh)-Skript muss auf den Zielservern installiert und ausführbar sein.
- Das [`donaspam`](./donaspam.sh)-Skript ist korrekt auf der connect installiert und ausführbar.
## Installation
```bash
cd
mkdir bin && cd bin ## nur wenn der Folder nicht bereits vorhanden ist
vi donaspam
chmod +x donaspam
```
## Verwendung
```bash
USER1@connect-lej ~ $ donaspam
```
## Syntax
```bash
donaspam
```
## Beispiele
```bash
# Von der Connect aus abgesetzt.
USER@connect-lej ~ $ donaspam
=== Todays Spamcheck on Wed Apr 15 13:23:04 CEST 2026 ===
=== ws20.inname.net Spamcheck ===
✅ All systems green.
=== ws21.inname.net Spamcheck ===
✅ All systems green.
=== ws22.inname.net Spamcheck ===
✅ All systems green.
=== ws23.inname.net Spamcheck ===
✅ All systems green.
=== ws24.inname.net Spamcheck ===
✅ All systems green.
=== ws25.inname.net Spamcheck ===
✅ All systems green.
=== ws26.inname.net Spamcheck ===
❌ Anzahl S3150: 24
=== ws27.inname.net Spamcheck ===
✅ All systems green.
=== ws28.inname.net Spamcheck ===
❌ Anzahl S775: 5
=== ws29.inname.net Spamcheck ===
✅ All systems green.
=== ws30.inname.net Spamcheck ===
✅ All systems green.
```
## Troubleshooting
# zu hohe Anzahl an S3150
Am jeweiligen inname-Webserver prüfen durch gezieltes grep nach `S3150`, ob es sich hierbei um einen anderen String handelt, da Plesk leider auch den String verwendet. -->
```bash
sudo grep -F 'S3150' /var/log/maillog
```
---
*Maintainer: peignerpausz*
+8
View File
@@ -0,0 +1,8 @@
#! /usr/bin/env bash
# Automatisierter Spamcheck für MS365 error-codes und Spamhaus rejections auf inname-Server
# Maintainer: peignerpausz
printf '⚠️ Initiating Spamcheck for inname-servers! ⚠️ \n \n'
for a in {20..30}
do ssh ws$a.inname.net -- bash -lc '~/bin/spamcheck'
done
+12 -5
View File
@@ -2,7 +2,7 @@
## Funktion
Dieses Skript stellt eine SSH-Verbindung zu einem angegebenen Webserver her und generiert so einen einmaligen Login-Link für das Plesk Admin Panel des gewünschten Servers.
Dieses Skript stellt eine SSH-Verbindung zu einem angegebenen Webserver her und generiert so einen einmaligen Login-Link für das Plesk Admin Panel des gewünschten Servers. Optional kann über den Parameter `--tenant` die Domain angepasst werden.
## Voraussetzungen
@@ -33,16 +33,23 @@ Dieses Skript stellt eine SSH-Verbindung zu einem angegebenen Webserver her und
3. **Skript ausführen:**
```bash
./plesk.sh <webserver>
./plesk.sh <webserver> [--tenant adino|dona]
```
Beispiel:
Beispiele:
```bash
./plesk.sh web15
./plesk.sh srv272 --tenant adino
./plesk.sh ws12 --tenant dona
```
Das Skript verbindet sich dann mit `web15.wh20.easyname.systems` und öffnet das Plesk Admin Panel.
- Ohne Angabe von `--tenant` wird die Domain `<webserver>.wh20.easyname.systems` verwendet.
- Mit `--tenant adino` wird die Domain `<webserver>.adino.at` verwendet.
- Mit `--tenant dona` wird die Domain `<webserver>.inname.net` verwendet.
Das Skript verbindet sich dann mit dem jeweiligen Server und öffnet das Plesk Admin Panel.
## Hinweise
- Das Skript erwartet als Argument den Namen des Webservers (z.B. `web15`).
- Optional kann mit `--tenant adino` oder `--tenant dona` die Domain angepasst werden.
- Es wird eine SSH-Verbindung aufgebaut und der Befehl `sudo plesk login` auf dem Zielserver ausgeführt.
- Die Ausgabe enthält einen Link, mit dem du dich direkt im Plesk Admin Panel anmelden
- Die Ausgabe enthält einen Link, mit dem du dich direkt im Plesk Admin Panel anmelden kannst.
+39 -3
View File
@@ -1,9 +1,45 @@
#!/bin/bash
# Get the servername argument
servername="$1.wh20.easyname.systems"
# Parse arguments
servername=""
tenant=""
while [[ $# -gt 0 ]]; do
case "$1" in
--tenant)
tenant="$2"
shift 2
;;
*)
servername="$1"
shift
;;
esac
done
if [ -z "$servername" ]; then
echo "Usage: $0 <webserver> [--tenant adino|dona]"
exit 1
fi
# Set domain based on tenant
case "$tenant" in
adino)
fqdn="$servername.adino.at"
;;
dona)
fqdn="$servername.inname.net"
;;
"")
fqdn="$servername.wh20.easyname.systems"
;;
*)
echo "Unbekannter Tenant: $tenant"
exit 1
;;
esac
# Define the username
username="${WHUSER:?Bitte WHUSER setzen!}" # Wenn WHUSER als Umgebungsvariable gesetzt ist, wird dieser verwendet. Sonst Username eintragen.
# Open an SSH connection and execute the command
ssh $username@$servername -t "sudo plesk login"
ssh $username@$fqdn -t "sudo plesk login"
+52
View File
@@ -0,0 +1,52 @@
# spamcheck - schneller Spamcheck für MS365 und Spamhaus
## Funktion
Dieses Skript führt am jeweiligen Plesk-Host ein grep für geläufige MS365-Fehlercodes sowie Spamhaus auf /var/log/maillog durch und gibt die Anzahl der Treffer für dieses an.
## Voraussetzungen
- SSH-Zugriff auf den Zielserver
- Das Skript muss am Zielserver unter `$HOME/bin` oder `$HOME/spamcheck.sh` abgelegt werden.
- Das Skript muss ausführbar sein (`chmod +x spamcheck` oder `chmod +x spamcheck.sh`)
## Installation
tba.
## Verwendung
```bash
spamcheck
```
## Syntax
```bash
spamcheck
```
## Beispiele
```bash
# random Plesk-Server
eign01_easyname.at@ws25 ~ $ spamcheck
=== ws25.inname.net Spamcheck ===
✅ All systems green.
eign01_easyname.at@ws26 ~ $ spamcheck
=== ws26.inname.net Spamcheck ===
❌ Anzahl S3150: 24
```
## Troubleshooting
# zu hohe Anzahl an S3150
Prüfen durch gezieltes grep nach `S3150`, ob es sich hierbei um einen anderen String handelt. -->
```bash
sudo grep -F 'S3150' /var/log/maillog
```
---
*Maintainer: peignerpausz*
+20
View File
@@ -0,0 +1,20 @@
#! /usr/bin/env bash
# Spamcheck für MS365 error-codes und Spamhaus rejections
# Maintainer: peignerpausz
printf '🚀 %s Spamcheck 🛠️ \n' "$(hostname)"
found_errors=0
for a in S3150 S775 S7771 S7772 S7773 S7774 S7775 S7776 S7777 S7778 S7779 Spamhaus
do
count=$(sudo grep -c "\($a\)" /var/log/maillog 2>/dev/null)
count=${count//$'\r'/}
count=${count//[^0-9]/}
count=${count:-0}
if [ "$count" -gt 0 ]; then
printf "❌ Anzahl %s: %s\n" "$a" "$count"
found_errors=1
fi
done
if [ "$found_errors" -eq 0 ]; then
printf "✅ All systems green.\n"
fi
+107
View File
@@ -0,0 +1,107 @@
# wh20 - SSH-Shortcuts für easyname WH20 Webserver
## Funktion
Dieses Skript stellt eine SSH-Verbindung zu einem angegebenen WH20 Webserver her. Optional kann über den Parameter `--tenant` die Domain angepasst werden, um auf Server in verschiedenen Tenant-Umgebungen zuzugreifen.
## Voraussetzungen
- SSH-Zugriff auf den Zielserver
- Der Benutzername muss als Umgebungsvariable `WHUSER` gesetzt sein
- Das Skript muss ausführbar sein (`chmod +x wh20.sh`)
## Installation
1. **WHUSER Variable setzen** (in `~/.bashrc` oder `~/.bash_env`):
```bash
export WHUSER="deinusername"
```
2. **Installation über Installer**:
```bash
# Im Repository-Hauptverzeichnis
./install.sh
```
## Verwendung
### Standard-Verbindung (easyname.systems)
```bash
wh20 web15
```
→ Verbindet zu `web15.wh20.easyname.systems`
### Mit Tenant adino
```bash
wh20 web15 --tenant adino
```
→ Verbindet zu `web15.adino.at`
### Mit Tenant dona
```bash
wh20 web15 --tenant dona
```
→ Verbindet zu `web15.inname.net`
## Syntax
```bash
wh20 <webserver> [--tenant adino|dona]
```
### Parameter
- `<webserver>`: Name des Webservers (z.B. `web15`, `srv272`, `ws12`)
- `--tenant`: Optional. Bestimmt die Domain-Endung:
- `adino` → `<webserver>.adino.at`
- `dona` → `<webserver>.inname.net`
- Ohne Angabe → `<webserver>.wh20.easyname.systems`
## Domain-Mapping
| Tenant | Domain-Pattern |
|--------|----------------|
| (kein) | `<webserver>.wh20.easyname.systems` |
| `adino` | `<webserver>.adino.at` |
| `dona` | `<webserver>.inname.net` |
## Beispiele
```bash
# Standard WH20 Server
wh20 web15
wh20 srv272
# Adino Tenant
wh20 web15 --tenant adino
wh20 ws12 --tenant adino
# Dona Tenant
wh20 web15 --tenant dona
wh20 srv272 --tenant dona
```
## Troubleshooting
### WHUSER nicht gesetzt
```
Fehler: Bitte WHUSER setzen!
```
**Lösung**: `export WHUSER="deinusername"` in ~/.bashrc hinzufügen
### Unbekannter Tenant
```
Unbekannter Tenant: <tenant>
```
**Lösung**: Nur `adino` oder `dona` als Tenant-Wert verwenden
### Webserver-Name fehlt
```
Usage: wh20 <webserver> [--tenant adino|dona]
```
**Lösung**: Webserver-Namen als erstes Argument angeben
---
*Maintainer: ado*
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# wh20 - SSH-Shortcuts für easyname WH20 Webserver
# Maintainer: ado
servername=""
tenant=""
while [[ $# -gt 0 ]]; do
case "$1" in
--tenant)
tenant="$2"
shift 2
;;
*)
servername="$1"
shift
;;
esac
done
if [ -z "$servername" ]; then
echo "Usage: $0 <webserver> [--tenant adino|dona]"
exit 1
fi
# Set domain based on tenant
case "$tenant" in
adino)
fqdn="$servername.adino.at"
;;
dona)
fqdn="$servername.inname.net"
;;
"")
fqdn="$servername.wh20.easyname.systems"
;;
*)
echo "Unbekannter Tenant: $tenant"
exit 1
;;
esac
# Define the username
username="${WHUSER:?Bitte WHUSER setzen!}" # Wenn WHUSER als Umgebungsvariable gesetzt ist, wird dieser verwendet. Sonst Username eintragen.
# Open an SSH connection
exec ssh $username@$fqdn "$@"
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
# Tool zum Schnellen prüfen mehrerer WordPress-Installationen
# Maintainer: peignerpausz
declare -a WORDPRESS=()
WORDPRESS="$(ls | grep wordpress)"
printf "Beginne Prüfung der Adminnutzer\n\n"
for wordpress in wordpress*/; do
[[ -d "$wordpress" ]] || continue
echo "Prüfe $wordpress"
userlist=$(php ~/bin/wp-cli.phar user list --role=administrator --path="$wordpress" 2>/dev/null)
if [[ -n "$userlist" ]]; then
printf "%s\n\n" "$userlist"
else
printf "Fehler bei %s\n\n" "$wordpress"
fi
done
for uneasy in $(find html/. -type f -name "wp-config.php" -exec dirname {} \;); do
[[ -f "$uneasy" ]] || continue
echo "Prüfe $uneasy"
userlist2=$(php ~/bin/wp-cli.phar user list --role=administrator --path="$uneasy")
echo $userlist2
if [[ -n "$userlist2" ]]; then
printf "%s\n\n" "$userlist2"
else
printf "Fehler bei %s\n\n" "$uneasy"
fi
done