Add filter discovery endpoints with active/inactive status (Task 2.1)
- Add list_filters() and get_filter() to config_file_service.py:
scans filter.d/, parses [Definition] + [Init] sections, merges .local
overrides, and cross-references running jails to set active/used_by_jails
- Add FilterConfig.active, used_by_jails, source_file, has_local_override
fields to the Pydantic model; add FilterListResponse and FilterNotFoundError
- Add GET /api/config/filters and GET /api/config/filters/{name} to config.py
- Remove the shadowed GET /api/config/filters list route from file_config.py;
rename GET /api/config/filters/{name} raw variant to /filters/{name}/raw
- Update frontend: fetchFilterFiles() adapts FilterListResponse -> ConfFilesResponse;
add fetchFilters() and fetchFilter() to api/config.ts; remove unused
fetchFilterFiles/fetchActionFiles calls from useConfigActiveStatus
- Fix ConfigPageLogPath test mock to include fetchInactiveJails and related
exports introduced by Stage 1
- Backend: 169 tests pass, mypy --strict clean, ruff clean
- Frontend: 63 tests pass, tsc --noEmit clean, eslint clean
This commit is contained in:
@@ -8,8 +8,7 @@ Endpoints:
|
||||
* ``GET /api/config/jail-files/{filename}`` — get one jail config file (with content)
|
||||
* ``PUT /api/config/jail-files/{filename}`` — overwrite a jail config file
|
||||
* ``PUT /api/config/jail-files/{filename}/enabled`` — enable/disable a jail config
|
||||
* ``GET /api/config/filters`` — list all filter files
|
||||
* ``GET /api/config/filters/{name}`` — get one filter file (with content)
|
||||
* ``GET /api/config/filters/{name}/raw`` — get one filter file raw content
|
||||
* ``PUT /api/config/filters/{name}`` — update a filter file
|
||||
* ``POST /api/config/filters`` — create a new filter file
|
||||
* ``GET /api/config/filters/{name}/parsed`` — parse a filter file into a structured model
|
||||
@@ -20,6 +19,11 @@ Endpoints:
|
||||
* ``POST /api/config/actions`` — create a new action file
|
||||
* ``GET /api/config/actions/{name}/parsed`` — parse an action file into a structured model
|
||||
* ``PUT /api/config/actions/{name}/parsed`` — update an action file from a structured model
|
||||
|
||||
Note: ``GET /api/config/filters`` (enriched list) and
|
||||
``GET /api/config/filters/{name}`` (full parsed detail) are handled by the
|
||||
config router (``config.py``), which is registered first and therefore takes
|
||||
precedence. The raw-content variant is at ``/filters/{name}/raw``.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -303,41 +307,20 @@ async def create_jail_config_file(
|
||||
|
||||
|
||||
@router.get(
|
||||
"/filters",
|
||||
response_model=ConfFilesResponse,
|
||||
summary="List all filter definition files",
|
||||
)
|
||||
async def list_filter_files(
|
||||
request: Request,
|
||||
_auth: AuthDep,
|
||||
) -> ConfFilesResponse:
|
||||
"""Return a list of every ``.conf`` and ``.local`` file in ``filter.d/``.
|
||||
|
||||
Args:
|
||||
request: Incoming request.
|
||||
_auth: Validated session.
|
||||
|
||||
Returns:
|
||||
:class:`~app.models.file_config.ConfFilesResponse`.
|
||||
"""
|
||||
config_dir: str = request.app.state.settings.fail2ban_config_dir
|
||||
try:
|
||||
return await file_config_service.list_filter_files(config_dir)
|
||||
except ConfigDirError as exc:
|
||||
raise _service_unavailable(str(exc)) from exc
|
||||
|
||||
|
||||
@router.get(
|
||||
"/filters/{name}",
|
||||
"/filters/{name}/raw",
|
||||
response_model=ConfFileContent,
|
||||
summary="Return a filter definition file with its content",
|
||||
summary="Return a filter definition file's raw content",
|
||||
)
|
||||
async def get_filter_file(
|
||||
async def get_filter_file_raw(
|
||||
request: Request,
|
||||
_auth: AuthDep,
|
||||
name: _NamePath,
|
||||
) -> ConfFileContent:
|
||||
"""Return the content of a filter definition file.
|
||||
"""Return the raw content of a filter definition file.
|
||||
|
||||
This endpoint provides direct access to the file bytes for the raw
|
||||
config editor. For structured parsing with active/inactive status use
|
||||
``GET /api/config/filters/{name}`` (served by the config router).
|
||||
|
||||
Args:
|
||||
request: Incoming request.
|
||||
|
||||
Reference in New Issue
Block a user