Files
checkbot/app/web/downtime_section.py

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,
)