From b7a8e378a2e766736267ff6e849eb8c52c6d99b1 Mon Sep 17 00:00:00 2001 From: Benoit Poulet Date: Thu, 25 Sep 2025 12:10:44 +0200 Subject: [PATCH 1/3] Working with 3.17 No enhancement, just fixes --- Nagstamon/servers/Centreon/CentreonAPI.py | 6 +++--- Nagstamon/servers/Centreon/__init__.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Nagstamon/servers/Centreon/CentreonAPI.py b/Nagstamon/servers/Centreon/CentreonAPI.py index 168e36c3..f764afce 100644 --- a/Nagstamon/servers/Centreon/CentreonAPI.py +++ b/Nagstamon/servers/Centreon/CentreonAPI.py @@ -317,7 +317,7 @@ def _get_status(self): # filter regexep to reduce network traffic # waiting to find a solution to reverse regexp - # my first idea is + # my first idea is # begin by (^(?!(.* # ending by ))) # replace | by )))(^(?!(.* @@ -328,7 +328,7 @@ def _get_status(self): self.re_service_filter = '&search={"s.description":{"$rg":"' + str(conf.re_service_pattern) + '"}}' if conf.re_host_enabled is True and conf.re_host_reverse is True: self.re_host_filter = '&search={"h.name":{"$rg":"' + str(conf.re_host_pattern) + '"}}' - + # Services URL # https://demo.centreon.com/centreon/api/latest/monitoring/resources?page=1&limit=30&sort_by={"status_severity_code":"asc","last_status_change":"desc"}&types=["service"]&statuses=["WARNING","DOWN","CRITICAL","UNKNOWN"] url_services = self.urls_centreon[ @@ -783,7 +783,7 @@ def check_session(self): if self.centreon_version_major == 21: ressources_response_list = [401, 403, 500] else: - ressources_response_list = [401, 403] + ressources_response_list = [400, 401, 403] if result.status_code in ressources_response_list: self.token = self.get_token().result diff --git a/Nagstamon/servers/Centreon/__init__.py b/Nagstamon/servers/Centreon/__init__.py index 7e71f8d0..4a0e176f 100644 --- a/Nagstamon/servers/Centreon/__init__.py +++ b/Nagstamon/servers/Centreon/__init__.py @@ -30,14 +30,14 @@ def __init__(self, **kwds): # like all servers we need to initialize Generic GenericServer.__init__(self, **kwds) # due to not being initialized right now we need to access config directly to get this instance's config - server_conf = conf.servers.get(kwds.get('name')) - if server_conf and server_conf.enabled: + if conf.servers[self.get_name()].enabled: + self.authentication = conf.servers[self.get_name()].authentication # because auf being very early in init process the property ignore_cert is not known yet # add it here to be able to fetch URL and ignore certs if activated - self.ignore_cert = server_conf.ignore_cert - self.custom_cert_use = server_conf.custom_cert_use + self.ignore_cert = conf.servers[self.get_name()].ignore_cert + self.custom_cert_use = conf.servers[self.get_name()].custom_cert_use # This URL exists on Centreon 22.x - if not accessible it must be legacy - versions_raw = self.fetch_url(f'{server_conf.monitor_cgi_url}/api/latest/platform/versions', no_auth=True, giveback='raw') + versions_raw = self.fetch_url(f'{conf.servers[self.get_name()].monitor_cgi_url}/api/latest/platform/versions', no_auth=True, giveback='raw') self.debug(server='[' + self.get_name() + ']', debug='Status code %s' % (str(versions_raw.status_code))) if versions_raw.status_code == 200: data = json.loads(versions_raw.result) From 66f502751445dffcd6b85122702965fe6cf55c1a Mon Sep 17 00:00:00 2001 From: Benoit Poulet Date: Thu, 25 Sep 2025 14:50:38 +0200 Subject: [PATCH 2/3] Handle auth failed --- Nagstamon/servers/Centreon/CentreonAPI.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Nagstamon/servers/Centreon/CentreonAPI.py b/Nagstamon/servers/Centreon/CentreonAPI.py index f764afce..3cd9c744 100644 --- a/Nagstamon/servers/Centreon/CentreonAPI.py +++ b/Nagstamon/servers/Centreon/CentreonAPI.py @@ -169,7 +169,8 @@ def get_token(self): # check if any error occured errors_occured = self.check_for_error(data, error, status_code) if errors_occured is not None: - return (errors_occured) + self.debug(server=self.get_name(), debug="Authentication failed") + return Result(result='ERROR', error="Authentication failed") token = data["security"]["token"] # ID of the user is needed by some requests @@ -786,7 +787,11 @@ def check_session(self): ressources_response_list = [400, 401, 403] if result.status_code in ressources_response_list: - self.token = self.get_token().result + get_token_result = self.get_token() + if get_token_result.result == 'ERROR': + return Result(result='ERROR', error=get_token_result.error) + else: + self.token = get_token_result.result if conf.debug_mode: self.debug(server='[' + self.get_name() + ']', debug='Check-session, session renewed') result = self.fetch_url(self.urls_centreon['resources'] + '?' + urllib.parse.urlencode(cgi_data), From e72786fb01c28f3188bc83a30808fe4d92415227 Mon Sep 17 00:00:00 2001 From: Benoit Poulet Date: Thu, 25 Sep 2025 14:51:20 +0200 Subject: [PATCH 3/3] improved errors handling on init --- Nagstamon/servers/Centreon/__init__.py | 34 +++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Nagstamon/servers/Centreon/__init__.py b/Nagstamon/servers/Centreon/__init__.py index 4a0e176f..49b1dfe0 100644 --- a/Nagstamon/servers/Centreon/__init__.py +++ b/Nagstamon/servers/Centreon/__init__.py @@ -36,22 +36,44 @@ def __init__(self, **kwds): # add it here to be able to fetch URL and ignore certs if activated self.ignore_cert = conf.servers[self.get_name()].ignore_cert self.custom_cert_use = conf.servers[self.get_name()].custom_cert_use - # This URL exists on Centreon 22.x - if not accessible it must be legacy + # This URL exists at least from Centreon 22.x - if not accessible it must be legacy versions_raw = self.fetch_url(f'{conf.servers[self.get_name()].monitor_cgi_url}/api/latest/platform/versions', no_auth=True, giveback='raw') - self.debug(server='[' + self.get_name() + ']', debug='Status code %s' % (str(versions_raw.status_code))) + self.debug(server='[' + self.get_name() + ']', debug='Page retrieval to detect the version, status code : %s' % (str(versions_raw.status_code))) if versions_raw.status_code == 200: - data = json.loads(versions_raw.result) + try: + data = json.loads(versions_raw.result) + except Exception as e: + self.debug(server='[' + self.get_name() + ']', debug='Page retrieval to detect the version, ERROR when decoding JSON') + self.enable = False + self.isChecking = False + return None + ver_major = int(data["web"]["major"]) ver_minor = int(data["web"]["minor"]) # API V2 is usable only after 21.04 (not tested), ressources endpoint is buggy in 20.10 if ver_major >= 21: self.debug(server='[' + self.get_name() + ']', debug='Loading class API, Centreon version : ' + str(ver_major) + '.' + str(ver_minor)) from .CentreonAPI import CentreonServer as CentreonServerReal - else: + elif ver_major < 21: + # Fallback to Legacy self.debug(server='[' + self.get_name() + ']', debug='Loading class LEGACY, Centreon version : ' + str(ver_major) + '.' + str(ver_minor)) from .CentreonLegacy import CentreonServer as CentreonServerReal + else: + self.debug(server='[' + self.get_name() + ']', debug='Something wrong happens with Centreon, version detected : ' + str(ver_major) + '.' + str(ver_minor)) + self.enable = False + self.isChecking = False + return None else: - from .CentreonLegacy import CentreonServer as CentreonServerReal - self.debug(server='[' + self.get_name() + ']', debug='Loading class LEGACY, Centreon version will be checked later') + # Try to check if only it’s a Centreon + versions_raw = self.fetch_url(f'{server_conf.monitor_cgi_url}/main.php', no_auth=True, giveback='raw') + if versions_raw.status_code == 200: + from .CentreonLegacy import CentreonServer as CentreonServerReal + self.debug(server='[' + self.get_name() + ']', debug='Loading class LEGACY, Centreon version will be checked later') + else: + self.debug(server='[' + self.get_name() + ']', debug='The URL given is not a Centreon') + self.enable = False + self.isChecking = False + return None + # kind of mad but helps the servers/__init__.py to detect if there is any other class to be used self.ClassServerReal = CentreonServerReal