refactor(switch-config): charger la base VLAN depuis l'API CMDB

- loadVlanDatabase() interroge GET /api/vlans (table networks de la CMDB)
  au lieu du fichier vlan_database.js, désormais supprimé
- Repli sur la base par défaut intégrée en mode file:// ou serveur injoignable
- Lien vers le générateur de mots de passe dans la navigation

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guillaume DENIS 2026-07-08 07:39:33 +02:00
parent 90f3a2ac3d
commit 8c20793236
3 changed files with 30 additions and 55 deletions

2
.gitmodules vendored
View file

@ -1,4 +1,4 @@
[submodule "cmdb"]
path = cmdb
url = ssh://git@git.thehackdes.com/TheHackdes/Noctame.git
url = https://git.thehackdes.com/TheHackdes/Noctame.git
branch = dev

View file

@ -596,7 +596,6 @@ button:active { transform: scale(0.98); }
background: #101216; color: #d4d4d4;
}
</style>
<script src="vlan_database.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
</head>
<body>
@ -608,6 +607,7 @@ button:active { transform: scale(0.98); }
<a href="../cmdb/cmdb.html"><div class="psw-ico"></div><div class="psw-txt"><b>CMDB</b><small>Machines, réseaux, salles</small></div></a>
<a href="../cert-generator/dashboard.html"><div class="psw-ico">🔐</div><div class="psw-txt"><b>Générateur certificats</b><small>Clés RSA, CSR, SSL</small></div></a>
<a class="active" href="switch_vlan_mapper.html"><div class="psw-ico">🔌</div><div class="psw-txt"><b>Configuration switch</b><small>VLANs, export config</small></div></a>
<a href="../password-generator/password_generator.html"><div class="psw-ico">🔑</div><div class="psw-txt"><b>Mots de passe</b><small>Générateur &amp; envoi</small></div></a>
</div>
<div class="psw" style="margin-top:auto;padding-top:14px;border-top:1px solid var(--border)">
<a href="../cmdb/preferences.html"><div class="psw-ico"></div><div class="psw-txt"><b>Préférences</b><small>Types, tickets, réglages</small></div></a>
@ -810,51 +810,35 @@ const DEFAULT_VLAN_DATABASE = `1 = Native = #8B5CF6
200 = VLAN200 = #16A34A
300 = VLAN300 = #0EA5E9`;
// Charger la base de données VLAN au démarrage
function loadVlanDatabase() {
// 1⃣ Chercher d'abord dans localStorage (changements sauvegardés par l'utilisateur)
const savedDbText = localStorage.getItem('vlanDatabaseText');
if (savedDbText) {
parseVlanDatabase(savedDbText);
console.log('✓ Base de données chargée depuis le stockage local');
return;
}
// 2⃣ Vérifier si vlan_database.js a été chargé (fonctionne en mode file://)
if (typeof VLAN_DATABASE_FILE !== 'undefined') {
parseVlanDatabase(VLAN_DATABASE_FILE);
localStorage.setItem('vlanDatabaseText', VLAN_DATABASE_FILE);
console.log('✓ Base de données chargée depuis vlan_database.js');
return;
}
// 3⃣ Essayer de charger depuis le fichier externe (serveur HTTP uniquement)
// Charger la base de données VLAN au démarrage.
// Source de vérité : la table `networks` de la CMDB (SQL), exposée par le
// portail via GET /api/vlans. Chaque réseau CMDB portant un numéro de VLAN
// devient une entrée (nom + couleur). Remplace l'ancien vlan_database.js.
// Replis (mode file:// ou serveur injoignable) : base par défaut intégrée.
async function loadVlanDatabase() {
if (!location.href.startsWith('file://')) {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'vlan_database.txt', true);
xhr.onload = function() {
if (xhr.status === 200) {
parseVlanDatabase(xhr.responseText);
localStorage.setItem('vlanDatabaseText', xhr.responseText);
console.log('✓ Base de données chargée depuis vlan_database.txt');
} else {
loadDefaultDatabase();
}
};
xhr.onerror = function() {
loadDefaultDatabase();
};
try {
xhr.send();
return;
const res = await fetch('/api/vlans', { cache: 'no-store' });
if (res.ok) {
const rows = await res.json();
vlanDatabase = {};
rows.forEach(r => {
if (r.vlan === null || r.vlan === undefined || r.vlan === '') return;
vlanDatabase[String(r.vlan)] = {
name: r.name || `VLAN_${r.vlan}`,
color: r.color || '#8B5CF6'
};
});
console.log(`✓ ${Object.keys(vlanDatabase).length} VLAN(s) chargés depuis la CMDB (table networks)`);
return;
}
console.warn('CMDB /api/vlans a répondu', res.status, '→ base VLAN par défaut');
} catch (error) {
loadDefaultDatabase();
console.warn('CMDB injoignable, base VLAN par défaut :', error);
}
} else {
// Mode file:// et aucun vlan_database.js trouvé - utiliser DB par défaut
loadDefaultDatabase();
}
// Mode file:// ou serveur indisponible : base par défaut intégrée
loadDefaultDatabase();
}
function loadDefaultDatabase() {
@ -2475,8 +2459,10 @@ window.addEventListener('resize', () => {
});
// Charger la base de données au démarrage
window.addEventListener('load', () => {
loadVlanDatabase();
window.addEventListener('load', async () => {
// Attendre les VLANs (table networks CMDB) avant toute analyse : une conf
// reçue via le hash s'analyse aussitôt et a besoin des noms/couleurs.
await loadVlanDatabase();
syncCmdbDbStatus(); // version de la base CMDB (partagée via localStorage)
// Config transmise par la CMDB via l'URL (#cfg=...) : pré-remplir et analyser

View file

@ -1,11 +0,0 @@
// Fichier de base de données VLAN - À charger dans le HTML
// Placer ce fichier dans le même dossier que switch_vlan_mapper.html
// Format : <id> = <nom> = <couleur hex> (exemple générique, à adapter)
const VLAN_DATABASE_FILE = `10 = MGMT = #6366f1
20 = SERVERS = #22c55e
30 = USERS = #06b6d4
40 = VOICE = #2dd4bf
50 = DMZ = #8b5cf6
99 = GUEST = #f97316
`;