Files
FabledSteward/plugins/syslog/__init__.py
T
bvandeusenandClaude Opus 5.5 521d84f318
CI / lint (push) Successful in 2s
CI / unit (push) Successful in 1m29s
CI / integration (push) Successful in 1m37s
CI / publish (push) Successful in 1m9s
feat(syslog): lines beside the readings: around an anomaly, in get_anomaly, and marked on host and SNMP charts (#6002)
get_anomaly's circumstances gain the host's or SNMP device's syslog
warnings and worse (mcp_events / mcp_resource_events). An anomaly row opens
"Syslog around it", read only when opened. A shared Chart.js plugin
(chart-marks.js) draws a dashed line at each syslog error on the host
metrics charts and an SNMP device's charts, with a line saying how many.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 06:36:31 -04:00

64 lines
2.0 KiB
Python

# plugins/syslog/__init__.py
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from quart import Quart
_app: "Quart | None" = None
def setup(app: "Quart") -> None:
global _app
_app = app
from .models import SyslogLine, SyslogPattern, SyslogSource # noqa: F401 — registers the tables
from .receiver import close
# The listener is bound by the receive task, so it follows the settings
# and starts on a live enable too; it is closed with the app.
app.after_serving(close)
def get_scheduled_tasks() -> list:
from .patterns import make_count_task
from .receiver import make_receive_task
from .retention import make_prune_task
return [make_receive_task(_app), make_prune_task(_app), make_count_task(_app)]
def get_blueprint():
from .routes import syslog_bp
return syslog_bp
def get_nav() -> list[dict]:
return [{"label": "Syslog", "href": "/plugins/syslog/"}]
def register_mcp_tools(register) -> None:
from .mcp_tools import register_tools
register_tools(register)
async def mcp_events(db, host_id: str, host_name: str, since, until) -> list[dict]:
from .mcp_tools import mcp_events as events
return await events(db, host_id, host_name, since, until)
async def mcp_resource_events(db, source: str, resource: str, since, until) -> list[dict]:
from .mcp_tools import mcp_resource_events as events
return await events(db, source, resource, since, until)
def get_alert_metrics() -> dict[str, list[str]]:
"""A pattern's count is named for the pattern (lines_matching_<key>), so
the list is empty here and the rule form offers the counts recorded so far."""
return {"syslog": []}
def get_audit_entities() -> dict:
"""Audit rows about a source or a pattern name it and link to its page."""
from .models import SyslogPattern, SyslogSource
return {"syslog_source": (SyslogSource, "/plugins/syslog/sources/{}"),
"syslog_pattern": (SyslogPattern, "/plugins/syslog/patterns/{}/edit")}