diff --git a/Nagstamon/servers/Centreon/CentreonAPI.py b/Nagstamon/servers/Centreon/CentreonAPI.py index 168e36c3..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 @@ -317,7 +318,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 +329,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,10 +784,14 @@ 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 + 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), diff --git a/Nagstamon/servers/Centreon/__init__.py b/Nagstamon/servers/Centreon/__init__.py index 7e71f8d0..49b1dfe0 100644 --- a/Nagstamon/servers/Centreon/__init__.py +++ b/Nagstamon/servers/Centreon/__init__.py @@ -30,28 +30,50 @@ 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 - # 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') - self.debug(server='[' + self.get_name() + ']', debug='Status code %s' % (str(versions_raw.status_code))) + 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 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='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