diff --git a/Makefile b/Makefile
index b839705..8251027 100644
--- a/Makefile
+++ b/Makefile
@@ -370,6 +370,7 @@ inventaire-verifier: ansible-runtime
ansible-inventory -i $(INVENTAIRE_PRODUCTION) --list > /dev/null
python3 scripts/inventory_host.py --inventaire $(INVENTAIRE_PRODUCTION) verifier-playbooks --dossier-playbooks $(DOSSIER_PLAYBOOKS_GROUPES)
python3 scripts/inventory_host.py --inventaire $(INVENTAIRE_PRODUCTION) --dependances $(FICHIER_DEPENDANCES) verifier-dependances --dossier-playbooks $(DOSSIER_PLAYBOOKS_GROUPES)
+ python3 scripts/verifier_gui.py
python3 scripts/serveurs.py verifier
python3 scripts/applications.py verifier
python3 scripts/bases_donnees.py verifier
diff --git a/scripts/inventory_gui.py b/scripts/inventory_gui.py
index f66c906..f703a32 100644
--- a/scripts/inventory_gui.py
+++ b/scripts/inventory_gui.py
@@ -1060,7 +1060,7 @@ HTML = r"""
function dessinerServeurs() {
const cible = document.getElementById('grilles');
- if (!serveurs.length) { cible.innerHTML = '
Aucun serveur dans le planLance « make serveurs-bootstrap » pour générer docs/serveurs.yml depuis l\\'inventaire.
'; return; }
+ if (!serveurs.length) { cible.innerHTML = 'Aucun serveur dans le planLance « make serveurs-bootstrap » pour générer docs/serveurs.yml depuis l’inventaire.
'; return; }
const clsStatut = (s) => s === 'reconcilie' ? 'actif' : (s === 'divergence' ? 'bloque' : 'attente');
const libStatut = (s) => s === 'reconcilie' ? 'réconcilié' : (s === 'divergence' ? 'divergence' : 'absent inv.');
const lignes = serveurs.map(s => `
diff --git a/scripts/verifier_gui.py b/scripts/verifier_gui.py
new file mode 100644
index 0000000..49254b1
--- /dev/null
+++ b/scripts/verifier_gui.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3
+"""Verifie la syntaxe du JavaScript embarque dans inventory_gui.py.
+
+Garde-fou : py_compile ne voit pas le JS (il est dans une chaine Python).
+Une seule erreur de syntaxe JS casse toute la page. On extrait le JS et on le
+passe a `node --check`. Si node est absent, la verification est sautee (signale).
+"""
+
+from __future__ import annotations
+
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+from pathlib import Path
+
+sys.path.insert(0, str(Path(__file__).resolve().parent))
+
+import inventory_gui as g # noqa: E402
+
+
+def main() -> int:
+ if not shutil.which("node"):
+ print("node absent : verification de la syntaxe JS du GUI sautee.")
+ return 0
+ html = g.HTML.replace("__JETON__", "TEST")
+ blocs = re.findall(r"", html, re.S)
+ if not blocs:
+ print("erreur: aucun bloc