Interaktives Menü hinzugefügt
This commit is contained in:
64
README.md
64
README.md
@@ -4,7 +4,19 @@ Ein Bash-Script zur Verwaltung und Analyse von Docker-Netzwerken.
|
|||||||
|
|
||||||
## Beschreibung
|
## 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
|
1. Alle Netzwerke auflisten
|
||||||
2. Netzwerk-Details inspizieren
|
2. Netzwerk-Details inspizieren
|
||||||
@@ -33,7 +45,22 @@ chmod +x dockernet-inspector.v1.sh
|
|||||||
|
|
||||||
## Verwendung
|
## 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
|
||||||
bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
|
bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
|
||||||
@@ -43,6 +70,7 @@ bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
|
|||||||
|
|
||||||
| Befehl | Beschreibung |
|
| Befehl | Beschreibung |
|
||||||
|--------|--------------|
|
|--------|--------------|
|
||||||
|
| *(keine)* | Startet interaktiven Modus |
|
||||||
| `networks` | Listet alle verfügbaren Docker-Netzwerke auf |
|
| `networks` | Listet alle verfügbaren Docker-Netzwerke auf |
|
||||||
| `inspect <netzwerk>` | Zeigt detaillierte Informationen zu einem Netzwerk |
|
| `inspect <netzwerk>` | Zeigt detaillierte Informationen zu einem Netzwerk |
|
||||||
| `ips <netzwerk>` | Zeigt alle belegten IPv4-Adressen im angegebenen Netzwerk |
|
| `ips <netzwerk>` | Zeigt alle belegten IPv4-Adressen im angegebenen Netzwerk |
|
||||||
@@ -52,6 +80,30 @@ bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN]
|
|||||||
|
|
||||||
### Beispiele
|
### 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
|
```bash
|
||||||
# Alle Docker-Netzwerke auflisten
|
# Alle Docker-Netzwerke auflisten
|
||||||
bash ./dockernet-inspector.v1.sh networks
|
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:
|
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 `inspect`: `Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect <docker-network-name>`
|
||||||
- Keine Netzwerk-Angabe bei `ips`: `Fehler: Netzwerkname erforderlich. Verwendung: $0 ips <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.`
|
- Netzwerk nicht gefunden: `Fehler: Netzwerk '<name>' nicht gefunden.`
|
||||||
- Docker-Netzwerke konnten nicht abgerufen werden: `Fehler: Docker Netzwerke konnten nicht abgerufen werden.`
|
- 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
|
## Voraussetzungen
|
||||||
|
|
||||||
- Docker ist installiert und läuft
|
- Docker ist installiert und läuft
|
||||||
|
|||||||
@@ -20,9 +20,10 @@
|
|||||||
# Modifikation: IP-Listen pro Netzwerk und netzwerkuebergreifend hinzugefuegt
|
# Modifikation: IP-Listen pro Netzwerk und netzwerkuebergreifend hinzugefuegt
|
||||||
#####################################################
|
#####################################################
|
||||||
|
|
||||||
set -euo pipefail
|
set -uo pipefail
|
||||||
|
|
||||||
TABLE_LINE_WIDTH=80
|
TABLE_LINE_WIDTH=80
|
||||||
|
INTERACTIVE_MODE=false
|
||||||
|
|
||||||
print_rule() {
|
print_rule() {
|
||||||
local char="$1"
|
local char="$1"
|
||||||
@@ -41,6 +42,7 @@ show_help() {
|
|||||||
Dockernet Inspector v1.2.0 - Docker Netzwerk Verwaltungstool
|
Dockernet Inspector v1.2.0 - Docker Netzwerk Verwaltungstool
|
||||||
|
|
||||||
VERWENDUNG:
|
VERWENDUNG:
|
||||||
|
$0 - Interaktiver Modus (Menü)
|
||||||
$0 networks - Alle Docker Netzwerke auflisten
|
$0 networks - Alle Docker Netzwerke auflisten
|
||||||
$0 inspect <netzwerk> - Details zu einem Netzwerk anzeigen
|
$0 inspect <netzwerk> - Details zu einem Netzwerk anzeigen
|
||||||
$0 ips <netzwerk> - Belegte IPs in einem Netzwerk anzeigen
|
$0 ips <netzwerk> - Belegte IPs in einem Netzwerk anzeigen
|
||||||
@@ -155,6 +157,137 @@ list_ips_all_networks() {
|
|||||||
print_dynamic_table "$table_data"
|
print_dynamic_table "$table_data"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 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 "0. Beenden"
|
||||||
|
echo ""
|
||||||
|
read -p "Bitte waehlen Sie eine Option (0-4): " 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
|
||||||
|
;;
|
||||||
|
0)
|
||||||
|
echo "Auf Wiedersehen!"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "FEHLER: Ungueltige Eingabe '$choice'. Bitte geben Sie eine Nummer zwischen 0 und 4 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
|
# Argument-Verarbeitung
|
||||||
COMMAND="${1:-}"
|
COMMAND="${1:-}"
|
||||||
case "$COMMAND" in
|
case "$COMMAND" in
|
||||||
@@ -179,55 +312,18 @@ case "$COMMAND" in
|
|||||||
inspect)
|
inspect)
|
||||||
NET="${2:-}"
|
NET="${2:-}"
|
||||||
[[ -z "$NET" ]] && { echo "Fehler: Netzwerkname erforderlich. Verwendung: $0 inspect <docker-network-name>"; exit 1; }
|
[[ -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"
|
# Starte interaktiven Modus, wenn keine Argumente uebergeben wurden
|
||||||
exit 1
|
interactive_menu
|
||||||
|
exit 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
# Kompatibilitaet: 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"
|
NET="$COMMAND"
|
||||||
|
inspect_network "$NET"
|
||||||
|
exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user