Files
FabledSteward/plugins/syslog/__init__.py
T
bvandeusenandClaude Opus 5.5 dadec4e355
CI / lint (push) Successful in 2s
CI / unit (push) Successful in 1m29s
CI / integration (push) Successful in 1m36s
CI / publish (push) Successful in 1m6s
feat(syslog): a source's lines to read and search, on its page, its host's and its SNMP device's, and over MCP (#6000)
- /plugins/syslog/sources/<id>: the lines newest first, loading as you
  scroll, filtered by severity and worse, app, text and time, with day
  dividers and times to the second in the reader's zone.
- The Syslog page links each source and shows its lines in the last hour.
- A Syslog panel on a host's page and an SNMP device's: the newest lines of
  the sources bound to it or at its address.
- MCP: list_syslog_sources and search_syslog (source, host, text, severity
  and worse, app, range, paging by next_before).
- Shared: escape_like moves to steward/core/like.py and cut_middle to the
  MCP shaping module, replacing four inline copies; |when takes seconds=.

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

46 lines
1.2 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, 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 .receiver import make_receive_task
from .retention import make_prune_task
return [make_receive_task(_app), make_prune_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)
def get_audit_entities() -> dict:
"""Audit rows about a source name it and link to the Syslog page."""
from .models import SyslogSource
return {"syslog_source": (SyslogSource, "/plugins/syslog/sources/{}")}