from datetime import datetime from typing import Sequence from ..checkmk import Downtime, ServiceState from ..models import state_name from .constants import HISTORY_LIMIT, LINE_OUTPUT_MAX, LIST_LIMIT, TS_FORMAT from .sanitize import sanitize NONE_FOUND = "Keine Einträge." def _line_text(value: object, limit: int = LINE_OUTPUT_MAX) -> str: return sanitize(value, limit, single_line=True) def _ts(value: int) -> str: return datetime.fromtimestamp(value).strftime(TS_FORMAT) if value else "unbekannt" def service_line(item: ServiceState, with_host: bool = True) -> str: name = f"{_line_text(item.host, 100)} / {_line_text(item.service, 100)}" if with_host \ else _line_text(item.service, 100) flags = [] if not item.hard: flags.append("soft") if item.in_downtime: flags.append("Downtime") if item.flapping: flags.append("flappt") suffix = f" [{', '.join(flags)}]" if flags else "" return f"{state_name(item.state)} {name}{suffix}: {_line_text(item.output)}" def format_status(item: ServiceState | None) -> str: if item is None: return "Service nicht gefunden." return f"{service_line(item)} (seit {_ts(item.last_state_change)})" def _limited(lines: list[str]) -> str: if not lines: return NONE_FOUND extra = len(lines) - LIST_LIMIT text = "\n".join(lines[:LIST_LIMIT]) return f"{text}\n... und {extra} weitere" if extra > 0 else text def format_services(items: Sequence[ServiceState], with_host: bool = True) -> str: ordered = sorted(items, key=lambda i: (-i.state, i.host, i.service)) return _limited([service_line(i, with_host) for i in ordered]) def format_history(changes: Sequence) -> str: lines = [f"{_ts(c.ts)} {state_name(c.state)}" for c in list(changes)[:HISTORY_LIMIT]] return "\n".join(lines) if lines else NONE_FOUND def format_downtimes(items: Sequence[Downtime]) -> str: lines = [] for item in items: target = _line_text(item.host, 100) + (f" / {_line_text(item.service, 100)}" if item.service else "") lines.append(f"{target}: {_line_text(item.start, 40)} bis {_line_text(item.end, 40)}, " f"{_line_text(item.comment)}") return _limited(lines)