| | | |

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_nametopology_pagetopology_order
Home110
Monitoring220
Reporting340
Configuration650
Administration560

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_page

Explications

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

Menu1Menu2M2.parentM2.orderM2.groupM2.pagetopology_url
HomeDashboards1101104/home/dashboards
HomeCustom Views1101 103./include/home/customViews/index.php
MonitoringResources Status2201200/monitoring/resources
MonitoringStatus Details2201202 Null
MonitoringPerformances2201204  Null
MonitoringDowntimes2201210  Null
MonitoringEvent Logs22031203  Null
ReportingAvailability3401307  Null
ConfigurationHosts6501601  Null
ConfigurationServices6501602  Null
ConfigurationUsers6501603  Null
ConfigurationCommands6501608  Null
ConfigurationNotifications6501604  Null
ConfigurationSNMP Traps6501617  Null
ConfigurationPollers6501609  Null
ConfigurationConnectors6501620  Null
ConfigurationImport/Export65036612  Null
ConfigurationKnowledge Base65036610  Null
AdministrationParameters5601501./include/options/oreon/myAccount/formMyAccount.php
AdministrationACL5601502  Null
AdministrationExtensions5601507  Null
AdministrationAuthentication5601509/administration/authentication
AdministrationLogs5601508./include/Administration/configChangelog/viewLogs.php
AdministrationSessions5601504./include/options/session/connected_user.php
AdministrationPlatform Status5601505./include/Administration/brokerPerformance/brokerPerformance.php
AdministrationAbout5601506/administration/about
AdministrationAuthentication Tokens5601515/administration/authentication-token
AdministrationCustomize Centreon5601510/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 :

Menu1Menu2Menu3M2.page/M3.parentM3.pageM3.orderM3.groupM3.url
ConfigurationServicesServices by host60260201101./include/configuration/configObject/service/serviceByHost.php
ConfigurationServicesServices by host group60260202201./include/configuration/configObject/service/serviceByHostGroup.php
ConfigurationServicesService Groups60260203301./include/configuration/configObject/servicegroup/serviceGroup.php
ConfigurationServicesTemplates60260206501./include/configuration/configObject/service_template_model/serviceTemplateModel.php
ConfigurationServicesCategories60260209901./include/configuration/configObject/service_categories/serviceCategories.php
ConfigurationServicesMeta Services60260204402./include/configuration/configObject/meta_service/metaService.php
ConfigurationServicesScan60260210158./modules/centreon-autodiscovery-server/views/scan/index.php
ConfigurationServicesRules60260215188./modules/centreon-autodiscovery-server/views/rules/index.php
ConfigurationServicesOverview60260214208./modules/centreon-autodiscovery-server/views/overview/index.php

Pour les éléments de configuration :

Menu1Menu2Menu3M3.parentM3.pageM3.orderM3.groupM3.url
ConfigurationHostsHosts60160101101./include/configuration/configObject/host/host.php
ConfigurationHostsHost Groups60160102201/configuration/hosts/groups
ConfigurationHostsTemplates60160103301./include/configuration/configObject/host_template_model/hostTemplateModel.php
ConfigurationHostsCategories60160104401./include/configuration/configObject/host_categories/hostCategories.php
ConfigurationHostsDiscovery601601303001/configuration/hosts/discovery/jobs
ConfigurationServicesServices by host60260201101./include/configuration/configObject/service/serviceByHost.php
ConfigurationServicesServices by host group60260202201./include/configuration/configObject/service/serviceByHostGroup.php
ConfigurationServicesService Groups60260203301./include/configuration/configObject/servicegroup/serviceGroup.php
ConfigurationServicesTemplates60260206501./include/configuration/configObject/service_template_model/serviceTemplateModel.php
ConfigurationServicesCategories60260209901./include/configuration/configObject/service_categories/serviceCategories.php
ConfigurationServicesMeta Services60260204402./include/configuration/configObject/meta_service/metaService.php
ConfigurationServicesScan60260210158./modules/centreon-autodiscovery-server/views/scan/index.php
ConfigurationServicesRules60260215188./modules/centreon-autodiscovery-server/views/rules/index.php
ConfigurationServicesOverview60260214208./modules/centreon-autodiscovery-server/views/overview/index.php
ConfigurationUsersContacts / Users60360301101./include/configuration/configObject/contact/contact.php
ConfigurationUsersContact Templates60360306131./include/configuration/configObject/contact_template_model/contact_template.php
ConfigurationUsersContact Groups60360302201./include/configuration/configObject/contactgroup/contactGroup.php
ConfigurationUsersTime Periods60360304401./include/configuration/configObject/timeperiod/timeperiod.php
ConfigurationCommandsChecks60860801101./include/configuration/configObject/command/command.php
ConfigurationCommandsNotifications60860802201./include/configuration/configObject/command/command.php
ConfigurationCommandsDiscovery60860807211./include/configuration/configObject/command/command.php
ConfigurationCommandsMiscellaneous60860803301./include/configuration/configObject/command/command.php
ConfigurationCommandsConnectors60860806603./include/configuration/configObject/connector/connector.php
ConfigurationNotificationsNotifications6046041311/configuration/notifications
ConfigurationNotificationsEscalations60460401101./include/configuration/configObject/escalation/escalation.php
ConfigurationNotificationsHosts60460407102./include/configuration/configObject/host_dependency/hostDependency.php
ConfigurationNotificationsHost Groups60460408202./include/configuration/configObject/hostgroup_dependency/hostGroupDependency.php
ConfigurationNotificationsServices60460409302./include/configuration/configObject/service_dependency/serviceDependency.php
ConfigurationNotificationsService Groups60460410402./include/configuration/configObject/servicegroup_dependency/serviceGroupDependency.php
ConfigurationNotificationsMeta Services60460411502./include/configuration/configObject/metaservice_dependency/MetaServiceDependency.php
ConfigurationSNMP TrapsSNMP Traps61761701101./include/configuration/configObject/traps/traps.php
ConfigurationSNMP TrapsManufacturer61761702201./include/configuration/configObject/traps-manufacturer/mnftr.php
ConfigurationSNMP TrapsGroup61761705251./include/configuration/configObject/traps-groups/groups.php
ConfigurationSNMP TrapsMIBs61761703301./include/configuration/configObject/traps-mibs/mibs.php
ConfigurationSNMP TrapsGenerate61761704401./include/configuration/configGenerateTraps/generateTraps.php
ConfigurationPollersPollers60960901101./include/configuration/configServers/servers.php
ConfigurationPollersExport configuration60960902101./include/configuration/configGenerate/generateFiles.php
ConfigurationPollersEngine configuration60960903301./include/configuration/configNagios/nagios.php
ConfigurationPollersBroker configuration60960909351./include/configuration/configCentreonBroker/centreon-broker.php
ConfigurationPollersResources60960904401./include/configuration/configResources/resources.php
ConfigurationPollersAgent configurations60960905501/configuration/pollers/agent-configurations
ConfigurationConnectorsMonitoring Connectors62062001701./modules/centreon-pp-manager/core/manager/main.php
ConfigurationConnectorsAdditional Configurations62062002911/configuration/additional-connector-configurations
ConfigurationImport/ExportExport61261201536./modules/centreon-awie/core/formExporter.php
ConfigurationImport/ExportImport61261202636./modules/centreon-awie/core/formImporter.php
ConfigurationKnowledge BaseHosts61061001536./include/configuration/configKnowledge/display-hosts.php
ConfigurationKnowledge BaseServices610610021036./include/configuration/configKnowledge/display-services.php
ConfigurationKnowledge BaseHost Templates610610031536./include/configuration/configKnowledge/display-hostTemplates.php
ConfigurationKnowledge BaseService Templates610610042036./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.