#!/usr/bin/env python3 """Serveur CMDB : sert cmdb.html, la base partagée et la recherche AD. Remplace `python -m http.server` ET le connecteur séparé : pip install ldap3 python3 cmdb_server.py # http://0.0.0.0:8000 python3 cmdb_server.py 8080 # port custom Endpoints : GET /db → base SQLite (bytes) + entête X-DB-Version GET /db/version → {"version": n} (poll léger) POST /db → écrit la base ; entête X-Base-Version pour la concurrence optimiste (409 si obsolète) POST /ldap/search → recherche annuaire (config envoyée par la page) La base est un vrai fichier `cmdb.db` partagé : plusieurs personnes peuvent l'utiliser en même temps, avec détection de conflit. """ import json import os import re import ssl import sys import threading import time from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from urllib.parse import urlparse, parse_qs _arg = sys.argv[1].strip() if len(sys.argv) > 1 else "" PORT = int(_arg) if _arg else int(os.environ.get("PORT", 8000)) HERE = os.path.dirname(os.path.abspath(__file__)) DB_PATH = os.path.join(HERE, "cmdb.db") VER_PATH = DB_PATH + ".ver" DB_LOCK = threading.Lock() def db_version(): try: with open(VER_PATH) as f: return int(f.read().strip() or 0) except (OSError, ValueError): return 1 if os.path.exists(DB_PATH) else 0 def db_bytes(): try: with open(DB_PATH, "rb") as f: return f.read() except OSError: return b"" def db_write(data): """Écrit la base atomiquement et incrémente la version. Renvoie la version.""" with DB_LOCK: ver = db_version() + 1 tmp = DB_PATH + ".tmp" with open(tmp, "wb") as f: f.write(data) os.replace(tmp, DB_PATH) with open(VER_PATH, "w") as f: f.write(str(ver)) return ver # --------------------------------------------------------------------------- # Snapshots : copies horodatées de la base dans snapshots/. # - « auto » : créées après une écriture, au plus 1/heure, rétention 72. # - « manuel » : créées à la demande (bouton), rétention 100, label libre. # Restaurer un snapshot crée d'abord un snapshot de sécurité de l'état courant. # --------------------------------------------------------------------------- SNAP_DIR = os.path.join(HERE, "snapshots") # nom : cmdb---v[-