From bfc88f4afc2fb6c4ff5b1451cf30c41256e9ff8a Mon Sep 17 00:00:00 2001 From: Guillaume DENIS Date: Sat, 4 Jul 2026 16:54:08 +0200 Subject: [PATCH] =?UTF-8?q?Portail=20Infra=20:=20CMDB,=20g=C3=A9n=C3=A9rat?= =?UTF-8?q?eur=20certificats=20&=20mapper=20VLAN=20switch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .gitignore | 20 + .python-version | 1 + CMDB/__pycache__/cmdb_server.cpython-313.pyc | Bin 0 -> 30577 bytes CMDB/__pycache__/cmdb_server.cpython-314.pyc | Bin 0 -> 31678 bytes CMDB/cmdb.html | 4055 ++++++++++++++++++ CMDB/cmdb_server.py | 482 +++ CMDB/preferences.html | 3535 +++++++++++++++ CMDB/pyproject.toml | 9 + GENERATEUR_CERTIFICATES/cert_server.py | 174 + GENERATEUR_CERTIFICATES/dashboard.html | 1286 ++++++ GENERATEUR_CERTIFICATES/vendor/forge.min.js | 2 + GENERATEUR_CERTIFICATES/vendor/jszip.min.js | 13 + GENERATEUR_SWITCH/couleurs.txt | 48 + GENERATEUR_SWITCH/switch_vlan_mapper.html | 2561 +++++++++++ GENERATEUR_SWITCH/vlan_database.js | 11 + __pycache__/server.cpython-314.pyc | Bin 0 -> 20585 bytes conf_switch.exemple | 335 ++ conf_switch_stack.exemple | 686 +++ index.html | 11 + mise.toml | 5 + proxy.sh | 11 + pyproject.toml | 9 + server.py | 262 ++ uv.lock | 35 + 24 files changed, 13551 insertions(+) create mode 100644 .gitignore create mode 100644 .python-version create mode 100644 CMDB/__pycache__/cmdb_server.cpython-313.pyc create mode 100644 CMDB/__pycache__/cmdb_server.cpython-314.pyc create mode 100644 CMDB/cmdb.html create mode 100644 CMDB/cmdb_server.py create mode 100644 CMDB/preferences.html create mode 100644 CMDB/pyproject.toml create mode 100644 GENERATEUR_CERTIFICATES/cert_server.py create mode 100644 GENERATEUR_CERTIFICATES/dashboard.html create mode 100644 GENERATEUR_CERTIFICATES/vendor/forge.min.js create mode 100644 GENERATEUR_CERTIFICATES/vendor/jszip.min.js create mode 100644 GENERATEUR_SWITCH/couleurs.txt create mode 100644 GENERATEUR_SWITCH/switch_vlan_mapper.html create mode 100644 GENERATEUR_SWITCH/vlan_database.js create mode 100644 __pycache__/server.cpython-314.pyc create mode 100644 conf_switch.exemple create mode 100644 conf_switch_stack.exemple create mode 100644 index.html create mode 100644 mise.toml create mode 100644 proxy.sh create mode 100644 pyproject.toml create mode 100644 server.py create mode 100644 uv.lock 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 0000000000000000000000000000000000000000..3d8c12edbd432e782a03b7fd2294f8fd2c22f96f GIT binary patch literal 30577 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 literal 0 HcmV?d00001 diff --git a/CMDB/__pycache__/cmdb_server.cpython-314.pyc b/CMDB/__pycache__/cmdb_server.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36bf750e6c84f2590610995c54006845835b4472 GIT binary patch literal 31678 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 + + + + +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[-