Hallo,
ich habe ein Plugin geschrieben um den HTTP-Status-Code und die restliche Gültigkeit des hinterlegte Zertifikats zu überwachen. In einem Service werden immer mehrere URLs geprüft.
Für die Berechnung der Restdauer verwende ich die Funktion check_levels mit render.timespan.
Das Plugin arbeitet wie es soll.
Lediglich die Informationen der Summary und Details zeigen nicht die aktuelle Restlaufzeit. Wenn sich der Status ändert wird Restlaufzeit des Zertifikats korrekt angegeben aber anschließend ändern sich die Informationen nicht mehr.
Der dargestellte Text ist wie eingefroren.
Ich habe bereits einmal die Prüfung mittels check_levels entfernt und nur die verbleibenden Sekunden ausgeben lassen - mit dem selben Ergebnis.
Kann mir jemand sagen, ob das Verhalten so richtig ist oder habe ich ein Fehler im Code?
Beispielhafter Agent-Output
URL1 True|https://url1.org 200 20240816061731Z
URL2 True|https://url2.org 200 20240816061731Z
Agent Based Plugin
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from .agent_based_api.v1 import Service, Result, State, register, render, check_levels
from datetime import datetime
today = datetime.now()
# Erzeugung des Service.
def discover_url_ssl_check(section):
yield Service()
# Rückgabe der festgelegten Parameter für die URL-Kurzbzeichnung
# Wurde für die Kurzbezeichnung keine Parameter festgelegt, werden die Standardwerte verwendet
def _get_parameters_for_url(url_description: str, parameters: list) -> list:
# Standardwerte
result = {
"valid_http_codes": ["200"],
"levels_ssl_expiration": (5184000, 2592000) # WARN ab 60 Tage; CRIT ab 30 Tage
}
for description, valid_http_codes, levels_ssl_expiration in parameters:
if url_description == description:
result["valid_http_codes"] = valid_http_codes
result["levels_ssl_expiration"] = levels_ssl_expiration
return result
# Erzeugung der Stati für die URL-Kurzbezeichnung
def _get_state_of_url(url_informations: list, params: dict):
url_description = url_informations[0]
url_validation_infos = url_informations[1].split("|")
url_is_valid = url_validation_infos[0] == "True"
url = url_validation_infos[1]
url_status_code = url_informations[2]
parameters_for_url = _get_parameters_for_url(url_description, params["url_check_parameters"])
valid_http_codes = parameters_for_url["valid_http_codes"]
if url_is_valid:
ssl_expiration_date = datetime.strptime(url_informations[3][:-1], '%Y%m%d%H%M%S')
seconds_until_ssl_expiration = (ssl_expiration_date - today).total_seconds()
yield Result(
state = State.OK,
notice = f"{url_description}: URL ist valide",
details = f"{url_description}: URL {url} ist valide"
)
if url_status_code in valid_http_codes:
yield Result(
state = State.OK,
notice = f"{url_description}: Der HTTP-Status-Code ist gültig",
details = f"{url_description}: Der HTTP-Status-Code '{url_status_code}' ist gültig - valide Codes: {valid_http_codes}"
)
else:
yield Result(
state = State.CRIT,
summary = f"{url_description} HTTP-Status-Code ist ungültig",
details = f"{url_description}: Der HTTP-Status-Code '{url_status_code}' ist nicht einer von {valid_http_codes}"
)
yield from check_levels(
seconds_until_ssl_expiration,
levels_lower = parameters_for_url["levels_ssl_expiration"],
label = f"{url_description}: SSL-Zertifikat gültig bis {datetime.strftime(ssl_expiration_date, '%d.%m.%Y %H:%M:%S')} - Tage bis Ablauf",
render_func = render.timespan
)
else:
yield Result(
state = State.CRIT,
notice = f"{url_description}: URL ist nicht valide",
details = f"{url_description}: URL {url} ist nicht valide"
)
yield Result(
state = State.UNKNOWN,
notice = f"{url_description}: HTTP-Status-Code konnte nicht überprüft werden",
details = f"{url_description}: HTTP-Status-Code konnte nicht überprüft werden"
)
yield Result(
state = State.UNKNOWN,
notice = f"{url_description}: SSL-Zertifikat konnte nicht überprüft werden",
details = f"{url_description}: SSL-Zertifikat konnte nicht überprüft werden"
)
# Prüfung des Service.
# Für den Service wird ein "Result" erzeugt. Der endgültige Status wird mittels der konfigurierten Schwellwerte ermittelt.
def check_url_ssl_check(params, section):
for url_informations in section:
yield from _get_state_of_url(url_informations, params)
# Registrierung des Services.
register.check_plugin(
name = "url_ssl_check",
service_name = "URL_SSL_Check",
discovery_function = discover_url_ssl_check,
check_function = check_url_ssl_check,
check_ruleset_name = "URL_SSL_Check_Parameters",
check_default_parameters = { "url_check_parameters": [] } # Standardwerte sind in der Methode _get_parameters_for_url festgelegt
)