Der Runner prüft die Checkmk-Version alle 5 Minuten und startet bei einem Wechsel sofort einen Selbsttest (Cooldown, Erstlauf ausgenommen). Die Spaltenprüfung fragt bei leerer Problemliste eine ungefilterte Stichprobe ab; leeres Checkmk gilt als nicht prüfbar, nicht als Fehler. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import asyncio
|
|
import time
|
|
from typing import Callable
|
|
|
|
from ..checkmk import CheckmkClient
|
|
from .checks import check_downtimes, check_hosts, check_services, check_version
|
|
from .model import SelftestRun
|
|
from .repository import SelftestRepository
|
|
|
|
|
|
class SelftestNotConfigured(Exception):
|
|
pass
|
|
|
|
|
|
class SelftestService:
|
|
def __init__(self, store, repo: SelftestRepository,
|
|
client_factory: Callable[[object], CheckmkClient | None] = CheckmkClient.from_settings,
|
|
clock: Callable[[], float] = time.time):
|
|
self._store = store
|
|
self._repo = repo
|
|
self._client_factory = client_factory
|
|
self._clock = clock
|
|
|
|
def last_run(self) -> SelftestRun | None:
|
|
return self._repo.last_run()
|
|
|
|
async def peek_version(self) -> str | None:
|
|
client = self._client_factory(self._store)
|
|
if client is None:
|
|
return None
|
|
try:
|
|
_, version = await check_version(client)
|
|
finally:
|
|
await client.aclose()
|
|
return version or None
|
|
|
|
async def run(self) -> SelftestRun:
|
|
client = self._client_factory(self._store)
|
|
if client is None:
|
|
raise SelftestNotConfigured
|
|
try:
|
|
version_check, version = await check_version(client)
|
|
services_check, services = await check_services(client)
|
|
hosts_check, hosts = await check_hosts(client)
|
|
downtimes_check = await check_downtimes(client, services, hosts)
|
|
finally:
|
|
await client.aclose()
|
|
previous = await asyncio.to_thread(self._repo.last_run)
|
|
version_changed = bool(previous and previous.version and version and previous.version != version)
|
|
run = SelftestRun(int(self._clock()), version,
|
|
[version_check, services_check, hosts_check, downtimes_check], version_changed)
|
|
await asyncio.to_thread(self._repo.save_run, run)
|
|
return run
|