Journal des modifications¶
Dernière mise à jour : 20 octobre 2026
Toutes les modifications notables de ce projet sont documentées dans ce fichier.
[v202612-beta3] - 20/10/2026¶
Ajouts¶
- Outil de mise à jour (
tolk-setup.sh) : charge l'image, crée.envà la première installation ; lors d'une mise à jour, réconcilie.envavec la version (nouveaux paramètres ajoutés à leur place avec leur valeur par défaut,PROJECT_*actualisées, sauvegarde de.env, aperçu--dry-run). - CUCM — Support codecs RoomOS (
SERVER_CUCM_ROOMOS_ENABLED) : terminaux RoomOS pilotés par leur xAPI en HTTPS. cucm_phone_web_info: lit les pages d'information web d'un téléphone IP Cisco 88xx/98xx, restituées analysées : équipement, configuration réseau, Ethernet, ports réseau/accès (voisin CDP/LLDP), flux RTP 1-5, messages d'état, affichage debug, noms des fichiers de logs console / core dumps, plusieurs pages (listepages) ou toutes les pages en une fois, avec sortie facultativecompact(sans champs vides ni compteurs à zéro) etsummary(un résumé par page). Horodatages en heure locale du téléphone et en UTC (time_utc, d'après le fuseau IANA du téléphone) ;truncatedsignale un tampon de 10 lignes plein. Audit de sécurité : objettrust_list(mode de sécurité, fichier ITL/CTL, signature, empreinte, serveurs TFTP/CAPF/TVS, dernière mise à jour, dernier rapport DeviceTLInfo) et optioncompare_cucmcomparant l'empreinte ITL du téléphone à la base CUCM (tftptlinfo/devicetlinfo, AXLexecuteSQLQuery). Plusieurs téléphones à la fois avecip_phones(liste, exclusive deip_phone) : téléphones lus en parallèle, un résultat par téléphone avec un statut globalok/partial/erroret des compteurs,compactactivé par défaut,page="all"uniquement avecsummary, budget de temps global, une seule comparaison CUCM groupée et untrust_summaryde parc (empreintes ITL distinctes, téléphones match / mismatch / unknown). Mêmes prérequis que la capture d'écran (identifiantscucm-phone, Web Access activé). Nouvelle opération RBAC téléphoneweb_info(accordée aux profilsadmin,operatoretauditor; un créneau de limitation de débit par téléphone) et nouveaux paramètresSERVER_CUCM_PHONE_WEB_TIMEOUT,SERVER_CUCM_PHONE_WEB_MAX_TARGETS,SERVER_CUCM_PHONE_WEB_CONCURRENCYetSERVER_CUCM_PHONE_WEB_BATCH_TIMEOUT.cucm_restart_feature_service: redémarre un service fonctionnel CUCM (ex. Cisco Tftp) sur un nœud via l'API SOAP Serviceability (ControlCenterServices).- Interface Web d'administration — Outils > Test de connectivité : teste l'accès à un produit / terminal (réseau, TLS, identifiants, API, SSH ; lecture du hash ITL / CTL des téléphones IP et codecs RoomOS, sans comparaison) et permet de l'ajouter à un client.
- Interface Web d'administration — Prompts personnalisés : synthèse de fin de workflow commune : nouvelle option Ajouter la synthèse de fin de workflow commune (
"summary": truedans le fichier de définition) ; l'agent IA termine alors le workflow par une courte synthèse client (opération, résultat global, chiffres clés, modifications, points d'attention, actions restantes, retour arrière), complétée par la section## Summary specificspropre au prompt.
Modifications¶
- Interface Web d'administration —
UID/GID: l'utilisateur du conteneur est désormais affiché et modifiable dans Paramètres globaux → Server → Conteneur Docker (0= root refusé). Les deux clés sont désormais actives dans.env(défaut1000, comme auparavant) ; lors d'une mise à jour, les lignes commentées#UID/#GIDsont activées sur place avec1000. - Interface Web d'administration — cohérence de
AUTH_MODE: un mode plus restrictif que le mode d'authentification propre d'un client est désormais refusé (le serveur ne redémarrait plus) ; le passage enjwt+oauth2attribue le mode précédent à chaque client existant ; l'annulation deAUTH_MODEou des clients seuls est refusée lorsque la paire ne correspondrait plus.AUTH_MODEest désormais mis en attente comme les clients : le serveur en cours conserve son mode jusqu'à Appliquer & redémarrer. - Interface Web d'administration — certificat TLS auto-signé au-delà de sa mi-vie : comme il n'est régénéré qu'au démarrage, la tuile de l'en-tête indique désormais REDÉMARRAGE REQUIS (lien vers Appliquer & redémarrer), le bandeau de redémarrage s'affiche sur toutes les pages et le certificat est listé comme modification en attente (auteur Système).
- Interface Web d'administration — Sauvegarde / Restauration : le bouton Exporter en SFTP maintenant est désactivé en l'absence de sauvegarde système locale.
- Interface Web d'administration — sessions : Rester connecté n'expire plus sur inactivité (la session reste valable
ADMIN_UI_SESSION_REMEMBER_DAYSjours). - Interface Web d'administration — nouveaux paramètres signalés : les paramètres ajoutés par une mise à jour sont signalés en bleu (tuile d'en-tête, points dans les menus / onglets, lignes) jusqu'à « Marquer comme vus », modification, ou au bout de 7 jours.
cucm_phone_send_message: prise en charge multi-terminaux — un même message envoyé en parallèle à 50 téléphones IP maximum. L'argumentterminal_typeest supprimé : l'outil cible uniquement les téléphones IP Cisco 88xx / 98xx, les codecs RoomOS utilisentcucm_roomos_send_message.cucm_risport_query: prise en charge multi-terminaux — jusqu'à 1000 noms de terminaux (ou wildcard*) résolus en UNE seule requête RisPort.- CUCM — purge des journaux de campagnes de mise à jour : le garbage collector nocturne (03:15) supprime les journaux des campagnes terminées (completed / aborted) ou jamais démarrées plus anciennes que
SERVER_CUCM_PHONE_CAMPAIGN_RETENTION_DAYS(téléphones IP) /SERVER_CUCM_ROOMOS_CAMPAIGN_RETENTION_DAYS(RoomOS), 30 jours par défaut (0= jamais purgés).
Corrections¶
- CUCM — AXL
busyLampField(BLF) : une BLF vers un DN interne ne pouvait pas être écrite —blfDestest obligatoire dans le schéma AXL (Missing element blfDestsi absent /null) alors que CUCM le refuse, même vide, à côté deblfDirn. Le serveur omet désormaisblfDestpour les entrées portantblfDirnet retire lesblfDirn/routePartitionvides des entrées vers un numéro externe dans les opérationsadd*/update*; une entrée avec à la fois ou aucun deblfDest/blfDirnest refusée avant d'atteindre CUCM. - CUCM — AXL
returnedTags: les membres d'unxsd:choicedemandés avec une valeur vide (ex.blfDirn/routePartitiond'une BLF) étaient silencieusement retirés des requêtesget*/list*; CUCM les renvoyait donc ànull(une BLF vers un DN interne paraissait orpheline).
Prompts Customs¶
- CUCM — workflow de mise à jour Phones : campagnes pilotées par le serveur, contrôles ITL, suivi automatique, journal persistant et rapport final.
- CUCM — workflow de mise à jour RoomOS : campagnes pilotées par le serveur, contrôles ITL/CTL et Room Navigator, suivi automatique, journal persistant et rapport final.
- CUCM — workflow d'édition du phonebook RoomOS : campagnes pilotées par le serveur, contrôles ITL/CTL et Room Navigator, suivi automatique, journal persistant et rapport final.
- CUCM — workflow d'installation d'un COP File : installation d'un COP en global sur le cluster, ou par node avec un ordre défini.
- CUCM — workflow d'édition des BLF d'un téléphone : deux formats d'entrée explicites — DN interne et numéro externe.
- CUCM — tous les workflows : synthèse client de fin de workflow activée, avec les spécificités de chaque workflow (mise à jour Phones / RoomOS, installation de COP File, édition des BLF et du phonebook RoomOS).
Dépendances¶
- bcrypt==5.0.0
- colorlog==6.12.0
- cryptography==50.0.2
- fastmcp==3.4.9
- lxml==6.1.3
- Markdown==3.11.2
- matplotlib==3.11.2
- mcp==1.30.0
- numpy==2.5.4
- paramiko==5.1.0
- pillow==13.0.0
- prometheus_client==0.26.0
- pydantic==2.14.1
- pydantic-settings==2.16.1
- PyJWT==2.15.1
- python-dotenv==1.2.4
- python-multipart==0.0.32
- requests==2.34.2
- starlette==1.9.0
- tzdata==2026.5
- urllib3==2.8.0
- weasyprint==70.0
- zeep==4.3.3
[v202609] - 30/09/2026¶
Ajouts¶
CUCM¶
- Nouvel outil
cucm_phone_send_message: envoyer un message texte à l'écran d'un téléphone IP Cisco (88xx/98xx) ou d'un terminal RoomOS.
Sécurité¶
- Limitation globale du nombre de requêtes : limite cumulative protégeant chaque serveur Cisco de destination.
- Blocage manuel d'IP (page Système) : accepte une IP ou un sous-réseau CIDR (IPv4/IPv6), une portée (UI Web, MCP ou les deux) et une durée de déblocage automatique en minutes / heures / jours, ou jamais (permanent jusqu'au déblocage manuel). Un blocage de portée UI Web interdit toute l'UI d'administration à cette adresse ; bloquer sa propre adresse est refusé.
- Prise en charge des reverse proxies : nouveaux paramètres
TRUSTED_PROXY_IPS(proxies de confiance, IP réelle du client lue dansX-Forwarded-For) etMCP_SERVER_PUBLIC_URL(URL publique annoncée derrière une VIP).
Diagnostic¶
- Show tech : détails des clients, adresses IPv4 partiellement masquées, modifications en attente incluses.
/metrics,/statuset/health: nouvelles métriques et informations (statistiques, certificat de l'UI d'administration).
Mode maintenance¶
- Nouveau mode maintenance pour vider le trafic MCP avant une mise à jour ou un redémarrage : les nouvelles sessions sont refusées, les sessions en cours se poursuivent.
- Les clients connectés sont refusés après
MAINTENANCE_IDLE_TIMEOUT_SECONDSd'inactivité (ou aprèsMAINTENANCE_MAX_DRAIN_SECONDS) ;/healthpasse àmaintenanceune fois tous les clients partis.
UI Web d'administration¶
- Nouvelle UI Web d'administration : console d'administration du serveur Tolk accessible depuis un navigateur.
- Le lien de l'icône d'aide (
?) peut être édité — par exemple vers un site interne de documentation. - Certificats : génération de CSR avec SAN modifiables.
Modifications¶
- État des certificats TLS (zone Sécurité du tableau de bord, Système & rechargement, contrôle Appliquer & redémarrer, tuile d'en-tête) : même règle pour tous les certificats et types — vert, orange dès que 50 % de la durée de vie est écoulée (renouvellement conseillé), rouge si expiré. Les certificats signés par une CA n'utilisent plus le seuil fixe de 30 jours.
Corrections¶
- Un certificat auto-signé de l'interface d'administration était considéré comme signé par une CA après un redémarrage (jamais renouvelé à mi-vie, mauvaise couleur d'état).
- L'état TLS du tableau de bord / de l'en-tête n'était calculé qu'au démarrage ; il est désormais évalué en direct, et la tuile d'en-tête renvoie vers la carte TLS de la page Système & rechargement.
- Statistiques › Pipeline : les sondes d'infrastructure (
/health,/status,/metrics— HEALTHCHECK Docker, supervision, show tech) ne sont plus comptées dans les étapes Transport, HTTP et Authentification ; le Pipeline reste vide après une réinitialisation des statistiques, comme les autres graphiques. - Statistiques : après un redémarrage, les plages 5 min / 1 h / 24 h (en mémoire) perdaient toutes les requêtes antérieures, alors que 7 j / 30 j / 1 an (historique persistant) les conservaient — une plage longue pouvait afficher plus de requêtes qu'une plage courte couvrant la même activité. Les fenêtres en direct sont désormais reconstruites depuis l'historique horaire au démarrage (événements répartis sur leur heure) : toutes les plages concordent.
- Statistiques : un redémarrage sur place (Appliquer et redémarrer, réconciliation de licence) perdait jusqu'à une minute de statistiques non encore enregistrées ; elles sont désormais enregistrées avant le redémarrage.
- Statistiques › Pipeline : les requêtes
/health,/status,/metrics,/authorize(POST) et/tokenétaient comptées deux fois à l'étape HTTP.
Dépendances¶
- bcrypt==5.0.0
- colorlog==6.12.0
- cryptography==50.0.2
- fastmcp==3.4.7
- lxml==6.1.3
- Markdown==3.11
- matplotlib==3.11.2
- mcp==1.29.0
- numpy==2.5.3
- paramiko==5.0.0
- pillow==12.3.0
- prometheus_client==0.26.0
- pydantic==2.13.5
- pydantic-settings==2.15.0
- PyJWT==2.15.1
- python-dotenv==1.2.4
- python-multipart==0.0.32
- requests==2.34.2
- starlette==1.7.0
- urllib3==2.8.0
- weasyprint==70.0
- zeep==4.3.3
- bandit==1.9.4
- freezegun==1.5.5
- httpx==0.28.1
- httpx2==2.13.1
- msgpack==1.2.3
- mypy==2.3.1
- pip==26.2.1
- pip-audit==2.10.1
- pre-commit==4.6.2
- pymupdf4llm==1.28.2
- pytest==9.1.1
- pytest-asyncio==1.4.0
- pytest-cov==7.1.0
- pytest-timeout==2.4.0
- pytest-xdist==3.8.0
- PyYAML==6.0.3
- ruff==0.16.9
[v202606] - 25/06/2026¶
Ajouts¶
CUC (Cisco Unity Connection) — nouveau module produit¶
- Nouveau module produit
cuc, conditionné par le claim de licence signé"cuc". - Versions supportées : CUC v14 & v15.
- 13 outils MCP répartis entre CUPI REST (
get_version,cupi_list,cupi_call, …), SSH OS Admin (os_run_command), diagnostics de connectivité et gestion des identifiants. - Prompts :
cuc/procedure,cuc/security_audit. - Ressources : 8 chapitres du guide CLI VOS, 3 chapitres du Security Guide (optionnels), ainsi qu'un catalogue d'endpoints CUPI (~80 endpoints) packagé sous
docs://cuc/cupi/referenceet référencé par les prompts CUC. - À noter : client CUPI (REST
/vmrest/) avec vérification TLS obligatoire ; même modèle RBAC et même schéma d'identifiants que CUCM / IMP.
Autres ajouts¶
- Mutualisation des sessions SSH (SSH Pooling)
- Métriques Prometheus du pool SSH : occupation en temps réel, histogramme de réutilisation des commandes, compteur de succès.
- Auto-découverte RBAC pour les clients MCP : nouvel outil
infra_get_my_permissions(product?)et matrice intégrée àinfra_init_session. - Découverte documentaire pour les clients tools-only : nouveaux outils
infra_list_docs()/infra_get_doc(name|uri).
Modifications¶
- Mentions « read-only » trompeuses supprimées des outils
*_axl_call,*_os_run_command,cuc_cupi_callet listings associés — les permissions dépendent désormais du profil RBAC de l'appelant. - Prompts
procedure(CUCM / IMP / CUC) : le LLM est invité à appelerinfra_get_my_permissions(<product>)avant toute opération d'écriture/admin.
Dépendances¶
- bcrypt==5.0.0
- colorlog==6.10.1
- cryptography==49.0.0
- fastmcp==3.2.4
- lxml==6.1.1
- Markdown==3.10.2
- matplotlib==3.11.0
- mcp==1.28.0
- numpy==2.5.0
- paramiko==5.0.0
- Pillow==12.2.0
- prometheus_client==0.25.0
- pydantic==2.13.4
- pydantic-settings>=2.14.2
- PyJWT==2.13.0
- python-dotenv==1.2.2
- python-multipart==0.0.32
- requests==2.34.2
- starlette==1.3.1
- urllib3==2.7.0
- weasyprint==69.0
- zeep==4.3.3
[v202605] - 31/05/2026¶
Ajouts¶
Cœur applicatif¶
- Serveur FastMCP Streamable HTTP, configuré via
.env. - Bootstrap automatique au démarrage : paire de clés RSA-4096, sel serveur, répertoires clients, tokens JWT, vérification de la licence.
- Synchronisation des clients avec
AUTH_CLIENTSà chaque démarrage (création / renouvellement / purge). - Endpoints HTTP :
/health,/metrics(Prometheus),/status. - Journalisation structurée (
app.logJSON +audit.logdédié).
Sécurité¶
- Déploiement air-gapped ou hybride, sans dépendance cloud.
- TLS obligatoire (auto-signé ou signé par une CA).
- Authentification client : tokens bearer RS256, mode JWT ou OAuth2 Client Credentials (avec PKCE).
- RBAC avec profils
admin/operator/auditor, personnalisables par client. - Isolation des données par client ; identifiants chiffrés par une clé Fernet dédiée (PBKDF2-SHA512).
- Piste d'audit JSON complète avec assainissement des caractères de contrôle.
- Durcissement transport : HTTPS, protection DNS rebinding, validation Host/Origin/Content-Type.
- Vérification d'empreinte SSH + certificat HTTPS avant toute connexion Cisco UC.
- Validation Pydantic sur toutes les entrées d'outils MCP.
- Rate limiting par client (fenêtre glissante) et détection Fail2ban par IP.
- Politique de configuration
.env-only.
Performance & Stabilité¶
- Caches LRU bornés sur les clients Zeep/WSDL.
- Réduction de la contention sur le verrou de stockage des identifiants.
Observabilité¶
- Fenêtres glissantes 24 h en mémoire, compteurs Prometheus pour les requêtes HTTP et les appels d'outils MCP.
- Lignes d'audit dédiées aux échecs (outils / ressources / prompts) avec type d'erreur et incrément de métrique.
- Redaction étendue des bundles show-tech sur tous les motifs de clés sensibles.
Licences¶
- Licences JWT signées RS256 émises hors ligne (
VALID/GRACE/EXPIRED/INVALID), liaison hostname optionnelle, watchdog en arrière-plan, inspecteur CLI autonome.
Sauvegarde & Restauration¶
- Sauvegardes chiffrées périodiques (RSA-4096 + AES-256-GCM + sidecar SHA-512), rétention locale, export SFTP optionnel.
- Script de restauration avec vérification d'intégrité et remplacement en place sécurisé.
Mise à jour¶
- Bundles de mise à jour signés (vérification RSA-PSS), prévisualisation
--dry-run, sauvegarde automatique pré-upgrade, fusion.envsans écraser les valeurs client.
Rapports¶
- Outils MCP
write_report/read_report/export_report_pdfavec sortie Markdown, 9 types de graphiques et export PDF via WeasyPrint.
CUCM¶
- Versions supportées : CUCM v14 & v15.
- 20 outils MCP répartis entre AXL, RisPort70, SSH OS Admin et accès web des téléphones.
- Prompts :
cucm/procedure,cucm/security_audit. - Ressources : 8 chapitres du guide CLI VOS et 5 chapitres du Security Guide (R15).
- À noter : capture d'écran des téléphones IP (
phone_screenshot) ; prompt d'audit de sécurité basé sur le Cisco Security Guide R15.
IMP¶
- Versions supportées : IMP v14 & v15.
- 14 outils MCP répartis entre AXL et SSH OS Admin.
- Prompts :
imp/procedure,imp/security_audit. - Ressources : 8 chapitres du guide CLI VOS et 3 chapitres du Security Guide (R15).
- À noter : même modèle RBAC et même schéma d'identifiants que CUCM.
Déploiement & Chaîne d'approvisionnement¶
Dockerfilede production (multi-stage) etdocker-compose.yml, runtime non-root durci.- Image de base et GitHub Actions épinglées par digest ; Dependabot les rafraîchit chaque semaine.
- Gestion des dépendances migrée vers
uvavecuv.lockhaché.
Documentation¶
SECURITY.mdrégénéré et aligné avec le site de documentation.- Guides de setup mis à jour pour insister sur la politique
.env-only.
Tests & CI¶
- 839+ tests unitaires, 93%+ de couverture (seuil de 90 % imposé), tests d'intégration sur CUCM réel, matrice Python 3.12 + 3.13.
- SAST Bandit, scan de secrets Gitleaks, scan d'image Trivy — tous bloquants.
- Rapport Mypy (non bloquant) et pip-audit sur les arbres de dépendances runtime + dev.
- SBOM CycloneDX signé hors ligne au moment de la release.
Dépendances¶
- bcrypt==5.0.0
- colorlog==6.10.1
- cryptography==48.0.0
- fastmcp==3.2.4
- lxml==6.1.1
- Markdown==3.10.2
- matplotlib==3.10.9
- mcp==1.27.1
- numpy==2.4.6
- paramiko==5.0.0
- Pillow==12.2.0
- prometheus_client==0.25.0
- pydantic==2.13.4
- PyJWT==2.13.0
- python-dotenv==1.2.2
- requests==2.34.2
- starlette==1.2.0
- urllib3==2.7.0
- weasyprint==68.1
- zeep==4.3.2