Gestion de l’interface
Préambule
Quand j’ai commencé linux la première phrase qu’on peut lire dans la littérature consacrée est : « tout est dans un fichier ».
Pour la gestion de l’interface de centreon on peut dire « tout est en base » 😀
Il m’est arrivé d’avoir des données corrompues ,en arrivant chez mes clients, parce que des personnes, certainement plus intelligentes que les autres, ont crues bon d’écrire directement en base 😛
Il m’a paru donc important d’expliquer :
- Comment est gérée l’interface
- Comment sont affichés les éléments de configuration
Dans cette suite d’article nous verrons :
- Le lien entre la base de données et l’affichage des menus dans l’interface
- Comment centreon affiche les informations dans l’interface depuis les vues
- Menu Monitoring
- L’état des services avec application de filtres
- Menu Configuration
- Liste des hôtes avec les différents filtres disponibles
- Liste des services avec les différents filtres
Les forces en présence
Les fichiers
Les fichiers de mise à disposition de l’interface à apache sont présents dans le répertoire /usr/share/centreon/www du serveur web
Au premier niveau nous avons ci-dessous les répertoires les plus importants :
- include -> Code php pour afficher les différents menus
- modules -> Les différents modules opensource ou non installés
- widgets -> Code des widgets utilisés dans les customviews
Les bases de données
Tous les éléments permettant le bon fonctionnement de l’interface sont dans la database centreon. Donc on ne modifie rien dedans par une commande mysql, que ce soit par un insert, drop, update ou tout autre commande farfelue qui pour passer par la tête d’un illuminé.
On ne fait que des « select » et rien de plus.
J’espère que c’est écrit suffisamment gros pour que le message soit clair 😀
La table topology
Tout est géré depuis la table topology dont le schéma est ci-dessous :

Menu principal
Depuis l’interface
La capture ci-dessous nous comment se présente le menu principal de centreon

Depuis la base de données
Schéma
Comme pour les tables hosts et services il y a une relation hiérarchique entre les différents éléments.
Cependant nous n’avons pas de table pour les relations, tout est stocké directement dans la table.
Liste des champs pertinents :
- topology_name : Nom du menu
- topology_parent : Vide pour le menu de 1er niveau
- topology_order : Détermine l’ordre d’affichage des différents menus
Schéma

Requête
Pour cette première requête on va être au taquet tellement c’est simple 😛
SELECT topology_name,
topology_page,
topology_order
FROM centreon.topology
WHERE topology_parent IS NULL
ORDER BY topology_order;Résultat
| topology_name | topology_page | topology_order |
|---|---|---|
| Home | 1 | 10 |
| Monitoring | 2 | 20 |
| Reporting | 3 | 40 |
| Configuration | 6 | 50 |
| Administration | 5 | 60 |
Conclusion
Nous voyons maintenant le lien entre la capture et ce qui est stocké en base de données
Menu Niveau 2
Depuis l’interface
Comme le montre la capture ci-dessous les menus sont affiché dans un ordre précis et non par ordre alphabétique

Voyons maintenant comment cela se concrétise en base de données
Depuis la base de données
Dans la requête ci-dessous nous allons comprendre l’ordre d’affichage dans l’interface.
Nous allons avoir besoin de tables temporaires pour faire les jointures à l’intérieur de la table :
- M1 pour le menu principal
- M2 pour le menu de 2ème niveau
Schéma

Analyse
Ce schéma nous montre comment le lien est fait entre les menu de niveau 1 et les menus de niveau 2.
Nous aurons besoin pour comprendre les relations d’afficher :
- Le nom des menus Niveau 1 et 2
- Le lien entre les menus Niveau 1 et 2
- L’URL pour les menus n’ayant pas de niveau 3
- L’ordre d’affichage des menus
Requête complète
SELECT Menu1.topology_name AS "Menu1",
Menu1.topology_page AS "M1.page",
Menu1.topology_order AS "M1.order",
Menu2.topology_name AS "Menu2",
Menu2.topology_parent AS "M2.parent",
Menu2.topology_page AS "M2.page",
Menu2.topology_order AS "M2.order",
Menu2.topology_url AS "M2.url"
FROM centreon.topology AS Menu1
LEFT JOIN centreon.topology AS Menu2 ON Menu2.topology_parent=Menu1.topology_page
WHERE Menu1.topology_parent IS NULL
ORDER BY Menu1.topology_order, Menu2.topology_order;Requête avec filtre
SELECT DISTINCT
Menu1.topology_name AS "Menu1",
Menu1.topology_page AS "M1.page",
Menu1.topology_order AS "M1.order",
Menu2.topology_name AS "Menu2",
Menu2.topology_parent AS "M2.parent",
Menu1.topology_order AS "M2.order",
Menu2.topology_group AS "M2.group",
Menu2.topology_page AS "M2.page",
FROM centreon.topology AS Menu1
LEFT JOIN centreon.topology AS Menu2 ON Menu2.topology_parent=Menu1.topology_page
WHERE Menu1.topology_parent IS NULL
ORDER BY Menu1.topology_order, Menu2.topology_group, Menu2.topology_order, Menu2.topology_pageExplications
Décomposition de la requête :
- Nous voyons le lien entre le champ Menu2.topology_parent et Menu1.topology_page
- C’est ce qui défini l’appartenance du menu niveau 2 au menu niveau 1
- Le ORDER BY détermine l’ordre des menus
Résultat
| Menu1 | Menu2 | M2.parent | M2.order | M2.group | M2.page | topology_url |
|---|---|---|---|---|---|---|
| Home | Dashboards | 1 | 10 | 1 | 104 | /home/dashboards |
| Home | Custom Views | 1 | 10 | 1 | 103 | ./include/home/customViews/index.php |
| Monitoring | Resources Status | 2 | 20 | 1 | 200 | /monitoring/resources |
| Monitoring | Status Details | 2 | 20 | 1 | 202 | Null |
| Monitoring | Performances | 2 | 20 | 1 | 204 | Null |
| Monitoring | Downtimes | 2 | 20 | 1 | 210 | Null |
| Monitoring | Event Logs | 2 | 20 | 31 | 203 | Null |
| Reporting | Availability | 3 | 40 | 1 | 307 | Null |
| Configuration | Hosts | 6 | 50 | 1 | 601 | Null |
| Configuration | Services | 6 | 50 | 1 | 602 | Null |
| Configuration | Users | 6 | 50 | 1 | 603 | Null |
| Configuration | Commands | 6 | 50 | 1 | 608 | Null |
| Configuration | Notifications | 6 | 50 | 1 | 604 | Null |
| Configuration | SNMP Traps | 6 | 50 | 1 | 617 | Null |
| Configuration | Pollers | 6 | 50 | 1 | 609 | Null |
| Configuration | Connectors | 6 | 50 | 1 | 620 | Null |
| Configuration | Import/Export | 6 | 50 | 36 | 612 | Null |
| Configuration | Knowledge Base | 6 | 50 | 36 | 610 | Null |
| Administration | Parameters | 5 | 60 | 1 | 501 | ./include/options/oreon/myAccount/formMyAccount.php |
| Administration | ACL | 5 | 60 | 1 | 502 | Null |
| Administration | Extensions | 5 | 60 | 1 | 507 | Null |
| Administration | Authentication | 5 | 60 | 1 | 509 | /administration/authentication |
| Administration | Logs | 5 | 60 | 1 | 508 | ./include/Administration/configChangelog/viewLogs.php |
| Administration | Sessions | 5 | 60 | 1 | 504 | ./include/options/session/connected_user.php |
| Administration | Platform Status | 5 | 60 | 1 | 505 | ./include/Administration/brokerPerformance/brokerPerformance.php |
| Administration | About | 5 | 60 | 1 | 506 | /administration/about |
| Administration | Authentication Tokens | 5 | 60 | 1 | 515 | /administration/authentication-token |
| Administration | Customize Centreon | 5 | 60 | 1 | 510 | /administration/customize-centreon |
Menu Niveau 3
Depuis l’interface

Dans la capture ci-dessus nous voyons le menu niveau 3 affichant la configuration des services.
Depuis la base de données
Schéma

Analyse
Ce troisième schéma nous montre la philosophie de l’héritage des menus
Nous afficherons les mêmes champs que précédemment pour le troisième niveau de menu.
Nous n’afficherons que les menus de niveau 3 et leur héritage.
Afin de limiter le nombre de ligne nous avons vue plus haut que le menu de niveau 2 configuration -> Services avait le numéro de page 602. On va donc filtrer sur ce numéro de page comme page parente pour le menu de niveau 3
Requête
SELECT DISTINCT
Menu1.topology_name AS "Menu1",
Menu2.topology_name AS "Menu2",
Menu3.topology_name AS "Menu3",
Menu3.topology_parent AS "M3.parent",
Menu3.topology_page AS "M3.page",
Menu3.topology_order AS "M3.order",
Menu3.topology_group AS "M3.group",
Menu3.topology_url AS "M3.url"
FROM centreon.topology AS Menu1
LEFT JOIN centreon.topology AS Menu2 ON Menu2.topology_parent=Menu1.topology_page
LEFT JOIN centreon.topology AS Menu3 ON Menu3.topology_parent=Menu2.topology_page
WHERE Menu2.topology_parent IS NOT NULL
AND Menu3.topology_parent IS NOT NULL
AND Menu3.topology_page IS NOT NULL
AND Menu1.topology_name="Configuration"
ORDER BY Menu1.topology_order, Menu2.topology_group, Menu2.topology_order, Menu2.topology_page, Menu3.topology_parent, Menu3.topology_group, Menu3.topology_order, Menu3.topology_page;Explications
Nous continuons avec les liaisons entre les différents champs page/Parent
Pour limiter le nombre de lignes dans la requête nous allons filtrer :
- Sur la page configuration des services
- Sur les pages renseignées indiquant que nous somme sur un menu de niveau 3.
- Nous ne prenons que les champs url non vide
- Le champ group permet de regrouper les indicateurs dans un menu comme le montre la capture ci-dessous :

Résultat
Pour la capture ci-dessus :
| Menu1 | Menu2 | Menu3 | M2.page/M3.parent | M3.page | M3.order | M3.group | M3.url |
|---|---|---|---|---|---|---|---|
| Configuration | Services | Services by host | 602 | 60201 | 10 | 1 | ./include/configuration/configObject/service/serviceByHost.php |
| Configuration | Services | Services by host group | 602 | 60202 | 20 | 1 | ./include/configuration/configObject/service/serviceByHostGroup.php |
| Configuration | Services | Service Groups | 602 | 60203 | 30 | 1 | ./include/configuration/configObject/servicegroup/serviceGroup.php |
| Configuration | Services | Templates | 602 | 60206 | 50 | 1 | ./include/configuration/configObject/service_template_model/serviceTemplateModel.php |
| Configuration | Services | Categories | 602 | 60209 | 90 | 1 | ./include/configuration/configObject/service_categories/serviceCategories.php |
| Configuration | Services | Meta Services | 602 | 60204 | 40 | 2 | ./include/configuration/configObject/meta_service/metaService.php |
| Configuration | Services | Scan | 602 | 60210 | 15 | 8 | ./modules/centreon-autodiscovery-server/views/scan/index.php |
| Configuration | Services | Rules | 602 | 60215 | 18 | 8 | ./modules/centreon-autodiscovery-server/views/rules/index.php |
| Configuration | Services | Overview | 602 | 60214 | 20 | 8 | ./modules/centreon-autodiscovery-server/views/overview/index.php |
Pour les éléments de configuration :
| Menu1 | Menu2 | Menu3 | M3.parent | M3.page | M3.order | M3.group | M3.url |
|---|---|---|---|---|---|---|---|
| Configuration | Hosts | Hosts | 601 | 60101 | 10 | 1 | ./include/configuration/configObject/host/host.php |
| Configuration | Hosts | Host Groups | 601 | 60102 | 20 | 1 | /configuration/hosts/groups |
| Configuration | Hosts | Templates | 601 | 60103 | 30 | 1 | ./include/configuration/configObject/host_template_model/hostTemplateModel.php |
| Configuration | Hosts | Categories | 601 | 60104 | 40 | 1 | ./include/configuration/configObject/host_categories/hostCategories.php |
| Configuration | Hosts | Discovery | 601 | 60130 | 300 | 1 | /configuration/hosts/discovery/jobs |
| Configuration | Services | Services by host | 602 | 60201 | 10 | 1 | ./include/configuration/configObject/service/serviceByHost.php |
| Configuration | Services | Services by host group | 602 | 60202 | 20 | 1 | ./include/configuration/configObject/service/serviceByHostGroup.php |
| Configuration | Services | Service Groups | 602 | 60203 | 30 | 1 | ./include/configuration/configObject/servicegroup/serviceGroup.php |
| Configuration | Services | Templates | 602 | 60206 | 50 | 1 | ./include/configuration/configObject/service_template_model/serviceTemplateModel.php |
| Configuration | Services | Categories | 602 | 60209 | 90 | 1 | ./include/configuration/configObject/service_categories/serviceCategories.php |
| Configuration | Services | Meta Services | 602 | 60204 | 40 | 2 | ./include/configuration/configObject/meta_service/metaService.php |
| Configuration | Services | Scan | 602 | 60210 | 15 | 8 | ./modules/centreon-autodiscovery-server/views/scan/index.php |
| Configuration | Services | Rules | 602 | 60215 | 18 | 8 | ./modules/centreon-autodiscovery-server/views/rules/index.php |
| Configuration | Services | Overview | 602 | 60214 | 20 | 8 | ./modules/centreon-autodiscovery-server/views/overview/index.php |
| Configuration | Users | Contacts / Users | 603 | 60301 | 10 | 1 | ./include/configuration/configObject/contact/contact.php |
| Configuration | Users | Contact Templates | 603 | 60306 | 13 | 1 | ./include/configuration/configObject/contact_template_model/contact_template.php |
| Configuration | Users | Contact Groups | 603 | 60302 | 20 | 1 | ./include/configuration/configObject/contactgroup/contactGroup.php |
| Configuration | Users | Time Periods | 603 | 60304 | 40 | 1 | ./include/configuration/configObject/timeperiod/timeperiod.php |
| Configuration | Commands | Checks | 608 | 60801 | 10 | 1 | ./include/configuration/configObject/command/command.php |
| Configuration | Commands | Notifications | 608 | 60802 | 20 | 1 | ./include/configuration/configObject/command/command.php |
| Configuration | Commands | Discovery | 608 | 60807 | 21 | 1 | ./include/configuration/configObject/command/command.php |
| Configuration | Commands | Miscellaneous | 608 | 60803 | 30 | 1 | ./include/configuration/configObject/command/command.php |
| Configuration | Commands | Connectors | 608 | 60806 | 60 | 3 | ./include/configuration/configObject/connector/connector.php |
| Configuration | Notifications | Notifications | 604 | 60413 | 1 | 1 | /configuration/notifications |
| Configuration | Notifications | Escalations | 604 | 60401 | 10 | 1 | ./include/configuration/configObject/escalation/escalation.php |
| Configuration | Notifications | Hosts | 604 | 60407 | 10 | 2 | ./include/configuration/configObject/host_dependency/hostDependency.php |
| Configuration | Notifications | Host Groups | 604 | 60408 | 20 | 2 | ./include/configuration/configObject/hostgroup_dependency/hostGroupDependency.php |
| Configuration | Notifications | Services | 604 | 60409 | 30 | 2 | ./include/configuration/configObject/service_dependency/serviceDependency.php |
| Configuration | Notifications | Service Groups | 604 | 60410 | 40 | 2 | ./include/configuration/configObject/servicegroup_dependency/serviceGroupDependency.php |
| Configuration | Notifications | Meta Services | 604 | 60411 | 50 | 2 | ./include/configuration/configObject/metaservice_dependency/MetaServiceDependency.php |
| Configuration | SNMP Traps | SNMP Traps | 617 | 61701 | 10 | 1 | ./include/configuration/configObject/traps/traps.php |
| Configuration | SNMP Traps | Manufacturer | 617 | 61702 | 20 | 1 | ./include/configuration/configObject/traps-manufacturer/mnftr.php |
| Configuration | SNMP Traps | Group | 617 | 61705 | 25 | 1 | ./include/configuration/configObject/traps-groups/groups.php |
| Configuration | SNMP Traps | MIBs | 617 | 61703 | 30 | 1 | ./include/configuration/configObject/traps-mibs/mibs.php |
| Configuration | SNMP Traps | Generate | 617 | 61704 | 40 | 1 | ./include/configuration/configGenerateTraps/generateTraps.php |
| Configuration | Pollers | Pollers | 609 | 60901 | 10 | 1 | ./include/configuration/configServers/servers.php |
| Configuration | Pollers | Export configuration | 609 | 60902 | 10 | 1 | ./include/configuration/configGenerate/generateFiles.php |
| Configuration | Pollers | Engine configuration | 609 | 60903 | 30 | 1 | ./include/configuration/configNagios/nagios.php |
| Configuration | Pollers | Broker configuration | 609 | 60909 | 35 | 1 | ./include/configuration/configCentreonBroker/centreon-broker.php |
| Configuration | Pollers | Resources | 609 | 60904 | 40 | 1 | ./include/configuration/configResources/resources.php |
| Configuration | Pollers | Agent configurations | 609 | 60905 | 50 | 1 | /configuration/pollers/agent-configurations |
| Configuration | Connectors | Monitoring Connectors | 620 | 62001 | 70 | 1 | ./modules/centreon-pp-manager/core/manager/main.php |
| Configuration | Connectors | Additional Configurations | 620 | 62002 | 91 | 1 | /configuration/additional-connector-configurations |
| Configuration | Import/Export | Export | 612 | 61201 | 5 | 36 | ./modules/centreon-awie/core/formExporter.php |
| Configuration | Import/Export | Import | 612 | 61202 | 6 | 36 | ./modules/centreon-awie/core/formImporter.php |
| Configuration | Knowledge Base | Hosts | 610 | 61001 | 5 | 36 | ./include/configuration/configKnowledge/display-hosts.php |
| Configuration | Knowledge Base | Services | 610 | 61002 | 10 | 36 | ./include/configuration/configKnowledge/display-services.php |
| Configuration | Knowledge Base | Host Templates | 610 | 61003 | 15 | 36 | ./include/configuration/configKnowledge/display-hostTemplates.php |
| Configuration | Knowledge Base | Service Templates | 610 | 61004 | 20 | 36 | ./include/configuration/configKnowledge/display-serviceTemplates.php |
Construction des URL
Type de page
Nous avons plusieurs types d’URL :
- Pour afficher une page
- Pour afficher un objet via un id
- Pour afficher un objet via un nom
L’affichage d’une page
Dans la requête php centreon envoie le numéro de page par l’appel :
- p=<numéro de page>
- dans notre requête précédente le champ M3.page
- Pour afficher la page de configuration des services l’URL devient :
- https://<Adresse du site>/centreon/main.php?p=60201
Donc il suffit de renseigner après le ‘p=’ pour indiquer quelle page afficher
Recherche de la page php sur le serveur
Comme nous l’avons vu plus haut la table topology contient un champ url.
Ce plutôt le chemin vers le fichier php pour afficher la page recherchée
Pour la configuration des services :
- ./include/configuration/configObject/service/serviceByHost.php
C’est le lien entre l’URL avec le numéro de page et chemin complet sur le serveur de la page php.
Configuration d’apache
Define base_uri "/centreon"
Define install_dir "/usr/share/centreon"
Alias ${base_uri} ${install_dir}/www/Ce qu’il faut comprendre :
- L’url de base pour le site c’est /centreon
- Le chemin d’accès au site est /usr/share/centreon
- Le l’URL https://<Site> /centreon correspond sur le serveur au chemin /usr/share/centreon/www
Chemin du fichier sur le serveur
Le chemin relatif ./include/configuration/configObject/service/serviceByHost.php indique que le fichier php est dans le répertoire correspondant à l’alias d’apache ${base_uri}.
Ce qui nous donne le chemin complet :
- ${base_uri} pour /usr/share/centreon/www
- L’emplacement du fichier : ./include/configuration/configObject/service/serviceByHost.php
- Ce qui nous donne le chemin absolu : /usr/share/centreon/www/include/configuration/configObject/service/serviceByHost.php sur le serveur.
Configuration d’un objet
Nous avons vu plus haut que le p= dans l’url indique une page. Dans un souci de logique pour un objet ce sera un o= 😀
Pour configurer un service par exemple :
- p=60201 Configuration de service
- o=c& contiendra le type d’objet
- service_id, acl_group_id, …
- 10818 pour le service App-Monitoring-Centreon-Broker-RRD-Stats-Central dans mon cas
- Nous obtenons une url du type pour configurer le service App-Monitoring-Centreon-Broker-RRD-Stats-Central ayant l’ID dans la table centreon.service 10818 : https://<Site>/centreon/main.php?p=60201&o=c&service_id=10818
Pour les menu de deuxième niveau n’ayant de sous menu seul le numéro de page est renseigné par exemple l’URL https://<Site>/centreon/main.php?p=508 renvoie vers la page des logs de modification des objets de configuration.
Conclusion
Je n’ai pas abordé toutes les façons dont centreon génère les URL et faie le lien entre les base, l’affichage des interfaces, le chemin sur le serveur.
Il est toujours intéressant de regarder le fonctionnement du moteur de l’outil pour comprendre ce qu’il fait et pouvoir identifier la cause d’un disfonctionnement quand il se produit.
Dans la démarche déterminer la cause d’une panne :
- On regarde en base : On ne fait que des « select »
- On regarde comment est construit l’arborescence du site
- Pb de droits
- Eventuellement voir les requêtes qui sont lancées
- On contrôle les fichiers de configuration dans le répertoire /etc
- On vérifie l’état des services
- On contrôle les logs
Je ne doute pas qu’en ayant fait le tour de tout ça, on devrait être en capacité d’identifier la root cause d’un disfonctionnement de l’outil.


