Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions Nagstamon/servers/Centreon/CentreonAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 )))(^(?!(.*
Expand All @@ -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[
Expand Down Expand Up @@ -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),
Expand Down
44 changes: 33 additions & 11 deletions Nagstamon/servers/Centreon/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading