python3 - <<EOF
import subprocess
import sqlite3
from datetime import datetime, timedelta
# ANSI-Farbcodes für farbige Ausgaben
RED = '\033[0;31m'
BLUE = '\033[0;34m'
GREEN = '\033[0;32m'
NC = '\033[0m' # ANSI-Code zum Zurücksetzen der Farbe
# Definiere Container und die Anzahl der Tage, die für jeden Container beibehalten werden sollen
CONTAINERS_DAYS = {
"CONTAINERNAME_A": 7,
"CONTAINERNAME_B": 14,
# Weitere Container und deren Tage kannst du hier hinzufügen
}
# Standardanzahl an Tagen für alle anderen Container, die nicht in CONTAINERS_DAYS enthalten sind
DEFAULT_DAYS = 365
def get_all_containers():
"""Gibt eine Liste aller Container-Namen zurück."""
result = subprocess.run(["docker", "ps", "-a", "--format", "{{.Names}}"], capture_output=True, text=True)
return result.stdout.splitlines()
def get_log_path(container_name):
"""Gibt den Log-Pfad des Containers zurück."""
result = subprocess.run(["docker", "inspect", "--format", "{{.LogPath}}", container_name], capture_output=True, text=True)
return result.stdout.strip()
def cleanup_logs(db_path, days_to_keep, container_name):
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Aktuelles Datum
current_time = datetime.now()
# Bereinigungsdatum berechnen
cutoff_time = current_time - timedelta(days=days_to_keep)
# SQL-Abfrage zum Löschen alter Einträge
cursor.execute("DELETE FROM log WHERE created < ?", (cutoff_time.isoformat(),))
conn.commit()
conn.close()
print(f"{GREEN}Finished:{NC} Log entries older than {days_to_keep} days have been cleaned up for the container {GREEN}'{container_name}'{NC} at: {db_path}.")
except Exception as e:
print(f"{RED}Warning:{NC} Log database file not found for container '{container_name}' at {db_path}")
print(f"{RED}Error details:{NC} {e}")
# Alle Container auflisten
containers = get_all_containers()
# Überprüfung auf nicht existierende Container in CONTAINERS_DAYS
for container_name in CONTAINERS_DAYS:
if container_name not in containers:
print(f"{RED}Warning:{NC} Container '{container_name}' doesn't exist. Please check container name...")
# Schleife über alle Container auf dem System
for container_name in containers:
# Überprüfen, ob der Container spezielle Tage hat oder die Standardtage verwenden soll
days_to_keep = CONTAINERS_DAYS.get(container_name, DEFAULT_DAYS)
# Ermitteln des Log-DB-Pfads für den aktuellen Container
log_path = get_log_path(container_name)
if not log_path:
print(f"{RED}Warning:{NC} No log file for container '{container_name}' found. Skipping container '{container_name}'...")
continue
cleanup_logs(log_path, days_to_keep, container_name)
EOF