4.1 KiB
BanGUI — Task List
This document breaks the entire BanGUI project into development stages, ordered so that each stage builds on the previous one. Every task is described in prose with enough detail for a developer to begin work. References point to the relevant documentation.
Reference: Docs/Refactoring.md for full analysis of each issue.
Open Issues
Bug: GET /api/history returns 500 — missing origin parameter through the call chain
Severity: Critical (page-level breakage — History page fails to load)
The router (backend/app/routers/history.py) passes origin=origin (a BanOrigin | None query param) to history_service.list_history(), but the service function signature does not accept an origin parameter. This causes a TypeError at runtime → 500.
The fix must be threaded through two layers:
backend/app/services/history_service.py→list_history()— addorigin: BanOrigin | None = Noneparameter, importBanOrigin, and forward it tofail2ban_db_repo.get_history_page().backend/app/repositories/fail2ban_db_repo.py→get_history_page()— addorigin: BanOrigin | None = Noneparameter and apply the already-existing_origin_sql_filter()helper (defined at line 73 but never called in this function).
Status: Done
Key files:
backend/app/routers/history.py(caller — correct, passesorigin)backend/app/services/history_service.py(missingoriginparam)backend/app/repositories/fail2ban_db_repo.py(missingoriginparam inget_history_page;_origin_sql_filteralready exists but isn't wired in)
Tests: add/update tests for list_history and get_history_page with origin filtering.
Bug: GET /api/config/jails/inactive returns 500 — missing import of _get_active_jail_names
Severity: Critical (Config → Jails tab cannot show inactive jails)
backend/app/services/jail_config_service.py calls _get_active_jail_names() at 6 call sites (lines 504, 563, 699, 824, 882, 975) but does not import it. The current imports from app.utils.config_file_utils include _parse_jails_sync and _build_inactive_jail but are missing _get_active_jail_names. This causes NameError → 500.
Fix: add _get_active_jail_names to the import block at line 33–38 in jail_config_service.py:
from app.utils.config_file_utils import (
_build_inactive_jail,
_get_active_jail_names, # ← add
_ordered_config_files,
_parse_jails_sync,
_validate_jail_config_sync,
)
Key file: backend/app/services/jail_config_service.py
Bug: GET /api/config/filters returns 500 — missing imports of _parse_jails_sync and _get_active_jail_names
Severity: Critical (Config → Filters tab fails to load)
backend/app/services/filter_config_service.py calls _parse_jails_sync() (lines 509, 609, 880) and _get_active_jail_names() (lines 510, 610) but neither is imported. This causes NameError → 500.
Fix: add the missing imports. Both are available from app.utils.config_file_utils (re-exported from config_file_service):
from app.utils.config_file_utils import (
_get_active_jail_names,
_parse_jails_sync,
)
Key file: backend/app/services/filter_config_service.py
Bug: GET /api/config/service-status returns 500 — missing bangui_version in response construction
Severity: Critical (Config → Server tab health check fails)
The ServiceStatusResponse Pydantic model (backend/app/models/config.py, line 1005) declares bangui_version: str = Field(...) as a required field with no default. However, config_service.get_service_status() (backend/app/services/config_service.py, ~line 820) constructs the response without supplying bangui_version, causing a Pydantic ValidationError → 500.
Fix:
- Import
__version__fromapp(orapp.__init__) inconfig_service.py. - Add
bangui_version=__version__to theServiceStatusResponse(...)constructor call.
Key files:
backend/app/services/config_service.py(missing field in constructor)backend/app/models/config.py(model definition — correct, requiresbangui_version)