Interface

  • 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.

  • Database centreon-storage

    Avant-propos

    Il est important de comprendre que la database centreon_storage est la table du temps réel.

    Toutes les données affichées dans la console en dehors des vues configuration et administration proviennent de cette database.

    Il y a un lien entre les databases centreon et centeon_storage ce sont les ID pour :

    • Les hôtes
    • Les différents regroupements
    • Services
    • Hosts
    • Services

    Donc tous les vues temps réel s’appuient sur cette database en utilisant la durée de rétention pour afficher l’historique dans les différentes vues.

    La structure de la database est sensiblement identique à celle de centreon.

    Pour faire un raccourci dans la database centreon les tables sont au singulier et dans centreon-storage au pluriel.

    Ainsi par exemple les tables on peut faire les relations suivantes :

    centreoncentreon_storage
    acl_group_contactgroups_relationscentreon_acl
    hosthosts
    hostgrouphostgroups
    host_service_relation 
    host_template_relation 
    Hostcategories 
    hostcategories_relation 
    hostgroup_hg_relation 
    hostgroup_relationhosts_hostgroups
    dependency 
    dependency_hostChild_relationhosts_hosts_dependencies
    dependency_hostParent_relation 
    host_service_relation 
    host_hostparent_relationhosts_hosts_parents
    servicegroupservicegroups
    serviceservices
    servicegroup_relationservices_servicegroups
    dependency_serviceParent_relationservices_services_dependencies
    dependency_serviceChild_relation 
    dependency_servicegroupChild_relation 
    dependency_servicegroupParent_relation 
    service_categories 
    service_categories_relation 
    nagios_serverinstances

    Nous pouvons noter que certaines tables n’existent pas dans cetreon_storage. Donc la console aura besoin des 2 databases pour afficher les informations dans la console.

    Lire la suite« Database centreon-storage »