64 lines
2.9 KiB
Python
64 lines
2.9 KiB
Python
import re
|
|
|
|
from ..constants import (CHECKMK_CA_FILE, CHECKMK_DT_ENABLED, CHECKMK_DT_MAX_HOURS, CHECKMK_DT_SECRET,
|
|
CHECKMK_DT_USER, CHECKMK_SITE, CHECKMK_URL, CHECKMK_VERIFY_TLS, DEFAULT_DT_MAX_HOURS,
|
|
DT_MAX_HOURS_CEILING, FLAG_OFF, FLAG_ON)
|
|
from ..downtime import CheckmkDowntimeClient
|
|
from .sections import Field, Section
|
|
|
|
SLUG = "checkmk_dt"
|
|
NOTICE = ("Achtung: Das ist die einzige Funktion, die in Checkmk schreibt. Mit /downtime bzw. !downtime setzen "
|
|
"Allowlist-User nach Bestätigung echte Downtimes. Nutze dafür einen eigenen Checkmk-User, der nur "
|
|
"Downtimes setzen darf. KI und Agent haben darauf keinen Zugriff.")
|
|
USER_RE = re.compile(r"^\S+$")
|
|
|
|
|
|
def validate(values: dict) -> list[str]:
|
|
errors = []
|
|
user = values.get(CHECKMK_DT_USER, "")
|
|
if values.get(CHECKMK_DT_ENABLED) == FLAG_ON:
|
|
if not user:
|
|
errors.append("Downtime-User fehlt.")
|
|
if not values.get(CHECKMK_DT_SECRET):
|
|
errors.append("Downtime-Secret fehlt.")
|
|
if user and not USER_RE.match(user):
|
|
errors.append("Downtime-User darf keine Leerzeichen enthalten.")
|
|
hours = values.get(CHECKMK_DT_MAX_HOURS, "").strip()
|
|
if hours and not (hours.isdecimal() and 1 <= int(hours) <= DT_MAX_HOURS_CEILING):
|
|
errors.append(f"Maximaldauer muss eine ganze Zahl zwischen 1 und {DT_MAX_HOURS_CEILING} Stunden sein.")
|
|
return errors
|
|
|
|
|
|
async def test_connection(values: dict) -> str:
|
|
if not (values.get(CHECKMK_URL) and values.get(CHECKMK_SITE)):
|
|
raise ValueError("Checkmk-URL und Site fehlen, bitte zuerst Checkmk einrichten.")
|
|
if not (values.get(CHECKMK_DT_USER) and values.get(CHECKMK_DT_SECRET)):
|
|
raise ValueError("Downtime-User oder Secret fehlt.")
|
|
verify: bool | str = False if values.get(CHECKMK_VERIFY_TLS) == FLAG_OFF else (values.get(CHECKMK_CA_FILE) or True)
|
|
client = CheckmkDowntimeClient(values[CHECKMK_URL], values[CHECKMK_SITE], values[CHECKMK_DT_USER],
|
|
values[CHECKMK_DT_SECRET], verify=verify)
|
|
try:
|
|
info = await client.version()
|
|
finally:
|
|
await client.aclose()
|
|
return f"Anmeldung als Downtime-User ok, Checkmk {info.get('versions', {}).get('checkmk', '?')} (nur lesend geprüft)"
|
|
|
|
|
|
SECTION = Section(
|
|
slug=SLUG,
|
|
title="Checkmk Downtime",
|
|
fields=(
|
|
Field(CHECKMK_DT_ENABLED, "Downtime per Chat erlauben", kind="checkbox", default=FLAG_OFF),
|
|
Field(CHECKMK_DT_USER, "Downtime-User (Automation)"),
|
|
Field(CHECKMK_DT_SECRET, "Downtime-Secret", kind="password", secret=True),
|
|
Field(CHECKMK_DT_MAX_HOURS, "Maximaldauer in Stunden", default=str(DEFAULT_DT_MAX_HOURS),
|
|
placeholder=f"1 bis {DT_MAX_HOURS_CEILING}"),
|
|
),
|
|
validate=validate,
|
|
test=test_connection,
|
|
optional=True,
|
|
enabled_key=CHECKMK_DT_ENABLED,
|
|
context_keys=(CHECKMK_URL, CHECKMK_SITE, CHECKMK_CA_FILE, CHECKMK_VERIFY_TLS),
|
|
notice=NOTICE,
|
|
)
|