5 Commits

2 changed files with 257 additions and 51 deletions

View File

@@ -4,7 +4,19 @@ Ein Bash-Script zur Verwaltung und Analyse von Docker-Netzwerken.
## Beschreibung
**Dockernet Inspector** hilft bei der täglichen Arbeit mit Docker-Netzwerken und bietet vier Hauptfunktionen:
**Dockernet Inspector** hilft bei der täglichen Arbeit mit Docker-Netzwerken durch zwei Nutzungsmodi:
**Interaktiver Modus (Menü):**
- Benutzerfreundliches Menü ohne Kommandozeilenargumente
- Intuitive Netzwerk-Auswahl aus einer Liste
- Fehlerbehandlung bei ungültigen Eingaben
**Kommandozeilen-Modus (CLI):**
- Schnelle automatisierte Abfragen
- Scripting-freundlich
- Rückwärtskompatibel
Das Script bietet vier Hauptfunktionen:
1. Alle Netzwerke auflisten
2. Netzwerk-Details inspizieren
@@ -33,7 +45,22 @@ chmod +x dockernet-inspector.v1.sh
## Verwendung
### Syntax
Das Script kann auf zwei Arten verwendet werden:
### 1. Interaktiver Modus (Menü)
```bash
bash ./dockernet-inspector.v1.sh
```
Das Script startet dann ein interaktives Menü, über das Sie folgende Optionen wählen können:
- **1** - Alle Netzwerke auflisten
- **2** - Detaillierte Infos zu einem Netzwerk (mit Netzwerk-Auswahl)
- **3** - IPs eines Netzwerks anzeigen (mit Netzwerk-Auswahl)
- **4** - Alle belegten IPs anzeigen
- **0** - Beenden
### 2. Kommandozeilen-Modus (CLI)
```bash
bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
@@ -43,6 +70,7 @@ bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
| Befehl | Beschreibung |
|--------|--------------|
| *(keine)* | Startet interaktiven Modus |
| `networks` | Listet alle verfügbaren Docker-Netzwerke auf |
| `inspect <netzwerk>` | Zeigt detaillierte Informationen zu einem Netzwerk |
| `ips <netzwerk>` | Zeigt alle belegten IPv4-Adressen im angegebenen Netzwerk |
@@ -52,6 +80,30 @@ bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
### Beispiele
#### Interaktiver Modus
```bash
# Interaktives Menü starten
bash ./dockernet-inspector.v1.sh
# Output:
# ================================================================================
# Dockernet Inspector - Interaktives Menü
# ================================================================================
#
# 1. Alle Netzwerke auflisten
# 2. Detaillierte Infos zu einem Netzwerk
# 3. IPs eines Netzwerks anzeigen
# 4. Alle belegten IPs anzeigen
# 0. Beenden
#
# Bitte waehlen Sie eine Option (0-4):
```
Im Menü können Sie einfach die Nummer eingeben. Bei den Optionen 2 und 3 werden Sie aufgefordert, ein Netzwerk aus einer Liste zu wählen.
#### Kommandozeilen-Modus
```bash
# Alle Docker-Netzwerke auflisten
bash ./dockernet-inspector.v1.sh networks
@@ -122,12 +174,18 @@ matrixnetwork matrix-synapse-db 172.19.0.11
Das Script gibt unter anderem folgende Fehlermeldungen aus:
- Kein Befehl angegeben: `Fehler: Befehl erforderlich. Verwendung: $0 networks|inspect|ips|ips-all|help`
**CLI-Modus:**
- Keine Netzwerk-Angabe bei `inspect`: `Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect <docker-network-name>`
- Keine Netzwerk-Angabe bei `ips`: `Fehler: Netzwerkname erforderlich. Verwendung: $0 ips <docker-network-name>`
- Netzwerk nicht gefunden: `Fehler: Netzwerk '<name>' nicht gefunden.`
- Docker-Netzwerke konnten nicht abgerufen werden: `Fehler: Docker Netzwerke konnten nicht abgerufen werden.`
**Interaktiver Modus:**
- Ungültige Eingabe: `FEHLER: Ungueltige Eingabe. Bitte geben Sie eine Nummer zwischen 0 und 4 ein.`
- Keine Netzwerke vorhanden: `Fehler: Keine Docker Netzwerke gefunden.`
Das Script unterstützt auch Fehlerbehandlung bei ungültigen Eingaben und ermöglicht dem Nutzer, die Eingabe zu korrigieren, ohne dass das Script abstürzt.
## Voraussetzungen
- Docker ist installiert und läuft

View File

@@ -15,14 +15,15 @@
# Autor: Patrick Asmus
# Web: https://www.cleveradmin.de
# Git-Reposit.: https://git.techniverse.net/scriptos/dockernet-inspector.git
# Version: 1.2.0
# Datum: 18.02.2026
# Modifikation: IP-Listen pro Netzwerk und netzwerkuebergreifend hinzugefuegt
# Version: 1.4.0
# Datum: 22.03.2026
# Modifikation: Netzwerk loeschen Funktion hinzugefügt (nur unbenutzte Netzwerke)
#####################################################
set -euo pipefail
set -uo pipefail
TABLE_LINE_WIDTH=80
INTERACTIVE_MODE=false
print_rule() {
local char="$1"
@@ -41,6 +42,7 @@ show_help() {
Dockernet Inspector v1.2.0 - Docker Netzwerk Verwaltungstool
VERWENDUNG:
$0 - Interaktiver Modus (Menü)
$0 networks - Alle Docker Netzwerke auflisten
$0 inspect <netzwerk> - Details zu einem Netzwerk anzeigen
$0 ips <netzwerk> - Belegte IPs in einem Netzwerk anzeigen
@@ -155,6 +157,189 @@ list_ips_all_networks() {
print_dynamic_table "$table_data"
}
# Funktion zum Loeschen eines unbenutzten Netzwerks
delete_network() {
local nets net container_count
nets="$(docker network ls --format '{{.Name}}' 2>/dev/null || true)"
if [[ -z "$nets" ]]; then
echo "Fehler: Keine Docker Netzwerke gefunden."
return 1
fi
echo "Verfuegbare Netzwerke:"
select net in $nets; do
if [[ -n "$net" ]]; then
# Standardnetzwerke schuetzen
if [[ "$net" == "bridge" || "$net" == "host" || "$net" == "none" ]]; then
echo "FEHLER: Das Standard-Netzwerk '$net' kann nicht geloescht werden."
return 1
fi
# Pruefen ob Container das Netzwerk verwenden
container_count="$(docker network inspect "$net" --format '{{len .Containers}}' 2>/dev/null || echo 0)"
if [[ "$container_count" -gt 0 ]]; then
echo "FEHLER: Das Netzwerk '$net' wird aktuell von $container_count Container(n) verwendet und kann nicht geloescht werden."
echo ""
echo "Verbundene Container:"
docker network inspect "$net" --format '{{range $id, $c := .Containers}} - {{$c.Name}} ({{$c.IPv4Address}}){{println}}{{end}}' 2>/dev/null
return 1
fi
# Sicherheitsabfrage
read -p "Soll das Netzwerk '$net' wirklich geloescht werden? (j/N): " confirm
if [[ "$confirm" == "j" || "$confirm" == "J" ]]; then
if docker network rm "$net" >/dev/null 2>&1; then
echo "Netzwerk '$net' wurde erfolgreich geloescht."
else
echo "FEHLER: Netzwerk '$net' konnte nicht geloescht werden."
return 1
fi
else
echo "Loeschvorgang abgebrochen."
fi
return 0
else
echo "Ungueltige Auswahl. Bitte versuchen Sie es erneut."
fi
done
}
# Interaktive Menü-Funktion
interactive_menu() {
while true; do
echo ""
print_rule "="
echo "Dockernet Inspector - Interaktives Menü"
print_rule "="
echo ""
echo "1. Alle Netzwerke auflisten"
echo "2. Detaillierte Infos zu einem Netzwerk"
echo "3. IPs eines Netzwerks anzeigen"
echo "4. Alle belegten IPs anzeigen"
echo "5. Netzwerk loeschen"
echo "0. Beenden"
echo ""
read -p "Bitte waehlen Sie eine Option (0-5): " choice
echo ""
case "$choice" in
1)
list_networks
;;
2)
if select_and_inspect_network; then
:
fi
;;
3)
nets="$(docker network ls --format '{{.Name}}' 2>/dev/null || true)"
if [[ -z "$nets" ]]; then
echo "Fehler: Keine Docker Netzwerke gefunden."
continue
fi
echo "Verfuegbare Netzwerke:"
select net in $nets; do
if [[ -n "$net" ]]; then
list_ips_in_network "$net"
break
else
echo "Ungueltige Auswahl. Bitte versuchen Sie es erneut."
fi
done
;;
4)
list_ips_all_networks
;;
5)
delete_network
;;
0)
echo "Auf Wiedersehen!"
exit 0
;;
*)
echo "FEHLER: Ungueltige Eingabe '$choice'. Bitte geben Sie eine Nummer zwischen 0 und 5 ein."
sleep 1
;;
esac
done
}
# Funktion zur Auswahl und Inspektion eines Netzwerks
select_and_inspect_network() {
local nets net
nets="$(docker network ls --format '{{.Name}}' 2>/dev/null || true)"
if [[ -z "$nets" ]]; then
echo "Fehler: Keine Docker Netzwerke gefunden."
return 1
fi
echo "Verfuegbare Netzwerke:"
select net in $nets; do
if [[ -n "$net" ]]; then
NET="$net"
inspect_network "$NET"
return 0
else
echo "Ungueltige Auswahl. Bitte versuchen Sie es erneut."
fi
done
}
# Separate Funktion fuer Netzwerk-Inspektion
inspect_network() {
local NET="$1"
# 1) Netzwerk-ID und Bridge-Name separat holen
local ID BR_RAW IF SUBNET GATEWAY state rxb txb rxp txp
ID="$(docker network inspect "$NET" --format '{{.Id}}' 2>/dev/null || true)"
[[ -z "$ID" ]] && { echo "Fehler: Netzwerk '$NET' nicht gefunden."; return 2; }
BR_RAW="$(docker network inspect "$NET" --format '{{index .Options "com.docker.network.bridge.name"}}' 2>/dev/null || true)"
# 2) Falls kein eigener Bridge-Name: Standardname br-<ID[:12]>
if [[ -z "$BR_RAW" || "$BR_RAW" == "<no value>" ]]; then
IF="br-${ID:0:12}"
else
IF="$BR_RAW"
fi
# 3) Subnet/Gateway
SUBNET="$(docker network inspect "$NET" --format '{{(index .IPAM.Config 0).Subnet}}' 2>/dev/null || true)"
GATEWAY="$(docker network inspect "$NET" --format '{{(index .IPAM.Config 0).Gateway}}' 2>/dev/null || true)"
# 4) Interface-Status & Stats
state="unknown"; rxb=0; txb=0; rxp=0; txp=0
if ip link show "$IF" &>/dev/null; then
state="$(cat /sys/class/net/"$IF"/operstate 2>/dev/null || echo unknown)"
rxb="$(cat /sys/class/net/"$IF"/statistics/rx_bytes 2>/dev/null || echo 0)"
txb="$(cat /sys/class/net/"$IF"/statistics/tx_bytes 2>/dev/null || echo 0)"
rxp="$(cat /sys/class/net/"$IF"/statistics/rx_packets 2>/dev/null || echo 0)"
txp="$(cat /sys/class/net/"$IF"/statistics/tx_packets 2>/dev/null || echo 0)"
else
echo "WARN: Interface $IF existiert (noch) nicht auf dem Host."
fi
echo ""
print_rule "="
echo "Detaillerte Informationen fuer Netzwerk: $NET"
print_rule "="
echo ""
cat <<OUT
Docker-Netzwerk : $NET
Driver : $(docker network inspect "$NET" --format '{{.Driver}}')
Bridge-Interface : $IF
Subnet/Gateway : ${SUBNET:--} / ${GATEWAY:--}
OperState : $state
RX bytes/packets : $rxb / $rxp
TX bytes/packets : $txb / $txp
OUT
echo ""
}
# Argument-Verarbeitung
COMMAND="${1:-}"
case "$COMMAND" in
@@ -179,55 +364,18 @@ case "$COMMAND" in
inspect)
NET="${2:-}"
[[ -z "$NET" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect <docker-network-name>"; exit 1; }
inspect_network "$NET"
exit 0
;;
"")
echo "Fehler: Befehl erforderlich. Verwendung: $0 networks|inspect|ips|ips-all|help"
exit 1
# Starte interaktiven Modus, wenn keine Argumente uebergeben wurden
interactive_menu
exit 0
;;
*)
# Kompatibilitaet: Wenn erstes Argument kein bekannter Befehl ist, behandle es als Netzwerkname
NET="$COMMAND"
inspect_network "$NET"
exit 0
;;
esac
# Hauptlogik fuer die Inspektion eines Netzwerks
[[ -z "${NET:-}" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 <docker-network-name>"; exit 1; }
# 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; }
BR_RAW="$(docker network inspect "$NET" --format '{{index .Options "com.docker.network.bridge.name"}}' 2>/dev/null || true)"
# 2) Falls kein eigener Bridge-Name: Standardname br-<ID[:12]>
if [[ -z "$BR_RAW" || "$BR_RAW" == "<no value>" ]]; then
IF="br-${ID:0:12}"
else
IF="$BR_RAW"
fi
# 3) Subnet/Gateway
SUBNET="$(docker network inspect "$NET" --format '{{(index .IPAM.Config 0).Subnet}}' 2>/dev/null || true)"
GATEWAY="$(docker network inspect "$NET" --format '{{(index .IPAM.Config 0).Gateway}}' 2>/dev/null || true)"
# 4) Interface-Status & Stats
state="unknown"; rxb=0; txb=0; rxp=0; txp=0
if ip link show "$IF" &>/dev/null; then
state="$(cat /sys/class/net/"$IF"/operstate 2>/dev/null || echo unknown)"
rxb="$(cat /sys/class/net/"$IF"/statistics/rx_bytes 2>/dev/null || echo 0)"
txb="$(cat /sys/class/net/"$IF"/statistics/tx_bytes 2>/dev/null || echo 0)"
rxp="$(cat /sys/class/net/"$IF"/statistics/rx_packets 2>/dev/null || echo 0)"
txp="$(cat /sys/class/net/"$IF"/statistics/tx_packets 2>/dev/null || echo 0)"
else
echo "WARN: Interface $IF existiert (noch) nicht auf dem Host."
fi
cat <<OUT
Docker-Netzwerk : $NET
Driver : $(docker network inspect "$NET" --format '{{.Driver}}')
Bridge-Interface : $IF
Subnet/Gateway : ${SUBNET:--} / ${GATEWAY:--}
OperState : $state
RX bytes/packets : $rxb / $rxp
TX bytes/packets : $txb / $txp
OUT