feat: use timestamped output filenames (containers_snapshot_<date>_<host>)

This commit is contained in:
Albert
2025-11-01 18:39:53 +01:00
parent d2bbffd2eb
commit eeac25313b
4 changed files with 210 additions and 2 deletions

View File

@@ -0,0 +1,82 @@
# Chat-Protokoll — 2025-11-01 18:27:12
Dieses Dokument fasst den Chat und die vorgenommenen Änderungen zusammen und enthält die relevanten geänderten Codeabschnitte aus `docker_info.py`.
Datum: 2025-11-01
Uhrzeit: 18:27:12 (lokale Systemzeit)
## Kurzfassung
- Der Nutzer wollte neue, aussagekräftige Dateinamen für die erzeugten Dateien (CSV und GraphML).
- Empfohlenes Schema: `containers_snapshot_<YYYY-MM-DD>_<hostname>.(csv|graphml)`.
- `docker_info.py` wurde so angepasst, dass Ausgabedateien automatisch das Datum und den (sanierten) Hostnamen enthalten und im Verzeichnis `out_01/` abgelegt werden.
## Geänderte Codeabschnitte
### 1) Ergänzte Importe
```python
import os
import datetime
import socket
```
Diese Imports wurden hinzugefügt, um Dateipfade anzulegen, das aktuelle Datum zu bestimmen und den Hostnamen zu ermitteln.
### 2) Neuer Main-Block (Dateinamens-Generierung & Ausgabepfade)
```python
if __name__ == '__main__':
print("[*] Sammle Container-Informationen...")
container_data = get_container_info()
# Erzeuge standardisierte Dateinamen: containers_snapshot_<YYYY-MM-DD>_<hostname>.(csv|graphml)
date_str = datetime.date.today().isoformat()
hostname = sanitize_id(socket.gethostname())
base_name = f"containers_snapshot_{date_str}_{hostname}"
out_dir = 'out_01'
try:
os.makedirs(out_dir, exist_ok=True)
except Exception:
# Falls das Anlegen fehlschlägt, fahren wir mit dem aktuellen Verzeichnis fort
out_dir = '.'
csv_file = os.path.join(out_dir, f"{base_name}.csv")
graph_file = os.path.join(out_dir, f"{base_name}.graphml")
save_to_csv(container_data, filename=csv_file)
save_to_graphml(container_data, filename=graph_file)
print(f"[+] Dateien: {csv_file}, {graph_file}")
```
Die Funktionen `save_to_csv` und `save_to_graphml` verwenden weiterhin denselben Code, wurden aber so aufgerufen, dass die Dateien im neuen Schema erstellt werden.
## Dateien erstellt/aktualisiert
- `docker_info.py` — aktualisiert (Importe + Main-Block geändert)
- `/volume1/docker/config/Chat-Protokoll_2025-11-01_18-27-12.md` — neu (dieses Protokoll)
- Frühere Export-Datei: `/volume1/docker/config/chat_export_2025-11-01T000000.md` — existiert ebenfalls
---
Wenn du möchtest, kann ich jetzt:
- das Skript so erweitern, dass es eine CLI-Option `--basename` oder `--timestamp` akzeptiert,
- vorhandene Dateien in `out_01/` automatisch umbenennen (z. B. `docker_container_info.csv` -> neues Schema), oder
- die Markdown-Datei mit einem vollständigen Diff der Änderung ergänzen.
Welche Aktion bevorzugst du?"}
## Vorschlag: Git Commit-Message
Kurze Optionen (wähle eine):
- English: feat: use timestamped output filenames (containers_snapshot_<date>_<host>)
- Deutsch: feat: Ausgabe-Dateinamen mit Datum und Hostnamen
Zum Anwenden mit Git:
```bash
git add docker_info.py
git commit -m "feat: use timestamped output filenames (containers_snapshot_<date>_<host>)"
```

View File

@@ -8,6 +8,9 @@ Die GraphML-Datei ist für die Visualisierung in yEd optimiert (Star-Schema).
import docker import docker
import pandas as pd import pandas as pd
import re import re
import os
import datetime
import socket
def sanitize_id(text): def sanitize_id(text):
""" """
@@ -173,5 +176,22 @@ def save_to_graphml(data, filename='docker_container_info.graphml'):
if __name__ == '__main__': if __name__ == '__main__':
print("[*] Sammle Container-Informationen...") print("[*] Sammle Container-Informationen...")
container_data = get_container_info() container_data = get_container_info()
save_to_csv(container_data)
save_to_graphml(container_data) # Erzeuge standardisierte Dateinamen: containers_snapshot_<YYYY-MM-DD>_<hostname>.(csv|graphml)
date_str = datetime.date.today().isoformat()
hostname = sanitize_id(socket.gethostname())
base_name = f"containers_snapshot_{date_str}_{hostname}"
out_dir = 'out_01'
try:
os.makedirs(out_dir, exist_ok=True)
except Exception:
# Falls das Anlegen fehlschlägt, fahren wir mit dem aktuellen Verzeichnis fort
out_dir = '.'
csv_file = os.path.join(out_dir, f"{base_name}.csv")
graph_file = os.path.join(out_dir, f"{base_name}.graphml")
save_to_csv(container_data, filename=csv_file)
save_to_graphml(container_data, filename=graph_file)
print(f"[+] Dateien: {csv_file}, {graph_file}")

View File

@@ -0,0 +1,28 @@
Container Name,Watchtower Enabled,Network,IP Address,Gateway
portainer,true,my_network,172.19.0.9,172.19.0.1
gitea,not set,my_network,172.19.0.5,172.19.0.1
gitea,not set,proxy,172.29.0.2,172.29.0.1
gitlab-db,true,gitlab_system,172.30.0.2,172.30.0.1
linkwarden-db,true,my_network,172.19.0.4,172.19.0.1
grafana,true,grafana_default,172.22.0.2,172.22.0.1
grafana,true,my_network,172.19.0.6,172.19.0.1
gitlab,true,gitlab_system,172.30.0.3,172.30.0.1
gitlab,true,my_network,172.19.0.7,172.19.0.1
linkwarden,true,my_network,172.19.0.2,172.19.0.1
nodered,true,node-red_node-red-net,172.28.0.2,172.28.0.1
gitlab-registry,true,gitlab_system,172.30.0.4,172.30.0.1
gitlab-registry,true,my_network,172.19.0.8,172.19.0.1
Watchtower,not set,watchtower_default,172.26.0.2,172.26.0.1
Vaultwarden,not set,my_network,172.19.0.10,172.19.0.1
influxdb,not set,my_network,172.19.0.3,172.19.0.1
traefik,not set,my_network,172.19.0.12,172.19.0.1
deconz,not set,deconz_default,172.24.0.2,172.24.0.1
seafile-mysql,not set,seafile_seafile_net,172.25.0.2,172.25.0.1
seafile,not set,my_network,172.19.0.11,172.19.0.1
seafile,not set,seafile_seafile_net,172.25.0.3,172.25.0.1
seafile-memcached,not set,seafile_seafile_net,172.25.0.4,172.25.0.1
nextcloud-app,not set,nextcloud_default,,
nextcloud-db,not set,nextcloud_default,,
nextcloud-redis,not set,nextcloud_default,,
traefik-1,not set,bridge,,
HandBrake,not set,bridge,,
1 Container Name Watchtower Enabled Network IP Address Gateway
2 portainer true my_network 172.19.0.9 172.19.0.1
3 gitea not set my_network 172.19.0.5 172.19.0.1
4 gitea not set proxy 172.29.0.2 172.29.0.1
5 gitlab-db true gitlab_system 172.30.0.2 172.30.0.1
6 linkwarden-db true my_network 172.19.0.4 172.19.0.1
7 grafana true grafana_default 172.22.0.2 172.22.0.1
8 grafana true my_network 172.19.0.6 172.19.0.1
9 gitlab true gitlab_system 172.30.0.3 172.30.0.1
10 gitlab true my_network 172.19.0.7 172.19.0.1
11 linkwarden true my_network 172.19.0.2 172.19.0.1
12 nodered true node-red_node-red-net 172.28.0.2 172.28.0.1
13 gitlab-registry true gitlab_system 172.30.0.4 172.30.0.1
14 gitlab-registry true my_network 172.19.0.8 172.19.0.1
15 Watchtower not set watchtower_default 172.26.0.2 172.26.0.1
16 Vaultwarden not set my_network 172.19.0.10 172.19.0.1
17 influxdb not set my_network 172.19.0.3 172.19.0.1
18 traefik not set my_network 172.19.0.12 172.19.0.1
19 deconz not set deconz_default 172.24.0.2 172.24.0.1
20 seafile-mysql not set seafile_seafile_net 172.25.0.2 172.25.0.1
21 seafile not set my_network 172.19.0.11 172.19.0.1
22 seafile not set seafile_seafile_net 172.25.0.3 172.25.0.1
23 seafile-memcached not set seafile_seafile_net 172.25.0.4 172.25.0.1
24 nextcloud-app not set nextcloud_default
25 nextcloud-db not set nextcloud_default
26 nextcloud-redis not set nextcloud_default
27 traefik-1 not set bridge
28 HandBrake not set bridge

View File

@@ -0,0 +1,78 @@
<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns:y="http://www.yworks.com/xml/graphml" xmlns="http://graphml.graphdrawing.org/xmlns"><key id="d0" for="node" yfiles.type="nodegraphics" /><key id="d1" for="node" attr.name="Watchtower Enabled" attr.type="string" /><graph id="G" edgedefault="undirected"><node id="network_gitlab_system"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>gitlab_system
gitlab-db: IP: 172.30.0.2, GW: 172.30.0.1
gitlab: IP: 172.30.0.3, GW: 172.30.0.1
gitlab-registry: IP: 172.30.0.4, GW: 172.30.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_bridge"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>bridge
traefik-1: IP: , GW:
HandBrake: IP: , GW: </y:NodeLabel></y:ShapeNode></data></node><node id="network_nextcloud_default"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>nextcloud_default
nextcloud-app: IP: , GW:
nextcloud-db: IP: , GW:
nextcloud-redis: IP: , GW: </y:NodeLabel></y:ShapeNode></data></node><node id="network_deconz_default"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>deconz_default
deconz: IP: 172.24.0.2, GW: 172.24.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_watchtower_default"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>watchtower_default
Watchtower: IP: 172.26.0.2, GW: 172.26.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_grafana_default"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>grafana_default
grafana: IP: 172.22.0.2, GW: 172.22.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_node_red_node_red_net"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>node-red_node-red-net
nodered: IP: 172.28.0.2, GW: 172.28.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_seafile_seafile_net"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>seafile_seafile_net
seafile-mysql: IP: 172.25.0.2, GW: 172.25.0.1
seafile: IP: 172.25.0.3, GW: 172.25.0.1
seafile-memcached: IP: 172.25.0.4, GW: 172.25.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_my_network"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>my_network
portainer: IP: 172.19.0.9, GW: 172.19.0.1
gitea: IP: 172.19.0.5, GW: 172.19.0.1
linkwarden-db: IP: 172.19.0.4, GW: 172.19.0.1
grafana: IP: 172.19.0.6, GW: 172.19.0.1
gitlab: IP: 172.19.0.7, GW: 172.19.0.1
linkwarden: IP: 172.19.0.2, GW: 172.19.0.1
gitlab-registry: IP: 172.19.0.8, GW: 172.19.0.1
Vaultwarden: IP: 172.19.0.10, GW: 172.19.0.1
influxdb: IP: 172.19.0.3, GW: 172.19.0.1
traefik: IP: 172.19.0.12, GW: 172.19.0.1
seafile: IP: 172.19.0.11, GW: 172.19.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="network_proxy"><data key="d0"><y:ShapeNode><y:Geometry x="500" y="400" width="200" height="60" /><y:NodeLabel>proxy
gitea: IP: 172.29.0.2, GW: 172.29.0.1</y:NodeLabel></y:ShapeNode></data></node><node id="container_traefik"><data key="d0"><y:ShapeNode><y:Geometry x="800.0" y="400.0" width="200" height="60" /><y:NodeLabel>traefik
Watchtower: deaktiviert
IP: 172.19.0.12, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_gitea"><data key="d0"><y:ShapeNode><y:Geometry x="787.8478920843493" y="484.5197670524289" width="200" height="60" /><y:NodeLabel>gitea
Watchtower: deaktiviert
IP: 172.19.0.5, GW: 172.19.0.1, Net: my_network
IP: 172.29.0.2, GW: 172.29.0.1, Net: proxy</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_portainer"><data key="d0"><y:ShapeNode><y:Geometry x="752.3760598493543" y="562.1922452366792" width="200" height="60" /><y:NodeLabel>portainer
Watchtower: aktiviert
IP: 172.19.0.9, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_Vaultwarden"><data key="d0"><y:ShapeNode><y:Geometry x="696.4582201835856" y="626.7248723062775" width="200" height="60" /><y:NodeLabel>Vaultwarden
Watchtower: deaktiviert
IP: 172.19.0.10, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_Watchtower"><data key="d0"><y:ShapeNode><y:Geometry x="624.624503900566" y="672.8895986063555" width="200" height="60" /><y:NodeLabel>Watchtower
Watchtower: deaktiviert
IP: 172.26.0.2, GW: 172.26.0.1, Net: watchtower_default</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_linkwarden"><data key="d0"><y:ShapeNode><y:Geometry x="542.6944514819855" y="696.9464325642798" width="200" height="60" /><y:NodeLabel>linkwarden
Watchtower: aktiviert
IP: 172.19.0.2, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_gitlab_db"><data key="d0"><y:ShapeNode><y:Geometry x="457.3055485180145" y="696.9464325642798" width="200" height="60" /><y:NodeLabel>gitlab-db
Watchtower: aktiviert
IP: 172.30.0.2, GW: 172.30.0.1, Net: gitlab_system</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_nextcloud_db"><data key="d0"><y:ShapeNode><y:Geometry x="375.3754960994341" y="672.8895986063555" width="200" height="60" /><y:NodeLabel>nextcloud-db
Watchtower: deaktiviert
IP: , GW: , Net: nextcloud_default</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_nextcloud_redis"><data key="d0"><y:ShapeNode><y:Geometry x="303.54177981641453" y="626.7248723062775" width="200" height="60" /><y:NodeLabel>nextcloud-redis
Watchtower: deaktiviert
IP: , GW: , Net: nextcloud_default</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_gitlab_registry"><data key="d0"><y:ShapeNode><y:Geometry x="247.62394015064567" y="562.1922452366794" width="200" height="60" /><y:NodeLabel>gitlab-registry
Watchtower: aktiviert
IP: 172.30.0.4, GW: 172.30.0.1, Net: gitlab_system
IP: 172.19.0.8, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_traefik_1"><data key="d0"><y:ShapeNode><y:Geometry x="212.1521079156508" y="484.5197670524289" width="200" height="60" /><y:NodeLabel>traefik-1
Watchtower: deaktiviert
IP: , GW: , Net: bridge</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_seafile_mysql"><data key="d0"><y:ShapeNode><y:Geometry x="200.0" y="400.00000000000006" width="200" height="60" /><y:NodeLabel>seafile-mysql
Watchtower: deaktiviert
IP: 172.25.0.2, GW: 172.25.0.1, Net: seafile_seafile_net</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_seafile_memcached"><data key="d0"><y:ShapeNode><y:Geometry x="212.15210791565073" y="315.48023294757115" width="200" height="60" /><y:NodeLabel>seafile-memcached
Watchtower: deaktiviert
IP: 172.25.0.4, GW: 172.25.0.1, Net: seafile_seafile_net</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_seafile"><data key="d0"><y:ShapeNode><y:Geometry x="247.62394015064564" y="237.80775476332073" width="200" height="60" /><y:NodeLabel>seafile
Watchtower: deaktiviert
IP: 172.19.0.11, GW: 172.19.0.1, Net: my_network
IP: 172.25.0.3, GW: 172.25.0.1, Net: seafile_seafile_net</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_influxdb"><data key="d0"><y:ShapeNode><y:Geometry x="303.5417798164144" y="173.27512769372254" width="200" height="60" /><y:NodeLabel>influxdb
Watchtower: deaktiviert
IP: 172.19.0.3, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_nextcloud_app"><data key="d0"><y:ShapeNode><y:Geometry x="375.3754960994341" y="127.11040139364445" width="200" height="60" /><y:NodeLabel>nextcloud-app
Watchtower: deaktiviert
IP: , GW: , Net: nextcloud_default</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_linkwarden_db"><data key="d0"><y:ShapeNode><y:Geometry x="457.30554851801446" y="103.0535674357202" width="200" height="60" /><y:NodeLabel>linkwarden-db
Watchtower: aktiviert
IP: 172.19.0.4, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_HandBrake"><data key="d0"><y:ShapeNode><y:Geometry x="542.6944514819854" y="103.05356743572014" width="200" height="60" /><y:NodeLabel>HandBrake
Watchtower: deaktiviert
IP: , GW: , Net: bridge</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_grafana"><data key="d0"><y:ShapeNode><y:Geometry x="624.6245039005659" y="127.11040139364445" width="200" height="60" /><y:NodeLabel>grafana
Watchtower: aktiviert
IP: 172.22.0.2, GW: 172.22.0.1, Net: grafana_default
IP: 172.19.0.6, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_nodered"><data key="d0"><y:ShapeNode><y:Geometry x="696.4582201835856" y="173.27512769372254" width="200" height="60" /><y:NodeLabel>nodered
Watchtower: aktiviert
IP: 172.28.0.2, GW: 172.28.0.1, Net: node-red_node-red-net</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><node id="container_deconz"><data key="d0"><y:ShapeNode><y:Geometry x="752.3760598493543" y="237.80775476332076" width="200" height="60" /><y:NodeLabel>deconz
Watchtower: deaktiviert
IP: 172.24.0.2, GW: 172.24.0.1, Net: deconz_default</y:NodeLabel></y:ShapeNode></data><data key="d1">not set</data></node><node id="container_gitlab"><data key="d0"><y:ShapeNode><y:Geometry x="787.8478920843493" y="315.48023294757104" width="200" height="60" /><y:NodeLabel>gitlab
Watchtower: aktiviert
IP: 172.30.0.3, GW: 172.30.0.1, Net: gitlab_system
IP: 172.19.0.7, GW: 172.19.0.1, Net: my_network</y:NodeLabel></y:ShapeNode></data><data key="d1">true</data></node><edge id="e0" source="container_portainer" target="network_my_network" /><edge id="e1" source="container_gitea" target="network_my_network" /><edge id="e2" source="container_gitea" target="network_proxy" /><edge id="e3" source="container_gitlab_db" target="network_gitlab_system" /><edge id="e4" source="container_linkwarden_db" target="network_my_network" /><edge id="e5" source="container_grafana" target="network_grafana_default" /><edge id="e6" source="container_grafana" target="network_my_network" /><edge id="e7" source="container_gitlab" target="network_gitlab_system" /><edge id="e8" source="container_gitlab" target="network_my_network" /><edge id="e9" source="container_linkwarden" target="network_my_network" /><edge id="e10" source="container_nodered" target="network_node_red_node_red_net" /><edge id="e11" source="container_gitlab_registry" target="network_gitlab_system" /><edge id="e12" source="container_gitlab_registry" target="network_my_network" /><edge id="e13" source="container_Watchtower" target="network_watchtower_default" /><edge id="e14" source="container_Vaultwarden" target="network_my_network" /><edge id="e15" source="container_influxdb" target="network_my_network" /><edge id="e16" source="container_traefik" target="network_my_network" /><edge id="e17" source="container_deconz" target="network_deconz_default" /><edge id="e18" source="container_seafile_mysql" target="network_seafile_seafile_net" /><edge id="e19" source="container_seafile" target="network_my_network" /><edge id="e20" source="container_seafile" target="network_seafile_seafile_net" /><edge id="e21" source="container_seafile_memcached" target="network_seafile_seafile_net" /><edge id="e22" source="container_nextcloud_app" target="network_nextcloud_default" /><edge id="e23" source="container_nextcloud_db" target="network_nextcloud_default" /><edge id="e24" source="container_nextcloud_redis" target="network_nextcloud_default" /><edge id="e25" source="container_traefik_1" target="network_bridge" /><edge id="e26" source="container_HandBrake" target="network_bridge" /></graph></graphml>