Compare commits
92
Commits
9ae5a85e02
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
105395c62d | ||
|
|
e0df6c5405 | ||
|
|
083f42ca51 | ||
|
|
2fca686b56 | ||
|
|
9a4b1ef83d | ||
|
|
c950d17582 | ||
|
|
e87a48cd7a | ||
|
|
cf1852fd0a | ||
|
|
7c192a0e05 | ||
|
|
83c3b620e9 | ||
|
|
6444a814b0 | ||
|
|
56c5255442 | ||
|
|
d248af483d | ||
|
|
495713b5c2 | ||
|
|
28f6958ae3 | ||
|
|
8685420f24 | ||
|
|
fdfe0f3594 | ||
|
|
4863322ee3 | ||
|
|
99a712ffa4 | ||
|
|
e9f493bc63 | ||
|
|
de44af64b4 | ||
|
|
a1046bda79 | ||
|
|
b361f27241 | ||
|
|
55529624c2 | ||
|
|
473cf80c62 | ||
|
|
bbe2db2700 | ||
|
|
a6ff8e5a6f | ||
|
|
5ae6001157 | ||
|
|
fa2bf9d50d | ||
|
|
e283a519b8 | ||
|
|
1bc0c2eb5e | ||
|
|
50e0126dd3 | ||
|
|
60856b0312 | ||
|
|
84e6a6eefe | ||
|
|
aa7cab41d7 | ||
|
|
c299e074b8 | ||
|
|
fc48de8132 | ||
|
|
93089d6eac | ||
|
|
00fac9ff89 | ||
|
|
52dfa9de5f | ||
|
|
75d5680364 | ||
|
|
9810a03376 | ||
|
|
6116e9283e | ||
|
|
10b000feef | ||
|
|
0d56365fcf | ||
|
|
b657d768ee | ||
|
|
c39398637b | ||
|
|
1befa79366 | ||
|
|
6c0a9749d0 | ||
|
|
f1f7babfd7 | ||
|
|
06647a1bf1 | ||
|
|
034018de87 | ||
|
|
012d3158a0 | ||
|
|
55efaf776d | ||
|
|
63121c71f8 | ||
|
|
248b2f9c1a | ||
|
|
fb66a3a014 | ||
|
|
ad6666d901 | ||
|
|
9241cc3d14 | ||
|
|
0774ed0729 | ||
|
|
aa6a470b0d | ||
|
|
7d5d4cb7b1 | ||
|
|
124337e0a4 | ||
|
|
5877e71982 | ||
|
|
72537749c5 | ||
|
|
d1e28599c9 | ||
|
|
a0ca330492 | ||
|
|
aa1fdc4811 | ||
|
|
1e6c621dd9 | ||
|
|
530c4f730b | ||
|
|
bddb3cf1e9 | ||
|
|
84ecfaf278 | ||
|
|
87b5c60437 | ||
|
|
10d3459678 | ||
|
|
a3e68d73cd | ||
|
|
0176624bf3 | ||
|
|
6036648d76 | ||
|
|
5706152a82 | ||
|
|
541d173a18 | ||
|
|
81915ddee9 | ||
|
|
eb50311a24 | ||
|
|
c26aed95d5 | ||
|
|
669325fded | ||
|
|
3d1326daa9 | ||
|
|
3aa8b9e8a4 | ||
|
|
0711d6b1ec | ||
|
|
ad037e105a | ||
|
|
d0634bb442 | ||
|
|
069c8899c8 | ||
|
|
33366feb04 | ||
|
|
a61d317d4c | ||
|
|
9d2cc4dd33 |
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(git add:*)"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
}
|
||||
}
|
||||
+6
-2
@@ -46,8 +46,8 @@
|
||||
**/cache/
|
||||
|
||||
# User-spezifische Dateien
|
||||
userprofiles/*/
|
||||
!userprofiles/pl/
|
||||
bashprofiles/*/
|
||||
!bashprofiles/pl/
|
||||
|
||||
# Checkms Konfigurationen (können sensible Daten enthalten)
|
||||
**/checkms.conf
|
||||
@@ -65,3 +65,7 @@ userprofiles/*/
|
||||
**/*.zip
|
||||
**/*.7z
|
||||
**/archive.*
|
||||
|
||||
# Claude Code spezifische Dateien
|
||||
CLAUDE.md
|
||||
.claude/
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Repository Overview
|
||||
|
||||
Collection of **Bash scripts for easyname Support Team** - small helpers for log analysis, automations, and typical support cases. Repository is **internal** for easyname Support.
|
||||
|
||||
### Architecture
|
||||
|
||||
Scripts are organized by platform:
|
||||
- **`legacy/`** - Scripts for Legacy infrastructure (contains `checkms`, `quicknav`)
|
||||
- **`wh20/`** - Scripts for WH20 infrastructure (currently empty, placeholder for future scripts)
|
||||
- **`connect/`** - Connection utilities (contains `go` SSH shortcut script)
|
||||
- **`userprofiles/`** - User-specific configuration files
|
||||
|
||||
Each script follows a modular structure:
|
||||
```
|
||||
platform/<scriptname>/
|
||||
├── <scriptname>.sh # The actual script
|
||||
└── README.md # Documentation and examples
|
||||
```
|
||||
|
||||
## Development Commands
|
||||
|
||||
### Adding New Scripts
|
||||
|
||||
```bash
|
||||
# 1. Create folder structure (legacy or wh20)
|
||||
mkdir -p legacy/<scriptname>
|
||||
|
||||
# 2. Add script and make executable
|
||||
chmod +x legacy/<scriptname>/<scriptname>.sh
|
||||
|
||||
# 3. Copy and adapt documentation template
|
||||
cp README_template.md legacy/<scriptname>/README.md
|
||||
|
||||
# 4. Update platform README
|
||||
# Edit legacy/README.md or wh20/README.md
|
||||
```
|
||||
|
||||
### Testing Scripts
|
||||
|
||||
```bash
|
||||
# Test checkms (MS error code analysis)
|
||||
./legacy/checkms/checkms.sh --help
|
||||
./legacy/checkms/checkms.sh --show-config
|
||||
./legacy/checkms/checkms.sh 2024-01-15
|
||||
|
||||
# Test go SSH shortcuts
|
||||
./connect/go/go.sh web 42
|
||||
./connect/go/go.sh mx 12
|
||||
```
|
||||
|
||||
### Git Operations
|
||||
|
||||
```bash
|
||||
# Commit changes
|
||||
git add .
|
||||
git commit -m "Add <scriptname> to <legacy|wh20>"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Core Scripts
|
||||
|
||||
### `checkms` - Microsoft SMTP Error Analysis
|
||||
- Analyzes Microsoft-specific SMTP error codes (S3150, S775, S7771*) in Exim logs
|
||||
- Config stored in `~/.config/checkms/checkms.conf`
|
||||
- Can add/remove error codes dynamically
|
||||
- Supports time-based filtering (--minutes, --hours)
|
||||
|
||||
### `go` - SSH Connection Shortcuts
|
||||
- Requires `LUSER` environment variable set
|
||||
- Commands: `go web <NR>`, `go mx <NR>`, `go logger`, `go support`, `go kinit`
|
||||
- Supports remote command execution with `--` separator
|
||||
- Special handling for `easyuser` connections on web servers
|
||||
|
||||
### `quicknav` - Legacy Navigation Function
|
||||
- Simple bash function for quick SSH connections
|
||||
- Must be sourced in `.bashrc`/`.zshrc`
|
||||
- Requires manual configuration of `LUSER` variable
|
||||
|
||||
## Environment Requirements
|
||||
|
||||
- **LUSER**: Required environment variable for authentication (format: `username`)
|
||||
- **SSH Access**: Must have Kerberos authentication set up (`kinit`)
|
||||
- **Target Hosts**:
|
||||
- `web*.in.easyname.com`
|
||||
- `mx*.in.easyname.com`
|
||||
- `logger.in.nessus.at`
|
||||
- `support.in.easyname.com`
|
||||
|
||||
## Configuration Files
|
||||
|
||||
- `checkms` uses JSON config at `~/.config/checkms/checkms.conf`
|
||||
- User profiles stored in `userprofiles/` directory
|
||||
- `.bashrc` example available with history settings and prompt configuration
|
||||
@@ -3,66 +3,158 @@
|
||||
Sammel-Repository für Bash-Skripte des **easyname Support-Teams**.
|
||||
Hier sammeln wir kleine Helfer für Log-Analysen, Automatisierungen und typische Support-Fälle.
|
||||
|
||||
---
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
- [Quick Start](#quick-start)
|
||||
- [Übersicht](#übersicht)
|
||||
- [Connect Tools](#connect-tools)
|
||||
- [Bash-Profile](#bash-profile)
|
||||
- [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)
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Übersicht
|
||||
|
||||
Die Skripte sind nach Kategorie getrennt:
|
||||
|
||||
- [**Connect**](./connect/README.md) – SSH-Verbindungstools und Shortcuts
|
||||
- [**Legacy**](./legacy/README.md) – Snippets für Legacy-Umgebungen
|
||||
- [**Bashprofiles**](./bashprofiles/README.md) – Optimierte Bash-Konfigurationen
|
||||
- [**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
|
||||
|
||||
---
|
||||
|
||||
## Connect Tools
|
||||
## Bash-Profile
|
||||
|
||||
Verbindungstools für schnellen Zugriff auf easyname-Server:
|
||||
Optimierte Bash-Konfigurationen für verschiedene Support-Umgebungen:
|
||||
|
||||
- [`go`](./connect/go)
|
||||
→ [Dokumentation & Beispiele](./connect/go/README.md)
|
||||
SSH-Shortcuts mit Kerberos-Auth für Web-, MX-, Logger- und Support-Server
|
||||
- [`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
|
||||
|
||||
Aktuell enthalten:
|
||||
|
||||
- [`checkms`](./legacy/checkms)
|
||||
→ [Dokumentation & Beispiele](./legacy/checkms/README.md)
|
||||
- [`quicknav`](./legacy/quicknav)
|
||||
→ [Dokumentation & Beispiele](./legacy/quicknav/README.md)
|
||||
Analyse von Microsoft-spezifischen SMTP Fehlercodes (S3150, S775, S7771…) in den Exim-Logs.
|
||||
|
||||
Weitere Snippets für Legacy kommen hier dazu.
|
||||
- [`go`](./legacy/go)
|
||||
SSH-Shortcuts mit Kerberos-Auth für Web-, MX-, Logger- und Support-Server
|
||||
|
||||
---
|
||||
- [`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
|
||||
|
||||
*(noch leer, Platzhalter für künftige 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
|
||||
|
||||
Nach dem Klonen des Repositories steht ein interaktives Installationsscript zur Verfügung:
|
||||
|
||||
```bash
|
||||
# Repository klonen
|
||||
git clone http://vps.dominikus.one:3000/ljp/esn-support-bash-snippets.git
|
||||
|
||||
# WICHTIG: Repository umbenennen (empfohlen)
|
||||
mv esn-support-bash-snippets esn-support-tools
|
||||
cd esn-support-tools
|
||||
|
||||
# Installation testen (empfohlen)
|
||||
./install.sh --dry-run
|
||||
|
||||
# Installationsscript ausführen
|
||||
./install.sh
|
||||
|
||||
# Hilfe anzeigen
|
||||
./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
|
||||
- **Automatische Backups**: Vorhandene Dateien werden gesichert
|
||||
- **Symlink-Management**: Tools werden in ~/bin verlinkt
|
||||
- **LUSER-Setup**: Automatische Konfiguration für go-Tool
|
||||
- **Modular erweiterbar**: Neue Tools einfach hinzufügbar
|
||||
|
||||
**Verfügbare Kategorien:**
|
||||
- **Bash-Profile**: .bashrc Optimierungen und modulare Konfiguration
|
||||
- **Legacy Tools**: checkms, go, pincMails, exitrace für Legacy-Infrastruktur
|
||||
- **WH20 Tools**: plesk für WH20-Infrastruktur
|
||||
|
||||
|
||||
|
||||
## How-To: Neues Skript anlegen
|
||||
|
||||
Um ein neues Bash-Skript in dieses Repository aufzunehmen, bitte folgende Schritte:
|
||||
|
||||
1. **Ordnerstruktur anlegen**
|
||||
Je nach Kategorie (`connect`, `legacy` oder `wh20`) einen Unterordner erstellen:
|
||||
Je nach Kategorie (`bashprofiles`, `domaintools`, `legacy` oder `wh20`) einen Unterordner erstellen:
|
||||
```
|
||||
connect/<scriptname>/
|
||||
bashprofiles/<username>/
|
||||
domaintools/<scriptname>/
|
||||
legacy/<scriptname>/
|
||||
wh20/<scriptname>/
|
||||
```
|
||||
@@ -70,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
|
||||
@@ -78,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**
|
||||
@@ -87,28 +183,36 @@ 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:
|
||||
```
|
||||
legacy/<scriptname>/README.md
|
||||
domaintools/<scriptname>/README.md
|
||||
```
|
||||
oder
|
||||
```
|
||||
legacy/<scriptname>/README.md
|
||||
```
|
||||
oder
|
||||
```
|
||||
wh20/<scriptname>/README.md
|
||||
```
|
||||
|
||||
4. **Übersicht aktualisieren**
|
||||
Das Skript in die Übersicht der passenden Kategorie-README eintragen:
|
||||
- [`connect/README.md`](./connect/README.md)
|
||||
- [`bashprofiles/README.md`](./bashprofiles/README.md)
|
||||
- [`domaintools/README.md`](./domaintools/README.md)
|
||||
- [`legacy/README.md`](./legacy/README.md)
|
||||
- [`wh20/README.md`](./wh20/README.md)
|
||||
|
||||
5. **Commit & Push**
|
||||
5. **Install-Script erweitern**
|
||||
Neue Tools zum `install.sh` hinzufügen für automatische Installation
|
||||
|
||||
6. **Commit & Push**
|
||||
Änderungen ins Repo übernehmen:
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Add <scriptname> to <legacy|wh20>"
|
||||
git commit -m "Add <scriptname> to <category>"
|
||||
git push
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Lizenz / Sichtbarkeit
|
||||
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
# Bash-Profile
|
||||
|
||||
Sammlung von optimierten Bash-Konfigurationen für verschiedene easyname Support-Umgebungen.
|
||||
|
||||
---
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
- [Übersicht](#übersicht)
|
||||
- [Enthaltene Profile](#enthaltene-profile)
|
||||
- [Installation](#installation)
|
||||
- [Anpassungen](#anpassungen)
|
||||
- [Lizenz / Sichtbarkeit](#lizenz--sichtbarkeit)
|
||||
|
||||
---
|
||||
|
||||
## Übersicht
|
||||
|
||||
Die Bash-Profile enthalten optimierte Konfigurationen für verschiedene Arbeitsumgebungen im easyname Support. Jedes Profil ist auf spezielle Anforderungen zugeschnitten und kann als Basis für eigene Anpassungen verwendet werden.
|
||||
|
||||
**Features:**
|
||||
- Erweiterte History-Konfiguration mit Timestamps
|
||||
- Optimierte Prompts mit Farben und Kontextinformationen
|
||||
- Modulare Struktur durch ausgelagerte Dateien
|
||||
- Bash-Completion und dircolors Support
|
||||
|
||||
---
|
||||
|
||||
## Enthaltene Profile
|
||||
|
||||
### [`pl`](./pl)
|
||||
Das persönliche Bash-Profil von h0tznpl0tz mit sauberer, optimierter .bashrc-Konfiguration.
|
||||
|
||||
**Highlights:**
|
||||
- **History**: Unbegrenzte History mit Timestamps und Duplikat-Vermeidung
|
||||
- **Prompt**: Farbiger Prompt mit User@Host und Pfad-Anzeige
|
||||
- **Modularität**: Ausgelagerte Konfiguration in separate Dateien:
|
||||
- `~/.bash_aliases` - Aliase und Shortcuts
|
||||
- `~/.bash_env` - Umgebungsvariablen (inkl. LUSER für go-Tool)
|
||||
- `~/.bash_paths` - PATH-Erweiterungen
|
||||
- **Kompatibilität**: Funktioniert mit allen Standard-Bash-Umgebungen
|
||||
- **Performance**: Effiziente Konfiguration ohne Overhead
|
||||
|
||||
*Dieses Profil dient als Referenz-Implementierung und kann als Basis für eigene Profile verwendet werden.*
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
### h0tznpl0tz Profil übernehmen
|
||||
```bash
|
||||
# Backup der aktuellen .bashrc
|
||||
cp ~/.bashrc ~/.bashrc.backup
|
||||
|
||||
# Profil von h0tznpl0tz kopieren
|
||||
cp bashprofiles/pl/.bashrc ~/.bashrc
|
||||
|
||||
# Reload der Bash-Konfiguration
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
### Einzelne Teile übernehmen
|
||||
```bash
|
||||
# Nur History-Optimierungen
|
||||
grep -A 10 "##### History #####" bashprofiles/pl/.bashrc >> ~/.bashrc
|
||||
|
||||
# Nur Prompt-Konfiguration
|
||||
grep -A 15 "##### Prompt #####" bashprofiles/pl/.bashrc >> ~/.bashrc
|
||||
```
|
||||
|
||||
### Modulare Dateien erstellen
|
||||
```bash
|
||||
# Erstelle ausgelagerte Konfigurationsdateien
|
||||
touch ~/.bash_aliases
|
||||
touch ~/.bash_env
|
||||
touch ~/.bash_paths
|
||||
|
||||
# Beispiel für ~/.bash_env (LUSER für go-Tool)
|
||||
echo 'export LUSER="deinusername"' >> ~/.bash_env
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Anpassungen
|
||||
|
||||
### Eigenes Profil erstellen
|
||||
1. **Ordner erstellen**:
|
||||
```bash
|
||||
mkdir bashprofiles/<username>
|
||||
```
|
||||
|
||||
2. **Profile anpassen**:
|
||||
```bash
|
||||
cp bashprofiles/pl/.bashrc bashprofiles/<username>/.bashrc
|
||||
# Anpassungen vornehmen
|
||||
```
|
||||
|
||||
3. **Dokumentation**:
|
||||
```bash
|
||||
cp bashprofiles/pl/README.md bashprofiles/<username>/README.md
|
||||
# README anpassen
|
||||
```
|
||||
|
||||
### Häufige Anpassungen
|
||||
- **LUSER Variable**: In `~/.bash_env` für go-Tool setzen
|
||||
- **Aliases**: Häufig verwendete Befehle in `~/.bash_aliases`
|
||||
- **Prompt**: Farben oder Format in PS1 anpassen
|
||||
- **History**: HISTSIZE nach Bedarf erhöhen/verringern
|
||||
|
||||
---
|
||||
|
||||
## Lizenz / Sichtbarkeit
|
||||
|
||||
> Dieses Repository ist **intern** für easyname Support.
|
||||
> Falls eine Freigabe nach extern geplant ist, bitte vorab mit Teamleitung abklären.
|
||||
|
||||
---
|
||||
|
||||
*Diese Profile wurden mit Hilfe von Claude Code erstellt.*
|
||||
@@ -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'
|
||||
@@ -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'
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -1,93 +0,0 @@
|
||||
# Connect Tools
|
||||
|
||||
SSH-Verbindungstools und Shortcuts für den schnellen Zugriff auf easyname-Infrastruktur.
|
||||
|
||||
---
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
- [Übersicht](#übersicht)
|
||||
- [Enthaltene Tools](#enthaltene-tools)
|
||||
- [Voraussetzungen](#voraussetzungen)
|
||||
- [Lizenz / Sichtbarkeit](#lizenz--sichtbarkeit)
|
||||
|
||||
---
|
||||
|
||||
## Ü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.
|
||||
|
||||
---
|
||||
|
||||
## Enthaltene Tools
|
||||
|
||||
### [`go`](./go)
|
||||
SSH-Shortcut-Tool für schnelle Verbindungen zu easyname-Servern.
|
||||
|
||||
- [Dokumentation & Beispiele](./go/README.md)
|
||||
|
||||
**Features:**
|
||||
- Kerberos-Authentifizierung (`go kinit`)
|
||||
- Web-Server Zugriff mit optionalem easyuser-Wechsel (`go web 42 e110604`)
|
||||
- Mail-Server Zugriff (`go mx 12`)
|
||||
- Logger-Server Zugriff (`go logger`)
|
||||
- Support-Server Zugriff (`go support`)
|
||||
- Remote-Command Ausführung mit `--` Separator
|
||||
- Unterstützung für Here-Documents und Piping
|
||||
|
||||
**Quick Examples:**
|
||||
```bash
|
||||
# Kerberos-Auth
|
||||
go kinit
|
||||
|
||||
# Web-Server mit easyuser
|
||||
go web 42 e110604
|
||||
|
||||
# Remote-Command auf MX-Server
|
||||
go mx 12 -- mailq | head -5
|
||||
|
||||
# Logs auf Logger durchsuchen
|
||||
go logger -- grep "error" /var/log/syslog
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
### Generelle Anforderungen
|
||||
- **Kerberos-Setup**: Funktionierende Kerberos-Konfiguration
|
||||
- **SSH-Zugriff**: Berechtigungen für easyname-Infrastruktur
|
||||
- **LUSER Variable**: Muss in Environment gesetzt sein
|
||||
|
||||
### Setup-Anleitung
|
||||
1. LUSER in `~/.bashrc` oder `~/.bash_env` setzen:
|
||||
```bash
|
||||
export LUSER="deinusername"
|
||||
```
|
||||
|
||||
2. Kerberos-Ticket erstellen:
|
||||
```bash
|
||||
kinit deinusername@NESSUS.AT
|
||||
# oder mit go-Tool:
|
||||
go kinit
|
||||
```
|
||||
|
||||
3. Tool in PATH hinzufügen oder Alias erstellen:
|
||||
```bash
|
||||
# Option 1: Alias
|
||||
alias go="/pfad/zu/connect/go/go.sh"
|
||||
|
||||
# Option 2: Symlink
|
||||
ln -s /pfad/zu/connect/go/go.sh ~/bin/go
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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 Claude Code erstellt.*
|
||||
@@ -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
|
||||
@@ -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.*
|
||||
@@ -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
|
||||
@@ -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
|
||||
Executable
+43
@@ -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'
|
||||
@@ -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
|
||||
@@ -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
|
||||
Executable
+518
@@ -0,0 +1,518 @@
|
||||
#!/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
|
||||
|
||||
# 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"
|
||||
}
|
||||
|
||||
# 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"
|
||||
if [[ -f "$file" ]]; then
|
||||
local backup="${file}.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde Backup erstellen: $backup"
|
||||
else
|
||||
cp "$file" "$backup"
|
||||
log_info "Backup erstellt: $backup"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
create_symlink() {
|
||||
local src="$1"
|
||||
local dest="$2"
|
||||
local name="$3"
|
||||
|
||||
if [[ -L "$dest" ]]; then
|
||||
log_warning "$name bereits als Symlink vorhanden, überspringe"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "$dest" ]]; then
|
||||
backup_file "$dest"
|
||||
fi
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde Symlink erstellen: $dest -> $src"
|
||||
else
|
||||
ln -sf "$src" "$dest"
|
||||
log_success "$name symlink erstellt: $dest -> $src"
|
||||
fi
|
||||
}
|
||||
|
||||
make_executable() {
|
||||
local file="$1"
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde ausführbar machen: $file"
|
||||
else
|
||||
chmod +x "$file"
|
||||
log_info "$file ausführbar gemacht"
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation: Bash-Profile
|
||||
install_bashprofiles() {
|
||||
log_info "=== Bash-Profile Installation ==="
|
||||
|
||||
echo -e "\n${PURPLE}Verfügbare Profile:${NC}"
|
||||
echo "1) h0tznpl0tz (pl) - Optimiertes Basis-Profil"
|
||||
echo "0) Überspringen"
|
||||
|
||||
read -p "Profil auswählen [0-1]: " profile_choice
|
||||
|
||||
case "$profile_choice" in
|
||||
1)
|
||||
log_info "Installiere h0tznpl0tz Bash-Profil..."
|
||||
backup_file "$HOME/.bashrc"
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_dry_run "Würde kopieren: $SCRIPT_DIR/bashprofiles/pl/.bashrc -> $HOME/.bashrc"
|
||||
log_dry_run "Würde erstellen: ~/.bash_aliases (falls nicht vorhanden)"
|
||||
log_dry_run "Würde erstellen: ~/.bash_env (falls nicht vorhanden)"
|
||||
log_dry_run "Würde erstellen: ~/.bash_paths (falls nicht vorhanden)"
|
||||
else
|
||||
cp "$SCRIPT_DIR/bashprofiles/pl/.bashrc" "$HOME/.bashrc"
|
||||
|
||||
# Modulare Dateien erstellen falls nicht vorhanden
|
||||
[[ ! -f "$HOME/.bash_aliases" ]] && touch "$HOME/.bash_aliases"
|
||||
[[ ! -f "$HOME/.bash_env" ]] && touch "$HOME/.bash_env"
|
||||
[[ ! -f "$HOME/.bash_paths" ]] && touch "$HOME/.bash_paths"
|
||||
|
||||
log_success "Bash-Profil installiert"
|
||||
fi
|
||||
log_info "Hinweis: Setze LUSER in ~/.bash_env für go-Tool"
|
||||
;;
|
||||
0)
|
||||
log_info "Bash-Profile übersprungen"
|
||||
;;
|
||||
*)
|
||||
log_error "Ungültige Auswahl"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Generische Script-Installation
|
||||
install_script() {
|
||||
local category="$1"
|
||||
local script_name="$2"
|
||||
local script_path="$3"
|
||||
|
||||
log_info "Installiere $script_name..."
|
||||
|
||||
# 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
|
||||
log_dry_run "Würde nach LUSER fragen und in ~/.bash_env schreiben"
|
||||
log_dry_run "Beispiel: export LUSER=\"username\" >> ~/.bash_env"
|
||||
else
|
||||
read -p "LUSER eingeben (für Kerberos): " user_input
|
||||
if [[ -n "$user_input" ]]; then
|
||||
echo "export LUSER=\"$user_input\"" >> "$HOME/.bash_env"
|
||||
export LUSER="$user_input"
|
||||
log_success "LUSER in ~/.bash_env gesetzt"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
log_info "LUSER bereits gesetzt: $LUSER"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Script ausführbar machen
|
||||
make_executable "$script_path"
|
||||
|
||||
# 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"
|
||||
else
|
||||
log_info "~/bin existiert nicht. Erstelle Verzeichnis..."
|
||||
mkdir -p "$HOME/bin"
|
||||
log_info "Füge ~/bin zu PATH hinzu (in ~/.bash_paths)"
|
||||
echo 'export PATH="$HOME/bin:$PATH"' >> "$HOME/.bash_paths"
|
||||
fi
|
||||
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
|
||||
|
||||
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"
|
||||
fi
|
||||
}
|
||||
|
||||
# Installation: Legacy Tools
|
||||
install_legacy() {
|
||||
log_info "=== Legacy Tools Installation ==="
|
||||
|
||||
# Auto-discover verfügbare Scripts
|
||||
local discovery_result
|
||||
discovery_result=$(discover_scripts "legacy")
|
||||
|
||||
local script_count
|
||||
script_count=$(echo "$discovery_result" | cut -d':' -f1)
|
||||
|
||||
if [[ "$script_count" -eq 0 ]]; then
|
||||
log_info "Keine Legacy Tools gefunden"
|
||||
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 "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"
|
||||
fi
|
||||
}
|
||||
|
||||
# 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
|
||||
show_help() {
|
||||
cat <<HELP
|
||||
Usage: $0 [OPTIONS]
|
||||
|
||||
Interaktiver Installer für easyname Support Bash-Snippets
|
||||
|
||||
Optionen:
|
||||
--dry-run, -n Zeigt nur was gemacht würde, ohne Dateien zu verändern
|
||||
--help, -h Zeigt diese Hilfe an
|
||||
|
||||
Beispiele:
|
||||
$0 Startet den interaktiven Installer
|
||||
$0 --dry-run Testet den Installer ohne Veränderungen
|
||||
HELP
|
||||
}
|
||||
|
||||
# Hauptmenü
|
||||
show_menu() {
|
||||
echo -e "\n${GREEN}=== easyname Support Bash-Snippets Installer ===${NC}"
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
echo -e "${YELLOW}(DRY-RUN MODUS)${NC}"
|
||||
fi
|
||||
echo -e "${BLUE}Verfügbare Installationskategorien:${NC}\n"
|
||||
echo "1) Bash-Profile - Optimierte .bashrc Konfigurationen"
|
||||
echo "2) Connect Tools - SSH-Shortcuts und Verbindungstools"
|
||||
echo "3) Legacy Tools - Tools für Legacy-Infrastruktur"
|
||||
echo "4) WH20 Tools - Tools für WH20-Infrastruktur"
|
||||
echo "5) Alles installieren"
|
||||
echo "0) Beenden"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Hauptinstallation
|
||||
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 Dateien werden verändert!"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
log_info "Installation gestartet in: $SCRIPT_DIR"
|
||||
|
||||
# Prüfe Abhängigkeiten
|
||||
if ! command -v git >/dev/null 2>&1; then
|
||||
log_error "git ist erforderlich aber nicht installiert"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while true; do
|
||||
show_menu
|
||||
read -p "Auswahl treffen [0-5]: " choice
|
||||
|
||||
case "$choice" in
|
||||
1) install_bashprofiles ;;
|
||||
2) install_connect ;;
|
||||
3) install_legacy ;;
|
||||
4) install_wh20 ;;
|
||||
5)
|
||||
install_bashprofiles
|
||||
install_connect
|
||||
install_legacy
|
||||
install_wh20
|
||||
;;
|
||||
0)
|
||||
log_success "Installation beendet"
|
||||
echo -e "\n${YELLOW}Hinweis: Starte eine neue Shell oder führe 'source ~/.bashrc' aus${NC}"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log_error "Ungültige Auswahl"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo -e "\n${BLUE}Drücke Enter für Hauptmenü...${NC}"
|
||||
read -r
|
||||
done
|
||||
}
|
||||
|
||||
# Script starten
|
||||
main "$@"
|
||||
+70
-7
@@ -1,21 +1,84 @@
|
||||
# Legacy Bash-Snippets
|
||||
# Legacy Tools
|
||||
|
||||
Skripte für die Arbeit auf **easyname Legacy-Infrastruktur**.
|
||||
Sammlung von Bash-Skripten für die Legacy-Infrastruktur von easyname. Enthält Tools für Log-Analyse, SSH-Verbindungen und Support-Automatisierung.
|
||||
|
||||
---
|
||||
|
||||
## Enthaltene Skripte
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
- [Übersicht](#übersicht)
|
||||
- [Enthaltene Tools](#enthaltene-tools)
|
||||
- [Voraussetzungen](#voraussetzungen)
|
||||
- [Lizenz / Sichtbarkeit](#lizenz--sichtbarkeit)
|
||||
|
||||
---
|
||||
|
||||
## Übersicht
|
||||
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
## Enthaltene Tools
|
||||
|
||||
### [`checkms`](./checkms)
|
||||
Analyse von Microsoft-spezifischen SMTP Fehlercodes (S3150, S775, S7771…) in den Exim-Logs.
|
||||
|
||||
- [Dokumentation & Beispiele](./checkms/README.md)
|
||||
|
||||
### [`quicknav`](./quicknav)
|
||||
Snippet für die .bashrc/.zshrc um Schnell zu den gängisten Systemen zu navigieren
|
||||
### [`go`](./go)
|
||||
SSH-Shortcut-Tool für schnelle Verbindungen zu easyname-Servern.
|
||||
|
||||
- [Dokumentation & Beispiele](./quicknav/README.md)
|
||||
- [Dokumentation & Beispiele](./go/README.md)
|
||||
|
||||
### [`pincMails`](./pincMails)
|
||||
Sucht nach versendeten PINC Mails einer bestimmten Kundennummer und kopiert diese in einen lokalen Unterordner
|
||||
|
||||
- [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)
|
||||
|
||||
---
|
||||
|
||||
Weitere Snippets für Legacy kommen hier dazu.
|
||||
## Voraussetzungen
|
||||
|
||||
### Generelle Anforderungen
|
||||
- **Kerberos-Setup**: Funktionierende Kerberos-Konfiguration
|
||||
- **SSH-Zugriff**: Berechtigungen für easyname-Infrastruktur
|
||||
- **LUSER Variable**: Muss in Environment gesetzt sein
|
||||
|
||||
### Setup-Anleitung
|
||||
1. LUSER in `~/.bashrc` oder `~/.bash_env` setzen:
|
||||
```bash
|
||||
export LUSER="deinusername"
|
||||
```
|
||||
|
||||
2. Kerberos-Ticket erstellen:
|
||||
```bash
|
||||
kinit deinusername@NESSUS.AT
|
||||
# oder mit go-Tool:
|
||||
go kinit
|
||||
```
|
||||
|
||||
3. Tool in PATH hinzufügen oder Alias erstellen:
|
||||
```bash
|
||||
# Option 1: Alias
|
||||
alias go="/pfad/zu/legacy/go/go.sh"
|
||||
|
||||
# Option 2: Symlink
|
||||
ln -s /pfad/zu/legacy/go/go.sh ~/bin/go
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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 Claude Code erstellt.*
|
||||
+13
-14
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
Executable
+567
@@ -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
|
||||
@@ -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")
|
||||
@@ -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"
|
||||
@@ -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
@@ -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
|
||||
;;
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
# mail.sh – Remote Datei-Downloader für E-Mail-Dateien
|
||||
|
||||
**Wichtig:**
|
||||
Bevor du das Skript verwendest, führe folgende Schritte aus:
|
||||
|
||||
1. **Mach das Skript ausführbar:**
|
||||
```bash
|
||||
chmod +x mail.sh
|
||||
```
|
||||
|
||||
2. **(Optional, wenn LUSER nicht gesetzt ist) Passe den Benutzernamen an:**
|
||||
Ersetze im Skript die Stelle
|
||||
```
|
||||
LUSER="${LUSER:?Bitte LUSER setzen!}"
|
||||
```
|
||||
durch deinen tatsächlichen Benutzernamen für den Server `appdb02.in.easyname.com`.
|
||||
|
||||
---
|
||||
|
||||
## Beschreibung
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
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
|
||||
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 `.eml`-Dateien, die mit `123` beginnen, und lädt sie in ein lokales Verzeichnis `./123/` herunter.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- SSH-Zugriff auf den Server `appdb02.in.easyname.com`
|
||||
- Der angegebene Benutzername muss gültig sein und die nötigen Berechtigungen besitzen
|
||||
- `scp` und `ssh` müssen auf deinem System installiert sein
|
||||
|
||||
## Ablauf
|
||||
|
||||
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
|
||||
|
||||
- Falls keine passenden Dateien gefunden werden, gibt das Skript eine entsprechende Meldung aus.
|
||||
- Bei Fehlern während des Downloads oder beim Erstellen des lokalen Verzeichnisses wird eine Fehlermeldung angezeigt.
|
||||
|
||||
---
|
||||
|
||||
**Hinweis:**
|
||||
Das Skript ist für den Einsatz in einer Linux-Umgebung vorgesehen.
|
||||
Executable
+98
@@ -0,0 +1,98 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 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
|
||||
|
||||
# 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/${remoteDir}*/*/'")
|
||||
|
||||
# Wenn keine Verzeichnisse gefunden wurden, Skript beenden
|
||||
if [ -z "$remoteDirectories" ]; then
|
||||
echo "Keine Subdirectories in /Apps/easyname/run/${remoteDir}/ gefunden."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
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=""
|
||||
for dir in $remoteDirectories; do
|
||||
# Suche in jedem Verzeichnis nach Dateien mit dem angegebenen Muster
|
||||
filesInDir=$(ssh "$LUSER@$server" "bash -c 'find $dir -type f -name \"$filePattern\"'")
|
||||
fileList="$fileList $filesInDir"
|
||||
done
|
||||
|
||||
# Prüfen, ob der Befehl erfolgreich ausgeführt wurde
|
||||
if [ -z "$fileList" ]; then
|
||||
echo "Fehler beim Ausführen des SSH-Befehls auf dem Remote-Server $server oder keine Dateien gefunden."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Überprüfen, ob Dateien gefunden wurden
|
||||
if [ -z "$fileList" ]; then
|
||||
echo "Keine Dateien gefunden, die mit dem Muster $filePattern beginnen."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Prüfen, ob das lokale Speicherverzeichnis existiert, und falls nicht, erstellen
|
||||
if [ ! -d "$localSavePath" ]; then
|
||||
echo "Das Verzeichnis $localSavePath existiert nicht. Erstelle es..."
|
||||
mkdir -p "$localSavePath"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Fehler beim Erstellen des Verzeichnisses $localSavePath."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Herunterladen der Dateien vom Remote-Server (mit Nummernpräfix gegen Überschreiben gleicher Namen aus verschiedenen Unterordnern)
|
||||
counter=1
|
||||
for file in $fileList; do
|
||||
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 als ${counter}_${basename}."
|
||||
fi
|
||||
((counter++))
|
||||
done
|
||||
|
||||
echo "Alle Dateien wurden im Verzeichnis $localSavePath gespeichert."
|
||||
@@ -1,36 +0,0 @@
|
||||
|
||||
# Anleitung: quicknav.sh in `.bashrc` einfügen
|
||||
|
||||
Um den Inhalt der Datei **quicknav.sh** an das Ende der Datei **.bashrc** anzuhängen, kannst du die folgenden Schritte in der Linux Kommandozeile ausführen:
|
||||
|
||||
## Vorgehen
|
||||
|
||||
1. Wechsle in das Verzeichnis, in dem sich die Datei `quicknav.sh` befindet.
|
||||
```bash
|
||||
cd /pfad/zum/verzeichnis
|
||||
```
|
||||
|
||||
2. Öffne die Datei quicknav.sh und ändere "\<deinusername\>" auf deinen Usernamen
|
||||
```bash
|
||||
nano quicknav.sh
|
||||
```
|
||||
Speichere deine Eingaben mit STRG+O, Beende Nano mit STRG+X
|
||||
|
||||
3. Füge den Inhalt der Datei `quicknav.sh` an das Ende deiner `.bashrc` an.
|
||||
```bash
|
||||
cat quicknav.sh >> ~/.bashrc
|
||||
```
|
||||
|
||||
4. Lade die geänderte `.bashrc` neu, damit die Änderungen sofort wirksam werden.
|
||||
```bash
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Achte darauf, dass du dich im richtigen Verzeichnis befindest, bevor du den Befehl ausführst.
|
||||
- Mit `>>` wird der Inhalt **angehängt**, ohne die vorhandene `.bashrc` zu überschreiben.
|
||||
- Solltest du die `.bashrc` manuell anpassen wollen, kannst du sie mit einem Editor öffnen:
|
||||
```bash
|
||||
nano ~/.bashrc
|
||||
```
|
||||
@@ -1,13 +0,0 @@
|
||||
function go () {
|
||||
LUSER=<deinuser@NESSUS.AT>
|
||||
case ${1:0:1} in
|
||||
k) kinit $LUSER@NESSUS.AT ;;
|
||||
w) ssh $LUSER@web$2.in.easyname.com ;;
|
||||
m) ssh $LUSER@mx$2.in.easyname.com ;;
|
||||
l) ssh $LUSER@logger.in.nessus.at ;;
|
||||
s) ssh $LUSER@support.in.easyname.com ;;
|
||||
*)
|
||||
echo "go kinit or go log"
|
||||
echo "go web NR or go mx NR" ;;
|
||||
esac
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 "$@"
|
||||
+17
-12
@@ -2,7 +2,6 @@
|
||||
|
||||
Skripte für die Arbeit auf **WH20-Infrastruktur**.
|
||||
|
||||
---
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
@@ -10,28 +9,34 @@ Skripte für die Arbeit auf **WH20-Infrastruktur**.
|
||||
- [Enthaltene Skripte](#enthaltene-skripte)
|
||||
- [Lizenz / Sichtbarkeit](#lizenz--sichtbarkeit)
|
||||
|
||||
---
|
||||
|
||||
## Übersicht
|
||||
|
||||
Hier sammeln wir Snippets für typische Support-Fälle und Automatisierungen im **WH20-Umfeld**.
|
||||
Die Dokumentationen werden in Unterordnern zu den jeweiligen Skripten gepflegt.
|
||||
|
||||
---
|
||||
|
||||
## Enthaltene Skripte
|
||||
|
||||
Aktuell noch keine Skripte eingetragen.
|
||||
Neue Snippets bitte als Unterordner mit eigener `README.md` anlegen, Beispiel:
|
||||
### [`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/
|
||||
└── <scriptname>/
|
||||
├── <scriptname> # das eigentliche Skript
|
||||
└── README.md # Dokumentation und Beispiele
|
||||
```
|
||||
### [`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
|
||||
|
||||
|
||||
@@ -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*
|
||||
@@ -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
|
||||
@@ -0,0 +1,144 @@
|
||||
# damagereport - 📬 your daily dose of mail-damage
|
||||
|
||||
Kurzbeschreibung des Skripts:
|
||||

|
||||
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
|
||||
@@ -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
|
||||
@@ -0,0 +1,47 @@
|
||||
# Serverliste
|
||||
|
||||
# Legacy-Server
|
||||

|
||||
|
||||
- web01.in.easyname.com..web26.in.easyname.com
|
||||
- web107
|
||||
- web114
|
||||
- web119
|
||||
- web501.in.easyname.com..web532.in.easyname.com
|
||||
|
||||
# WH20-Server
|
||||

|
||||
|
||||
- web1.wh20.easyname.systems .. web25.wh20.easyname.systems
|
||||
|
||||
## inname
|
||||

|
||||
- 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
|
||||

|
||||
- 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
|
||||
@@ -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*
|
||||
@@ -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
|
||||
@@ -0,0 +1,55 @@
|
||||
# plesk.sh – Link für Plesk Admin Panel
|
||||
|
||||
## 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. Optional kann über den Parameter `--tenant` die Domain angepasst werden.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- SSH-Zugriff auf den Zielserver (z.B. `web15.wh20.easyname.systems`)
|
||||
- Der Benutzername muss entweder als Umgebungsvariable `WHUSER` gesetzt sein oder direkt im Skript eingetragen werden.
|
||||
- Das Skript muss ausführbar sein (`chmod +x plesk.sh`).
|
||||
|
||||
## Nutzung
|
||||
|
||||
1. **Skript ausführbar machen:**
|
||||
```bash
|
||||
chmod +x plesk.sh
|
||||
```
|
||||
|
||||
2. **Benutzername festlegen:**
|
||||
- Entweder die Umgebungsvariable `WHUSER` setzen:
|
||||
```bash
|
||||
export WHUSER=<deinBenutzername>
|
||||
```
|
||||
- Oder den Benutzernamen direkt im Skript in der Zeile
|
||||
```bash
|
||||
username="${WHUSER:?Bitte WHUSER setzen!}"
|
||||
```
|
||||
durch deinen tatsächlichen Benutzernamen ersetzen, z.B.:
|
||||
```bash
|
||||
username="maxmustermann"
|
||||
```
|
||||
|
||||
3. **Skript ausführen:**
|
||||
```bash
|
||||
./plesk.sh <webserver> [--tenant adino|dona]
|
||||
```
|
||||
Beispiele:
|
||||
```bash
|
||||
./plesk.sh web15
|
||||
./plesk.sh srv272 --tenant adino
|
||||
./plesk.sh ws12 --tenant dona
|
||||
```
|
||||
- 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 kannst.
|
||||
@@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
# 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@$fqdn -t "sudo plesk login"
|
||||
@@ -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*
|
||||
@@ -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
|
||||
@@ -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*
|
||||
|
||||
Executable
+47
@@ -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 "$@"
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user