diff --git a/plugins/docker/migrations/env.py b/plugins/docker/migrations/env.py
index 5c20755..3878d67 100644
--- a/plugins/docker/migrations/env.py
+++ b/plugins/docker/migrations/env.py
@@ -13,8 +13,8 @@ from alembic import context
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
-from fabledscryer.models.base import Base
-import fabledscryer.models # noqa: F401
+from steward.models.base import Base
+import steward.models # noqa: F401
from plugins.docker.models import DockerContainer, DockerMetric # noqa: F401
config = context.config
@@ -26,14 +26,14 @@ target_metadata = Base.metadata
def _get_url() -> str:
import yaml
- cfg_path = os.environ.get("FABLEDSCRYER_CONFIG", "config.yaml")
+ cfg_path = os.environ.get("STEWARD_CONFIG", "config.yaml")
try:
with open(cfg_path) as f:
cfg = yaml.safe_load(f) or {}
url = cfg.get("database", {}).get("url", "")
except FileNotFoundError:
url = ""
- return os.environ.get("FABLEDSCRYER_DATABASE__URL", url)
+ return os.environ.get("STEWARD_DATABASE__URL", url)
def run_migrations_offline() -> None:
diff --git a/plugins/docker/models.py b/plugins/docker/models.py
index 09c1cf3..bec356b 100644
--- a/plugins/docker/models.py
+++ b/plugins/docker/models.py
@@ -4,7 +4,7 @@ import uuid
from datetime import datetime, timezone
from sqlalchemy import DateTime, Float, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column
-from fabledscryer.models.base import Base
+from steward.models.base import Base
class DockerContainer(Base):
diff --git a/plugins/docker/plugin.yaml b/plugins/docker/plugin.yaml
index 8745302..9d38f24 100644
--- a/plugins/docker/plugin.yaml
+++ b/plugins/docker/plugin.yaml
@@ -1,11 +1,11 @@
name: docker
version: "1.0.0"
description: "Docker container status, resource usage, restart tracking via Docker socket"
-author: "FabledScryer"
+author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
-repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
-homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/docker"
+repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/docker"
tags:
- containers
- docker
diff --git a/plugins/docker/routes.py b/plugins/docker/routes.py
index 12d0383..41b123a 100644
--- a/plugins/docker/routes.py
+++ b/plugins/docker/routes.py
@@ -1,13 +1,12 @@
# plugins/docker/routes.py
from __future__ import annotations
import json
-from datetime import datetime, timezone
from quart import Blueprint, current_app, render_template, request
from sqlalchemy import Integer, cast, func, select
-from fabledscryer.auth.middleware import require_role
-from fabledscryer.models.users import UserRole
-from fabledscryer.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds
+from steward.auth.middleware import require_role
+from steward.models.users import UserRole
+from steward.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds
from .models import DockerContainer, DockerMetric
docker_bp = Blueprint("docker", __name__, template_folder="templates")
diff --git a/plugins/docker/scheduler.py b/plugins/docker/scheduler.py
index eef8c61..827cf5f 100644
--- a/plugins/docker/scheduler.py
+++ b/plugins/docker/scheduler.py
@@ -4,8 +4,8 @@ import json
import logging
from datetime import datetime, timezone
-from fabledscryer.core.scheduler import ScheduledTask
-from fabledscryer.core.alerts import record_metric
+from steward.core.scheduler import ScheduledTask
+from steward.core.alerts import record_metric
logger = logging.getLogger(__name__)
diff --git a/plugins/docker/scraper.py b/plugins/docker/scraper.py
index 96f601b..f4133ed 100644
--- a/plugins/docker/scraper.py
+++ b/plugins/docker/scraper.py
@@ -106,7 +106,6 @@ async def scrape_docker(socket_path: str, include_stopped: bool) -> list[dict]:
) from exc
results = []
- now = datetime.now(timezone.utc)
for container, stats in pairs:
names = container.get("Names") or []
name = names[0].lstrip("/") if names else _short_id(container.get("Id", ""))
diff --git a/plugins/docker/templates/docker/index.html b/plugins/docker/templates/docker/index.html
index 42c9bb5..9b33918 100644
--- a/plugins/docker/templates/docker/index.html
+++ b/plugins/docker/templates/docker/index.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{% block title %}Docker — Fabled Scryer{% endblock %}
+{% block title %}Docker — Steward{% endblock %}
{% block content %}
Docker
diff --git a/plugins/http/checker.py b/plugins/http/checker.py
index 7eec743..c898ad6 100644
--- a/plugins/http/checker.py
+++ b/plugins/http/checker.py
@@ -2,7 +2,6 @@
"""Core HTTP check logic — runs a single monitor check and returns a result dict."""
from __future__ import annotations
import asyncio
-import json
import logging
import ssl
import time
diff --git a/plugins/http/migrations/env.py b/plugins/http/migrations/env.py
index fd308a2..02082a7 100644
--- a/plugins/http/migrations/env.py
+++ b/plugins/http/migrations/env.py
@@ -13,8 +13,8 @@ from alembic import context
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
-from fabledscryer.models.base import Base
-import fabledscryer.models # noqa: F401
+from steward.models.base import Base
+import steward.models # noqa: F401
from plugins.http.models import HttpMonitor, HttpResult # noqa: F401
config = context.config
@@ -26,14 +26,14 @@ target_metadata = Base.metadata
def _get_url() -> str:
import yaml
- cfg_path = os.environ.get("FABLEDSCRYER_CONFIG", "config.yaml")
+ cfg_path = os.environ.get("STEWARD_CONFIG", "config.yaml")
try:
with open(cfg_path) as f:
cfg = yaml.safe_load(f) or {}
url = cfg.get("database", {}).get("url", "")
except FileNotFoundError:
url = ""
- return os.environ.get("FABLEDSCRYER_DATABASE__URL", url)
+ return os.environ.get("STEWARD_DATABASE__URL", url)
def run_migrations_offline() -> None:
diff --git a/plugins/http/models.py b/plugins/http/models.py
index 180effd..d11cb0c 100644
--- a/plugins/http/models.py
+++ b/plugins/http/models.py
@@ -4,7 +4,7 @@ import uuid
from datetime import datetime, timezone
from sqlalchemy import Boolean, DateTime, Float, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column
-from fabledscryer.models.base import Base
+from steward.models.base import Base
class HttpMonitor(Base):
diff --git a/plugins/http/plugin.yaml b/plugins/http/plugin.yaml
index 9aa1475..a232c4d 100644
--- a/plugins/http/plugin.yaml
+++ b/plugins/http/plugin.yaml
@@ -1,11 +1,11 @@
name: http
version: "1.0.0"
description: "Synthetic HTTP endpoint monitoring — status code, response time, content match, TLS expiry"
-author: "FabledScryer"
+author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
-repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
-homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/http"
+repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/http"
tags:
- monitoring
- http
diff --git a/plugins/http/routes.py b/plugins/http/routes.py
index eea5ce7..24bede7 100644
--- a/plugins/http/routes.py
+++ b/plugins/http/routes.py
@@ -1,14 +1,13 @@
# plugins/http/routes.py
from __future__ import annotations
-import json
import uuid
from datetime import datetime, timezone
from quart import Blueprint, current_app, render_template, request, redirect, url_for
from sqlalchemy import Integer, cast, func, select
-from fabledscryer.auth.middleware import require_role
-from fabledscryer.models.users import UserRole
-from fabledscryer.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds
+from steward.auth.middleware import require_role
+from steward.models.users import UserRole
+from steward.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds
from .models import HttpMonitor, HttpResult
http_bp = Blueprint("http", __name__, template_folder="templates")
diff --git a/plugins/http/scheduler.py b/plugins/http/scheduler.py
index f9edd67..424836c 100644
--- a/plugins/http/scheduler.py
+++ b/plugins/http/scheduler.py
@@ -3,10 +3,10 @@ from __future__ import annotations
import asyncio
import json
import logging
-from datetime import datetime, timezone, timedelta
+from datetime import datetime, timezone
-from fabledscryer.core.scheduler import ScheduledTask
-from fabledscryer.core.alerts import record_metric
+from steward.core.scheduler import ScheduledTask
+from steward.core.alerts import record_metric
logger = logging.getLogger(__name__)
diff --git a/plugins/http/templates/http/index.html b/plugins/http/templates/http/index.html
index 6d1ffd0..a2c7771 100644
--- a/plugins/http/templates/http/index.html
+++ b/plugins/http/templates/http/index.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{% block title %}HTTP Monitors — Fabled Scryer{% endblock %}
+{% block title %}HTTP Monitors — Steward{% endblock %}
{% block content %}
HTTP Monitors
diff --git a/plugins/index.yaml b/plugins/index.yaml
index 0192afe..276306d 100644
--- a/plugins/index.yaml
+++ b/plugins/index.yaml
@@ -1,6 +1,6 @@
-# fabledscryer-plugins / index.yaml
+# steward-plugins / index.yaml
#
-# Plugin catalog for Fabled Scryer.
+# Plugin catalog for Steward.
# Fetched by the app at: Settings → Plugins → Plugin Catalog
#
# After updating an entry, commit and push — changes are live within 5 minutes
@@ -16,12 +16,12 @@ plugins:
- name: http
version: "1.0.0"
description: "Synthetic HTTP endpoint monitoring — status code, response time, content match, TLS expiry"
- author: "FabledScryer"
+ author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
- repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
- homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/http"
- download_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/releases/download/http-v1.0.0/http.zip"
+ repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+ homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/http"
+ download_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins/releases/download/http-v1.0.0/http.zip"
checksum_sha256: ""
tags:
- monitoring
@@ -32,12 +32,12 @@ plugins:
- name: docker
version: "1.0.0"
description: "Docker container status, resource usage, and restart tracking via Docker socket"
- author: "FabledScryer"
+ author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
- repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
- homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/docker"
- download_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/releases/download/docker-v1.0.0/docker.zip"
+ repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+ homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/docker"
+ download_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins/releases/download/docker-v1.0.0/docker.zip"
checksum_sha256: ""
tags:
- containers
@@ -47,12 +47,12 @@ plugins:
- name: traefik
version: "1.0.0"
description: "Traefik reverse proxy metrics and access log integration"
- author: "FabledScryer"
+ author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
- repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
- homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/traefik"
- download_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/releases/download/traefik-v1.0.0/traefik.zip"
+ repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+ homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/traefik"
+ download_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins/releases/download/traefik-v1.0.0/traefik.zip"
checksum_sha256: ""
tags:
- proxy
@@ -62,12 +62,12 @@ plugins:
- name: unifi
version: "1.0.0"
description: "UniFi Network controller integration — WAN health, devices, clients, DPI"
- author: "FabledScryer"
+ author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
- repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
- homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/unifi"
- download_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/releases/download/unifi-v1.0.0/unifi.zip"
+ repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+ homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/unifi"
+ download_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins/releases/download/unifi-v1.0.0/unifi.zip"
checksum_sha256: ""
tags:
- network
@@ -77,12 +77,12 @@ plugins:
- name: ups
version: "1.0.0"
description: "UPS monitoring via NUT (Network UPS Tools) with Ansible shutdown automation"
- author: "FabledScryer"
+ author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
- repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
- homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/ups"
- download_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/releases/download/ups-v1.0.0/ups.zip"
+ repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+ homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/ups"
+ download_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins/releases/download/ups-v1.0.0/ups.zip"
checksum_sha256: ""
tags:
- ups
diff --git a/plugins/snmp/plugin.yaml b/plugins/snmp/plugin.yaml
index 5e98fce..ba8d8a6 100644
--- a/plugins/snmp/plugin.yaml
+++ b/plugins/snmp/plugin.yaml
@@ -2,11 +2,11 @@
name: snmp
version: "1.0.0"
description: "SNMP polling for network devices — switches, routers, printers, UPSes, etc."
-author: "FabledScryer"
+author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
-repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
-homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/snmp"
+repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/snmp"
tags:
- snmp
- network
diff --git a/plugins/snmp/poller.py b/plugins/snmp/poller.py
index 2f7e86f..6a837f6 100644
--- a/plugins/snmp/poller.py
+++ b/plugins/snmp/poller.py
@@ -3,7 +3,7 @@
Synchronous SNMP GET helper, run via executor.
Requires pysnmp-lextudio (maintained pysnmp fork):
- pip install 'fabledscryer[snmp]'
+ pip install 'steward[snmp]'
If pysnmp is not installed, poll_device() returns an empty dict and logs a warning.
"""
@@ -40,7 +40,7 @@ def poll_device_sync(
"""
if not _pysnmp_available():
logger.warning("pysnmp not installed — SNMP polling disabled. "
- "Install with: pip install 'fabledscryer[snmp]'")
+ "Install with: pip install 'steward[snmp]'")
return {}
from pysnmp.hlapi import (
diff --git a/plugins/snmp/routes.py b/plugins/snmp/routes.py
index cca9697..94bffbc 100644
--- a/plugins/snmp/routes.py
+++ b/plugins/snmp/routes.py
@@ -5,9 +5,9 @@ from datetime import datetime, timedelta, timezone
from quart import Blueprint, current_app, render_template, request
from sqlalchemy import func, select
-from fabledscryer.auth.middleware import require_role
-from fabledscryer.models.users import UserRole
-from fabledscryer.models.metrics import PluginMetric
+from steward.auth.middleware import require_role
+from steward.models.users import UserRole
+from steward.models.metrics import PluginMetric
snmp_bp = Blueprint("snmp", __name__, template_folder="templates")
diff --git a/plugins/snmp/scheduler.py b/plugins/snmp/scheduler.py
index b8809c3..d1a1d85 100644
--- a/plugins/snmp/scheduler.py
+++ b/plugins/snmp/scheduler.py
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING
if TYPE_CHECKING:
from quart import Quart
-from fabledscryer.core.scheduler import ScheduledTask
+from steward.core.scheduler import ScheduledTask
logger = logging.getLogger(__name__)
@@ -27,16 +27,14 @@ def make_poll_task(app: "Quart") -> ScheduledTask:
async def _do_poll(app: "Quart") -> None:
- from datetime import datetime, timezone
from .poller import poll_device_sync
- from fabledscryer.core.alerts import record_metric
+ from steward.core.alerts import record_metric
devices: list[dict] = app.config["PLUGINS"]["snmp"].get("devices", [])
if not devices:
return
loop = asyncio.get_event_loop()
- now = datetime.now(timezone.utc)
async with app.db_sessionmaker() as session:
async with session.begin():
diff --git a/plugins/snmp/templates/snmp/device.html b/plugins/snmp/templates/snmp/device.html
index 82022a9..b8fe625 100644
--- a/plugins/snmp/templates/snmp/device.html
+++ b/plugins/snmp/templates/snmp/device.html
@@ -1,6 +1,6 @@
{# plugins/snmp/templates/snmp/device.html #}
{% extends "base.html" %}
-{% block title %}SNMP — {{ device_name }} — Fabled Scryer{% endblock %}
+{% block title %}SNMP — {{ device_name }} — Steward{% endblock %}
{% block content %}
← SNMP
diff --git a/plugins/snmp/templates/snmp/index.html b/plugins/snmp/templates/snmp/index.html
index 86a1485..ef5979c 100644
--- a/plugins/snmp/templates/snmp/index.html
+++ b/plugins/snmp/templates/snmp/index.html
@@ -1,6 +1,6 @@
{# plugins/snmp/templates/snmp/index.html #}
{% extends "base.html" %}
-{% block title %}SNMP — Fabled Scryer{% endblock %}
+{% block title %}SNMP — Steward{% endblock %}
{% block content %}
SNMP Devices
diff --git a/plugins/traefik/migrations/env.py b/plugins/traefik/migrations/env.py
index 1919fec..a523e27 100644
--- a/plugins/traefik/migrations/env.py
+++ b/plugins/traefik/migrations/env.py
@@ -15,11 +15,11 @@ from sqlalchemy.engine import Connection
from sqlalchemy.ext.asyncio import async_engine_from_config
from alembic import context
-# Make fabledscryer importable
+# Make steward importable
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
-from fabledscryer.models.base import Base
-import fabledscryer.models # noqa: F401 — core models
+from steward.models.base import Base
+import steward.models # noqa: F401 — core models
from plugins.traefik.models import TraefikMetric # noqa: F401 — plugin model
config = context.config
@@ -31,14 +31,14 @@ target_metadata = Base.metadata
def _get_url() -> str:
import yaml
- cfg_path = os.environ.get("FABLEDSCRYER_CONFIG", "config.yaml")
+ cfg_path = os.environ.get("STEWARD_CONFIG", "config.yaml")
try:
with open(cfg_path) as f:
cfg = yaml.safe_load(f) or {}
url = cfg.get("database", {}).get("url", "")
except FileNotFoundError:
url = ""
- return os.environ.get("FABLEDSCRYER_DATABASE__URL", url)
+ return os.environ.get("STEWARD_DATABASE__URL", url)
def run_migrations_offline() -> None:
diff --git a/plugins/traefik/models.py b/plugins/traefik/models.py
index 1ba9e50..d177d10 100644
--- a/plugins/traefik/models.py
+++ b/plugins/traefik/models.py
@@ -4,7 +4,7 @@ import uuid
from datetime import datetime, timezone
from sqlalchemy import DateTime, Float, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column
-from fabledscryer.models.base import Base
+from steward.models.base import Base
class TraefikMetric(Base):
diff --git a/plugins/traefik/plugin.yaml b/plugins/traefik/plugin.yaml
index 392713b..3f09ff4 100644
--- a/plugins/traefik/plugin.yaml
+++ b/plugins/traefik/plugin.yaml
@@ -2,11 +2,11 @@
name: traefik
version: "1.0.0"
description: "Traefik reverse proxy metrics and access log integration"
-author: "FabledScryer"
+author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
-repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
-homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/traefik"
+repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/traefik"
tags:
- proxy
- metrics
diff --git a/plugins/traefik/routes.py b/plugins/traefik/routes.py
index f7fe3ce..80e6c93 100644
--- a/plugins/traefik/routes.py
+++ b/plugins/traefik/routes.py
@@ -6,9 +6,9 @@ from quart import Blueprint, current_app, render_template, request
from sqlalchemy import Integer, cast, func, select
import json
-from fabledscryer.auth.middleware import require_role
-from fabledscryer.models.users import UserRole
-from fabledscryer.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds, subsample
+from steward.auth.middleware import require_role
+from steward.models.users import UserRole
+from steward.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds, subsample
from .models import TraefikAccessSummary, TraefikCert, TraefikGlobalStat, TraefikMetric
traefik_bp = Blueprint("traefik", __name__, template_folder="templates")
diff --git a/plugins/traefik/scheduler.py b/plugins/traefik/scheduler.py
index b7eb050..678e788 100644
--- a/plugins/traefik/scheduler.py
+++ b/plugins/traefik/scheduler.py
@@ -5,7 +5,7 @@ import time
from typing import TYPE_CHECKING
from datetime import datetime
-from fabledscryer.core.scheduler import ScheduledTask
+from steward.core.scheduler import ScheduledTask
if TYPE_CHECKING:
from quart import Quart
@@ -41,7 +41,6 @@ async def _do_scrape(app: "Quart") -> None:
global _prev_metrics, _prev_time
from datetime import datetime, timezone
- from sqlalchemy import select
from .models import TraefikCert, TraefikGlobalStat, TraefikMetric
from .scraper import (
compute_global_stats,
@@ -49,7 +48,7 @@ async def _do_scrape(app: "Quart") -> None:
extract_certs,
fetch_metrics,
)
- from fabledscryer.core.alerts import record_metric
+ from steward.core.alerts import record_metric
metrics_url: str = app.config["PLUGINS"]["traefik"]["metrics_url"]
diff --git a/plugins/traefik/templates/traefik/index.html b/plugins/traefik/templates/traefik/index.html
index da66fc7..18f50f0 100644
--- a/plugins/traefik/templates/traefik/index.html
+++ b/plugins/traefik/templates/traefik/index.html
@@ -1,6 +1,6 @@
{# plugins/traefik/templates/traefik/index.html #}
{% extends "base.html" %}
-{% block title %}Traefik — Fabled Scryer{% endblock %}
+{% block title %}Traefik — Steward{% endblock %}
{% block content %}
diff --git a/plugins/unifi/migrations/env.py b/plugins/unifi/migrations/env.py
index 56f15d5..7fa8252 100644
--- a/plugins/unifi/migrations/env.py
+++ b/plugins/unifi/migrations/env.py
@@ -15,8 +15,8 @@ from alembic import context
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
-from fabledscryer.models.base import Base
-import fabledscryer.models # noqa: F401
+from steward.models.base import Base
+import steward.models # noqa: F401
from plugins.unifi.models import UnifiWanStat, UnifiClientSnapshot, UnifiDevice # noqa: F401
config = context.config
@@ -28,14 +28,14 @@ target_metadata = Base.metadata
def _get_url() -> str:
import yaml
- cfg_path = os.environ.get("FABLEDSCRYER_CONFIG", "config.yaml")
+ cfg_path = os.environ.get("STEWARD_CONFIG", "config.yaml")
try:
with open(cfg_path) as f:
cfg = yaml.safe_load(f) or {}
url = cfg.get("database", {}).get("url", "")
except FileNotFoundError:
url = ""
- return os.environ.get("FABLEDSCRYER_DATABASE__URL", url)
+ return os.environ.get("STEWARD_DATABASE__URL", url)
def run_migrations_offline() -> None:
diff --git a/plugins/unifi/models.py b/plugins/unifi/models.py
index 2ad90e9..bb36410 100644
--- a/plugins/unifi/models.py
+++ b/plugins/unifi/models.py
@@ -4,7 +4,7 @@ import uuid
from datetime import datetime, timezone
from sqlalchemy import Boolean, DateTime, Float, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column
-from fabledscryer.models.base import Base
+from steward.models.base import Base
# ── Time-series (one row per scrape) ──────────────────────────────────────────
diff --git a/plugins/unifi/plugin.yaml b/plugins/unifi/plugin.yaml
index 208ace5..76b64ed 100644
--- a/plugins/unifi/plugin.yaml
+++ b/plugins/unifi/plugin.yaml
@@ -1,11 +1,11 @@
name: unifi
version: "1.0.0"
description: "UniFi Network controller integration — WAN health, devices, clients, DPI"
-author: "FabledScryer"
+author: "Steward"
license: "MIT"
min_app_version: "0.1.0"
-repository_url: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins"
-homepage: "https://git.fabledsword.com/bvandeusen/FabledScryer-plugins/src/branch/main/unifi"
+repository_url: "https://git.fabledsword.com/bvandeusen/Steward-plugins"
+homepage: "https://git.fabledsword.com/bvandeusen/Steward-plugins/src/branch/main/unifi"
tags:
- network
- unifi
diff --git a/plugins/unifi/routes.py b/plugins/unifi/routes.py
index 2a57330..e5e00a6 100644
--- a/plugins/unifi/routes.py
+++ b/plugins/unifi/routes.py
@@ -1,13 +1,12 @@
# plugins/unifi/routes.py
from __future__ import annotations
import json
-from datetime import datetime, timezone
from quart import Blueprint, current_app, render_template, request
from sqlalchemy import Integer, cast, func, select
-from fabledscryer.auth.middleware import require_role
-from fabledscryer.models.users import UserRole
-from fabledscryer.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds, subsample
+from steward.auth.middleware import require_role
+from steward.models.users import UserRole
+from steward.core.time_range import parse_range, DEFAULT_RANGE, bucket_seconds
from .models import (
UnifiAlarm, UnifiClientSnapshot, UnifiDevice, UnifiDpiSnapshot,
UnifiEvent, UnifiFwRule, UnifiKnownClient, UnifiNetwork,
diff --git a/plugins/unifi/scheduler.py b/plugins/unifi/scheduler.py
index 2a6345d..e050c40 100644
--- a/plugins/unifi/scheduler.py
+++ b/plugins/unifi/scheduler.py
@@ -5,7 +5,7 @@ import logging
from datetime import datetime, timezone
from typing import TYPE_CHECKING
-from fabledscryer.core.scheduler import ScheduledTask
+from steward.core.scheduler import ScheduledTask
if TYPE_CHECKING:
from quart import Quart
@@ -35,7 +35,7 @@ async def _do_poll(app: "Quart") -> None:
from .client import UnifiClient
from .models import UnifiClientSnapshot, UnifiDevice, UnifiWanStat
- from fabledscryer.core.alerts import record_metric
+ from steward.core.alerts import record_metric
cfg = app.config["PLUGINS"]["unifi"]
diff --git a/plugins/unifi/templates/unifi/index.html b/plugins/unifi/templates/unifi/index.html
index b2113b6..517c030 100644
--- a/plugins/unifi/templates/unifi/index.html
+++ b/plugins/unifi/templates/unifi/index.html
@@ -1,6 +1,6 @@
{# plugins/unifi/templates/unifi/index.html #}
{% extends "base.html" %}
-{% block title %}UniFi — Fabled Scryer{% endblock %}
+{% block title %}UniFi — Steward{% endblock %}
{% block content %}
diff --git a/steward/ansible/routes.py b/steward/ansible/routes.py
index d01f860..1dceb26 100644
--- a/steward/ansible/routes.py
+++ b/steward/ansible/routes.py
@@ -3,13 +3,12 @@ from __future__ import annotations
import asyncio
import uuid
from datetime import datetime, timezone
-from pathlib import Path
from quart import (
- Blueprint, Response, current_app, redirect, render_template,
- request, session, url_for,
+ Blueprint, Response, current_app, render_template,
+ request, session,
)
-from sqlalchemy import select, update
+from sqlalchemy import select
from steward.ansible import executor, sources as src_module
from steward.auth.middleware import require_role
diff --git a/steward/auth/oidc.py b/steward/auth/oidc.py
index 934e3a8..9f8697e 100644
--- a/steward/auth/oidc.py
+++ b/steward/auth/oidc.py
@@ -8,7 +8,6 @@ we trust the HTTPS connection to the discovery-documented token/userinfo endpoin
"""
from __future__ import annotations
import base64
-import hashlib
import json
import logging
import os
diff --git a/steward/core/plugin_manager.py b/steward/core/plugin_manager.py
index b0c6e6d..680235c 100644
--- a/steward/core/plugin_manager.py
+++ b/steward/core/plugin_manager.py
@@ -1,7 +1,6 @@
# steward/core/plugin_manager.py
from __future__ import annotations
import hashlib
-import importlib
import logging
import os
import sys
diff --git a/steward/core/reports.py b/steward/core/reports.py
index 39f0d7a..7c376d0 100644
--- a/steward/core/reports.py
+++ b/steward/core/reports.py
@@ -6,8 +6,6 @@ Called by the scheduler (hourly check) or triggered manually from Settings.
from __future__ import annotations
import asyncio
import logging
-import smtplib
-import ssl
from datetime import datetime, timedelta, timezone
from email.message import EmailMessage
diff --git a/steward/migrations/env.py b/steward/migrations/env.py
index 3da677f..0c35e5e 100644
--- a/steward/migrations/env.py
+++ b/steward/migrations/env.py
@@ -15,7 +15,8 @@ target_metadata = Base.metadata
def get_url() -> str:
- import os, yaml
+ import os
+ import yaml
def _env(suffix: str) -> str | None:
return os.environ.get(f"STEWARD_{suffix}")
diff --git a/steward/settings/routes.py b/steward/settings/routes.py
index 8434b70..f2740a4 100644
--- a/steward/settings/routes.py
+++ b/steward/settings/routes.py
@@ -1,6 +1,5 @@
# steward/settings/routes.py
from __future__ import annotations
-import json
import logging
from pathlib import Path
from quart import Blueprint, current_app, render_template, request, redirect, url_for, session
@@ -9,7 +8,7 @@ from steward.auth.middleware import require_role
from steward.core.audit import log_audit
from steward.models.users import UserRole
from steward.core.settings import (
- DEFAULTS, get_all_settings, set_setting,
+ get_all_settings, set_setting,
to_smtp_cfg, to_webhook_cfg, to_ansible_cfg, to_plugins_cfg,
to_oidc_cfg, to_ldap_cfg,
)
diff --git a/steward/templates/settings/auth.html b/steward/templates/settings/auth.html
index 655fd08..41b69c4 100644
--- a/steward/templates/settings/auth.html
+++ b/steward/templates/settings/auth.html
@@ -144,12 +144,12 @@
Admin group DN
+ placeholder="cn=steward-admins,ou=groups,dc=example,dc=com">
Operator group DN
+ placeholder="cn=steward-operators,ou=groups,dc=example,dc=com">
diff --git a/steward/templates/settings/plugins.html b/steward/templates/settings/plugins.html
index 31d1a7c..2b2a5c6 100644
--- a/steward/templates/settings/plugins.html
+++ b/steward/templates/settings/plugins.html
@@ -81,7 +81,7 @@
Plugin Repositories
- Repositories are remote index.yaml files that Scryer checks for available
+ Repositories are remote index.yaml files that Steward checks for available
and updated plugins. Add repos from other developers to expand the plugin catalog.
{% include "settings/_plugin_repos.html" %}
diff --git a/tests/conftest.py b/tests/conftest.py
index 1031522..8b4edc0 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,6 +1,5 @@
import pytest
import pytest_asyncio
-from pathlib import Path
import textwrap
from steward.app import create_app
diff --git a/tests/plugins/host_agent/test_agent_build_payload.py b/tests/plugins/host_agent/test_agent_build_payload.py
index f38f567..2d7f26a 100644
--- a/tests/plugins/host_agent/test_agent_build_payload.py
+++ b/tests/plugins/host_agent/test_agent_build_payload.py
@@ -1,3 +1,4 @@
+import urllib.error
from unittest.mock import patch
from plugins.host_agent import agent as a
@@ -55,10 +56,6 @@ def test_build_payload_wraps_samples():
assert payload["samples"][0]["cpu_pct"] == 5.0
-import urllib.error
-from unittest.mock import MagicMock, patch
-
-
def test_post_payload_success():
from plugins.host_agent import agent as a
captured = {}
diff --git a/tests/plugins/host_agent/test_agent_ring_buffer.py b/tests/plugins/host_agent/test_agent_ring_buffer.py
index f0d7a46..2482e6d 100644
--- a/tests/plugins/host_agent/test_agent_ring_buffer.py
+++ b/tests/plugins/host_agent/test_agent_ring_buffer.py
@@ -3,7 +3,9 @@ from plugins.host_agent.agent import RingBuffer
def test_ring_buffer_preserves_order():
rb = RingBuffer(maxlen=3)
- rb.push(1); rb.push(2); rb.push(3)
+ rb.push(1)
+ rb.push(2)
+ rb.push(3)
assert list(rb.drain()) == [1, 2, 3]
assert len(rb) == 0
@@ -17,7 +19,8 @@ def test_ring_buffer_drops_oldest_when_full():
def test_ring_buffer_drain_clears_and_is_atomic():
rb = RingBuffer(maxlen=5)
- rb.push("a"); rb.push("b")
+ rb.push("a")
+ rb.push("b")
out = list(rb.drain())
rb.push("c")
assert out == ["a", "b"]
diff --git a/tests/plugins/host_agent/test_install_template.py b/tests/plugins/host_agent/test_install_template.py
index dc3f928..efaed79 100644
--- a/tests/plugins/host_agent/test_install_template.py
+++ b/tests/plugins/host_agent/test_install_template.py
@@ -2,7 +2,6 @@
import subprocess
from pathlib import Path
-import pytest
from jinja2 import Environment, FileSystemLoader
from plugins.host_agent.routes import _agent_version, AGENT_SOURCE_PATH
diff --git a/tests/test_config.py b/tests/test_config.py
index d4151bd..40e9203 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -1,4 +1,3 @@
-import os
import textwrap
import pytest
from steward.config import load_bootstrap
diff --git a/tests/test_models.py b/tests/test_models.py
index 2bce1c7..50a074b 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -1,4 +1,3 @@
-import pytest
from steward.models.users import User, UserRole
diff --git a/tests/test_no_legacy_names.py b/tests/test_no_legacy_names.py
new file mode 100644
index 0000000..0e75198
--- /dev/null
+++ b/tests/test_no_legacy_names.py
@@ -0,0 +1,35 @@
+"""Regression guard: shipped code must not reference old project names.
+
+The FabledScryer -> Roundtable -> Steward renames repeatedly left stale package
+imports behind in the (then separate) plugins (e.g. `from fabledscryer.models...`),
+silently breaking every non-host_agent plugin. Now that plugins are folded in-tree
+and version with core, this test fails loudly if either legacy name reappears in
+the shipped Python / templates / plugin manifests.
+"""
+from __future__ import annotations
+
+from pathlib import Path
+
+import pytest
+
+_ROOT = Path(__file__).resolve().parent.parent
+_TREES = [_ROOT / "steward", _ROOT / "plugins"]
+_EXTENSIONS = {".py", ".yaml", ".yml", ".html", ".j2"}
+_FORBIDDEN = ("scryer", "roundtable") # case-insensitive; old project names
+
+
+def _shipped_files():
+ for tree in _TREES:
+ for path in tree.rglob("*"):
+ if path.suffix in _EXTENSIONS and "__pycache__" not in path.parts:
+ yield path
+
+
+@pytest.mark.parametrize("name", _FORBIDDEN)
+def test_no_legacy_project_name(name):
+ offenders = [
+ str(p.relative_to(_ROOT))
+ for p in _shipped_files()
+ if name in p.read_text(encoding="utf-8", errors="ignore").lower()
+ ]
+ assert not offenders, f"legacy name {name!r} found in shipped code: {offenders}"