From 1b171e16e362fdfca08a6500dda4d8b038f22ff8 Mon Sep 17 00:00:00 2001 From: scriptos Date: Wed, 18 Feb 2026 14:19:12 +0100 Subject: [PATCH] v1.2.0 --- .gitattributes | 1 + README.md | 151 +++++++++++++++++++------------------- dockernet-inspector.v1.sh | 136 ++++++++++++++++++++++++++++++---- 3 files changed, 198 insertions(+), 90 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfdb8b7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf diff --git a/README.md b/README.md index 5a3347a..8e3550e 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,23 @@ Ein Bash-Script zur Verwaltung und Analyse von Docker-Netzwerken. -## 📋 Beschreibung +## Beschreibung -**Dockernet Inspector** ist ein praktisches Bash-Script, das Administratoren und Entwicklern die Verwaltung und Analyse von Docker-Netzwerken erleichtert. Das Script bietet zwei Hauptfunktionen: +**Dockernet Inspector** hilft bei der täglichen Arbeit mit Docker-Netzwerken und bietet vier Hauptfunktionen: -1. **Alle Netzwerke auflisten** - Anzeige aller verfügbaren Docker-Netzwerke mit ihren Treibern -2. **Netzwerk-Details inspizieren** - Detaillierte Informationen zu einem spezifischen Netzwerk +1. Alle Netzwerke auflisten +2. Netzwerk-Details inspizieren +3. Belegte IPs pro Netzwerk anzeigen +4. Belegte IPs in allen Netzwerken anzeigen (aufsteigend sortiert) -Das Script zeigt folgende Informationen beim Inspizieren an: -- **Netzwerk-Driver** (bridge, overlay, host, etc.) -- **Bridge-Interface-Name** auf dem Host-System -- **Subnet und Gateway** des Netzwerks -- **Interface-Status** (operstate: up, down, unknown) -- **Netzwerk-Statistiken** (RX/TX Bytes und Pakete) +Beim Inspizieren eines Netzwerks werden u. a. folgende Informationen angezeigt: +- Netzwerk-Driver (bridge, overlay, host, ...) +- Bridge-Interface auf dem Host +- Subnet und Gateway +- Interface-Status (operstate) +- RX/TX Netzwerk-Statistiken -## 🚀 Installation +## Installation 1. Repository klonen: ```bash @@ -29,48 +31,52 @@ cd dockernet-inspector chmod +x dockernet-inspector.v1.sh ``` -## 💡 Verwendung +## Verwendung -### Grundlegende Syntax +### Syntax ```bash -bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONS] +bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN] ``` ### Verfügbare Befehle | Befehl | Beschreibung | -|--------|-------------| +|--------|--------------| | `networks` | Listet alle verfügbaren Docker-Netzwerke auf | | `inspect ` | Zeigt detaillierte Informationen zu einem Netzwerk | +| `ips ` | Zeigt alle belegten IPv4-Adressen im angegebenen Netzwerk | +| `ips-all` | Zeigt alle belegten IPv4-Adressen in allen Docker-Netzwerken (aufsteigend) | | `` | Alias für `inspect ` (Rückwärtskompatibilität) | | `help`, `-h`, `--help` | Zeigt die Hilfe an | ### Beispiele -**Beispiel 1: Alle Docker-Netzwerke auflisten** ```bash +# Alle Docker-Netzwerke auflisten bash ./dockernet-inspector.v1.sh networks -``` -**Beispiel 2: Standard Bridge-Netzwerk analysieren (mit inspect)** -```bash +# Netzwerk analysieren (explizit) bash ./dockernet-inspector.v1.sh inspect bridge -``` -**Beispiel 3: Benutzerdefiniertes Netzwerk analysieren (Schnellform)** -```bash +# Netzwerk analysieren (Alias) bash ./dockernet-inspector.v1.sh my-custom-network -``` -**Beispiel 4: Hilfe anzeigen** -```bash +# Belegte IPs eines Netzwerks +bash ./dockernet-inspector.v1.sh ips dockernet + +# Belegte IPs in allen Netzwerken +bash ./dockernet-inspector.v1.sh ips-all + +# Hilfe bash ./dockernet-inspector.v1.sh help ``` -### Beispiel-Ausgabe für `networks` +## Ausgabe-Beispiele -``` +### `networks` + +```text Verfügbare Docker Netzwerke: ============================== ID NAME DRIVER SCOPE @@ -79,9 +85,9 @@ mnop4567qrst8901uvwx2345 host host local yzab3456cdef7890ghij1234 mynet bridge local ``` -### Beispiel-Ausgabe für `inspect` +### `inspect` -``` +```text Docker-Netzwerk : my-network Driver : bridge Bridge-Interface : br-1234567890ab @@ -91,66 +97,63 @@ RX bytes/packets : 123456 / 789 TX bytes/packets : 654321 / 456 ``` -## 📊 Ausgabe-Details +### `ips` -| Feld | Beschreibung | -|------|-------------| -| **Docker-Netzwerk** | Name des analysierten Docker-Netzwerks | -| **Driver** | Verwendeter Netzwerk-Treiber (bridge, overlay, host, etc.) | -| **Bridge-Interface** | Name des Bridge-Interfaces auf dem Host (z.B. `br-xxxxxxxxxxxx`) | -| **Subnet/Gateway** | IP-Bereich und Gateway-Adresse des Netzwerks | -| **OperState** | Betriebszustand des Interfaces (up, down, unknown) | -| **RX bytes/packets** | Empfangene Bytes/Pakete | -| **TX bytes/packets** | Gesendete Bytes/Pakete | +```text +Belegte IP-Adressen im Netzwerk 'dockernet': +======================================== +CONTAINER IP +dozzle 172.16.0.95 +grafana 172.16.0.129 +``` -## ⚠️ Voraussetzungen +### `ips-all` -- **Docker** muss installiert und laufend sein -- **Bash** (Version 4.0 oder höher empfohlen) -- **Root/Sudo-Rechte** können für den Zugriff auf System-Interfaces erforderlich sein -- Linux-Betriebssystem (das Script nutzt `/sys/class/net/` für Interface-Statistiken) +```text +Belegte IP-Adressen in allen Netzwerken (aufsteigend): +======================================================= +NETZWERK CONTAINER IP +dockernet dozzle 172.16.0.95 +datagerry.dockernetwork.local datagerry-nginx 172.16.14.10 +matrixnetwork matrix-synapse-db 172.19.0.11 +``` -## 🔧 Fehlerbehandlung +## Fehlerbehandlung -Das Script gibt folgende Fehlermeldungen aus: +Das Script gibt unter anderem folgende Fehlermeldungen aus: -- **Kein Befehl angegeben:** `Fehler: Befehl erforderlich. Verwendung: $0 networks|inspect|help` -- **Keine Netzwerk-Angabe beim Inspizieren:** `Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect ` -- **Netzwerk nicht gefunden:** `Fehler: Netzwerk '' nicht gefunden.` -- **Docker Netzwerke konnten nicht abgerufen werden:** `Fehler: Docker Netzwerke konnten nicht abgerufen werden.` -- **Interface existiert nicht:** `WARN: Interface existiert (noch) nicht auf dem Host.` +- Kein Befehl angegeben: `Fehler: Befehl erforderlich. Verwendung: $0 networks|inspect|ips|ips-all|help` +- Keine Netzwerk-Angabe bei `inspect`: `Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect ` +- Keine Netzwerk-Angabe bei `ips`: `Fehler: Netzwerkname erforderlich. Verwendung: $0 ips ` +- Netzwerk nicht gefunden: `Fehler: Netzwerk '' nicht gefunden.` +- Docker-Netzwerke konnten nicht abgerufen werden: `Fehler: Docker Netzwerke konnten nicht abgerufen werden.` -## 🛠️ Technische Details +## Voraussetzungen + +- Docker ist installiert und läuft +- Bash (Version 4+ empfohlen) +- Linux-Host (für `/sys/class/net/` beim `inspect`-Befehl) + +## Technische Details Das Script nutzt: -- `docker network inspect` zur Abfrage von Netzwerk-Informationen -- `/sys/class/net/` Interface für Netzwerk-Statistiken -- `set -euo pipefail` für sichere Script-Ausführung +- `docker network ls` und `docker network inspect` +- `sort -V` für natürliche IP-Sortierung +- `column -t -s $'\t'` für dynamisch ausgerichtete Tabellen +- `set -euo pipefail` für robuste Script-Ausführung -## 📝 Lizenz +## Lizenz -Siehe [LICENSE](./LICENSE) Datei für Details. +Siehe [LICENSE](./LICENSE). -## 👤 Autor +## Autor **Patrick Asmus** - Website: [https://www.cleveradmin.de](https://www.cleveradmin.de) - Git: [https://git.techniverse.net/scriptos/dockernet-inspector.git](https://git.techniverse.net/scriptos/dockernet-inspector.git) -## 🤝 Beitragen +## Version -Beiträge, Issues und Feature-Anfragen sind willkommen! - -## 📅 Version - -- **Version:** 1.1.0 -- **Datum:** 17.02.2026 -- **Modifikation:** Funktion zur Auflistung aller Docker-Netzwerke hinzugefügt - -

- -

- -

-License License | Matrix Matrix | Matrix Mastodon -

\ No newline at end of file +- **Version:** 1.2.0 +- **Datum:** 18.02.2026 +- **Modifikation:** IP-Listen pro Netzwerk und netzwerkübergreifend hinzugefügt diff --git a/dockernet-inspector.v1.sh b/dockernet-inspector.v1.sh index 06a3b98..b0d5c42 100644 --- a/dockernet-inspector.v1.sh +++ b/dockernet-inspector.v1.sh @@ -4,35 +4,54 @@ # Beschreibung: Dockernet Inspector - Verwaltet und inspiziert Docker-Netzwerke # - Alle Netzwerke auflisten # - Details zu einem spezifischen Docker-Netzwerk anzeigen -# (Netzwerktyp, Bridge-Interface, Subnet/Gateway, Interface-Status & Stats) +# - Belegte IPs je Netzwerk und netzwerkuebergreifend ausgeben # Verwendung: bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONS] # Befehle: # networks - Alle Docker Netzwerke auflisten # inspect - Details zu einem Netzwerk anzeigen (Standard) +# ips - Belegte IPs in einem Netzwerk +# ips-all - Belegte IPs in allen Netzwerken # help, -h, --help - Diese Hilfe anzeigen # Autor: Patrick Asmus # Web: https://www.cleveradmin.de # Git-Reposit.: https://git.techniverse.net/scriptos/dockernet-inspector.git -# Version: 1.1.0 -# Datum: 17.02.2026 -# Modifikation: Funktion zum Auflisten aller Docker Netzwerke hinzugefügt +# Version: 1.2.0 +# Datum: 18.02.2026 +# Modifikation: IP-Listen pro Netzwerk und netzwerkuebergreifend hinzugefuegt ##################################################### set -euo pipefail +TABLE_LINE_WIDTH=80 + +print_rule() { + local char="$1" + printf '%*s\n' "$TABLE_LINE_WIDTH" '' | tr ' ' "$char" +} + +print_table_title() { + local title="$1" + echo "$title" + print_rule "=" +} + # Hilfe-Funktion show_help() { cat < - Details zu einem Netzwerk anzeigen - $0 - Alias für 'inspect ' + $0 ips - Belegte IPs in einem Netzwerk anzeigen + $0 ips-all - Belegte IPs in allen Netzwerken anzeigen + $0 - Alias fuer 'inspect ' $0 help - Diese Hilfe anzeigen BEFEHLE: - networks Listet alle verfügbaren Docker Netzwerke auf + networks Listet alle verfuegbaren Docker Netzwerke auf + ips Zeigt Containername und IPv4-Adresse im angegebenen Netzwerk + ips-all Zeigt alle belegten IPv4-Adressen in allen Netzwerken (aufsteigend) inspect Zeigt detaillierte Informationen zu einem Netzwerk: - Netzwerktyp (Driver) - Bridge-Interface @@ -43,6 +62,8 @@ BEFEHLE: BEISPIELE: $0 networks + $0 ips mynetwork + $0 ips-all $0 inspect mynetwork $0 mynetwork $0 -h @@ -52,12 +73,86 @@ HELP # Funktion zum Auflisten aller Docker Netzwerke list_networks() { - echo "Verfügbare Docker Netzwerke:" - echo "==============================" - docker network ls --format "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}}" || { + local table_output header + + print_table_title "Verfuegbare Docker Netzwerke:" + table_output="$(docker network ls --format "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}}")" || { echo "Fehler: Docker Netzwerke konnten nicht abgerufen werden." exit 2 } + + header="$(printf "%s\n" "$table_output" | head -n 1)" + printf "%s\n" "$header" + print_rule "-" + printf "%s\n" "$table_output" | tail -n +2 +} + +print_dynamic_table() { + local data="$1" + local formatted + local header + + if command -v column >/dev/null 2>&1; then + formatted="$(printf "%b" "$data" | column -t -s $'\t')" + else + formatted="$(printf "%b" "$data")" + fi + + header="$(printf "%s\n" "$formatted" | head -n 1)" + printf "%s\n" "$header" + print_rule "-" + printf "%s\n" "$formatted" | tail -n +2 +} + +list_ips_in_network() { + local net="$1" + local rows table_data + + rows="$(docker network inspect "$net" --format '{{range $id, $c := .Containers}}{{println $c.Name $c.IPv4Address}}{{end}}' 2>/dev/null || true)" + [[ -z "$rows" ]] && { + echo "Keine Container mit IPv4-Adresse im Netzwerk '$net' gefunden." + exit 0 + } + + print_table_title "Belegte IP-Adressen im Netzwerk '$net':" + table_data=$'CONTAINER\tIP\n' + while read -r cname ipcidr; do + [[ -z "${cname:-}" || -z "${ipcidr:-}" ]] && continue + table_data+="${cname}"$'\t'"${ipcidr%%/*}"$'\n' + done < <(printf "%s\n" "$rows" | sort -k2,2V) + print_dynamic_table "$table_data" +} + +list_ips_all_networks() { + local nets rows table_data + rows="" + + nets="$(docker network ls --format '{{.Name}}' 2>/dev/null || true)" + [[ -z "$nets" ]] && { + echo "Fehler: Docker Netzwerke konnten nicht abgerufen werden." + exit 2 + } + + while read -r net; do + [[ -z "${net:-}" ]] && continue + while read -r cname ipcidr; do + [[ -z "${cname:-}" || -z "${ipcidr:-}" ]] && continue + rows+="${net}"$'\t'"${cname}"$'\t'"${ipcidr%%/*}"$'\n' + done < <(docker network inspect "$net" --format '{{range $id, $c := .Containers}}{{println $c.Name $c.IPv4Address}}{{end}}' 2>/dev/null || true) + done < <(printf "%s\n" "$nets") + + [[ -z "$rows" ]] && { + echo "Keine belegten IPv4-Adressen in Docker Netzwerken gefunden." + exit 0 + } + + print_table_title "Belegte IP-Adressen in allen Netzwerken (aufsteigend):" + table_data=$'NETZWERK\tCONTAINER\tIP\n' + while IFS=$'\t' read -r net cname ip; do + [[ -z "${net:-}" || -z "${cname:-}" || -z "${ip:-}" ]] && continue + table_data+="${net}"$'\t'"${cname}"$'\t'"${ip}"$'\n' + done < <(printf "%s" "$rows" | sort -t $'\t' -k3,3V -k1,1 -k2,2) + print_dynamic_table "$table_data" } # Argument-Verarbeitung @@ -67,6 +162,16 @@ case "$COMMAND" in list_networks exit 0 ;; + ips) + NET="${2:-}" + [[ -z "$NET" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 ips "; exit 1; } + list_ips_in_network "$NET" + exit 0 + ;; + ips-all) + list_ips_all_networks + exit 0 + ;; help | -h | --help) show_help exit 0 @@ -76,20 +181,19 @@ case "$COMMAND" in [[ -z "$NET" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect "; exit 1; } ;; "") - echo "Fehler: Befehl erforderlich. Verwendung: $0 networks|inspect|help" + echo "Fehler: Befehl erforderlich. Verwendung: $0 networks|inspect|ips|ips-all|help" exit 1 ;; *) - # Kompatibilität: Wenn erstes Argument kein bekannter Befehl ist, behandle es als Netzwerkname + # Kompatibilitaet: Wenn erstes Argument kein bekannter Befehl ist, behandle es als Netzwerkname NET="$COMMAND" ;; esac -# Hauptlogik für die Inspektion eines Netzwerks (rest des originalen Scripts) +# Hauptlogik fuer die Inspektion eines Netzwerks +[[ -z "${NET:-}" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 "; exit 1; } -[[ -z "$NET" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 "; exit 1; } - -# 1) Netzwerk-ID und Bridge-Name separat holen (jeweils eigenes inspect) +# 1) Netzwerk-ID und Bridge-Name separat holen ID="$(docker network inspect "$NET" --format '{{.Id}}' 2>/dev/null || true)" [[ -z "$ID" ]] && { echo "Fehler: Netzwerk '$NET' nicht gefunden."; exit 2; }