Summary und Details aktualisieren sich nicht

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
)

Ich habe das Problem gefunden. Im dem Agendt Based Plugin wollte ich den aktuellen Tag nur einmal abfragen und dann für die verschiedenen URLs wiederverwenden. Daher habe ich today als globale Variable angelegt.

Die Variable wurde allerdings nicht, wie angenommen, bei jeder Ausführung neu initialisiert. Lediglich bei einem Statuswechsel passierte dies.

Um das Problem zu lösen habe ich die Variable in die Methode check_url_ssl_check umgezogen. Nun wird die Summary und Details im Service immer entsprechend aktualisiert - auch ohne Statuswechsel.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed. Contact an admin if you think this should be re-opened.