commit bfc88f4afc2fb6c4ff5b1451cf30c41256e9ff8a Author: Guillaume DENIS Date: Sat Jul 4 16:54:08 2026 +0200 Portail Infra : CMDB, générateur certificats & mapper VLAN switch Ajouts : - Snapshots serveur de la base CMDB (auto + manuel, restauration) - Import/Export CSV de l'inventaire Préparation partage public : - Données réelles (cmdb.db, snapshots, certs/clés privées) exclues via .gitignore - Suppression des infos en dur (proxy, VLAN, configs switch exemples) Co-Authored-By: Claude Opus 4.8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77b0ef3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# === Données réelles — gardées en local, jamais publiées === +# Base CMDB (inventaire + mot de passe bind LDAP) +CMDB/cmdb.db +CMDB/cmdb.db.ver +CMDB/cmdb.db.tmp +# Snapshots horodatés de la base (copies des données réelles) +CMDB/snapshots/ + +# Certificats générés (contiennent des clés privées) +GENERATEUR_CERTIFICATES/LISTS_ALL_CERT/ + +# === Environnement / build === +.venv/ +__pycache__/ +*.pyc +*.pyo + +# === Divers === +.DS_Store +*.swp diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/CMDB/__pycache__/cmdb_server.cpython-313.pyc b/CMDB/__pycache__/cmdb_server.cpython-313.pyc new file mode 100644 index 0000000..3d8c12e Binary files /dev/null and b/CMDB/__pycache__/cmdb_server.cpython-313.pyc differ diff --git a/CMDB/__pycache__/cmdb_server.cpython-314.pyc b/CMDB/__pycache__/cmdb_server.cpython-314.pyc new file mode 100644 index 0000000..36bf750 Binary files /dev/null and b/CMDB/__pycache__/cmdb_server.cpython-314.pyc differ diff --git a/CMDB/cmdb.html b/CMDB/cmdb.html new file mode 100644 index 0000000..085ef68 --- /dev/null +++ b/CMDB/cmdb.html @@ -0,0 +1,4055 @@ + + + + + +CMDB — Admin + + + + + + + +
+ +
+

Dashboard

Vue d'ensemble de l'infrastructure

+
+
+

Répartition

+
+
+
Physique / Virtuel
+
+
+
+
Adressage IP
+
+
+
+
+
+

Machines par statut

+
+
+
+

Systèmes d'exploitation

+
+
+
+

Occupation des baies

+
+
+
+ + +
+
+

Réseaux

Cliquez sur un réseau pour voir ses IPs

+ +
+
+
+ + +
+
+

Machines

Cliquez sur un nom pour ouvrir la fiche détaillée

+ +
+
+ + + + + + + +
+
+ Types : +
+
+
+
+ + +
+
+
+ + +
+
+

Informations manquantes

Champs vides ou incomplets détectés dans l'inventaire

+
+
+ + +
+
+
+ + +
+
+

Préférences

Types de machine, catalogue OS et réglages de base

+
+ +
+

Général

+
+
+
+
+
+ +
+
+

Sauvegardes (snapshots)

+ +
+
+
Copies horodatées de la base sur le serveur (dossier snapshots/). + Un snapshot automatique est créé après une modification, au plus une fois par heure. La restauration remplace la base + actuelle et crée d'abord un snapshot de sécurité de l'état courant.
+
+ +
+
+

Import / Export CSV

+
+ + + +
+
+
Exporte l'inventaire (machines, réseaux, IP/MAC, salles/baies) en un fichier CSV — une ligne par IP. + À l'import, les réseaux, salles, baies et machines existants sont mis à jour par correspondance de nom, + les nouveaux sont créés ; les IP d'une machine importée remplacent les siennes. Utile pour sauvegarder ou + migrer les données hors de la base.
+
+ +
+
+

Types de machine

+ +
+
+
« Virtuel » = hébergé sur une autre machine. « Rackable » = peut occuper des U dans une baie. « User » = permet d'assigner un utilisateur (laptop, optiplex…).
+
+ +
+
+

Statuts de machine

+ +
+
+
+ +
+
+

Lien vers ticket

+ +
+
+
Lien + modèle de description à copier pour créer un ticket (ex : changement de configuration switch). {name} est remplacé par le nom de la machine.
+
+ +
+
+

Catalogue OS

+ +
+
+
+ +
+

Active Directory (recherche d'utilisateurs)

+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Recommandé : lancer python3 cmdb_server.py (remplace python -m http.server) — + il sert la page sur http://127.0.0.1:8000 et interroge l'AD directement, aucun connecteur à configurer. + Prérequis : pip install ldap3. Si la page est ouverte en file://, utilisez le connecteur séparé ci-dessous. + Le mot de passe bind est stocké dans la base locale.
+
+ + + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ +
+

Modèles de serveur

+
+ + + +
+
+
+ +
+

CPU

+
+ + + + +
+
+
Sur un serveur : choisir le CPU + nombre de sockets → total de cores calculé automatiquement.
+
+
+
+ +
+ + +
+ +
+ + + + diff --git a/CMDB/cmdb_server.py b/CMDB/cmdb_server.py new file mode 100644 index 0000000..4b3baa1 --- /dev/null +++ b/CMDB/cmdb_server.py @@ -0,0 +1,482 @@ +#!/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 + +PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 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[-