Remove unused service protocol aliases and use direct service imports
This commit is contained in:
@@ -224,6 +224,10 @@ Reference: `Docs/Refactoring.md` for full analysis of each issue.
|
|||||||
|
|
||||||
**Goal:** Make a deliberate decision and enforce it consistently. Option A: adopt the protocol injection pattern everywhere — update all 16 non-compliant routers to accept their service via the typed `Dep` alias. Option B: acknowledge the pattern is unused overhead and remove the protocol aliases and `cast()` wrappers from `dependencies.py`, letting all routers import concrete services directly (the current de facto standard). Option B is cheaper; Option A makes service substitution in tests easier.
|
**Goal:** Make a deliberate decision and enforce it consistently. Option A: adopt the protocol injection pattern everywhere — update all 16 non-compliant routers to accept their service via the typed `Dep` alias. Option B: acknowledge the pattern is unused overhead and remove the protocol aliases and `cast()` wrappers from `dependencies.py`, letting all routers import concrete services directly (the current de facto standard). Option B is cheaper; Option A makes service substitution in tests easier.
|
||||||
|
|
||||||
|
**Decision:** Option B applied — service protocol aliases and provider wrappers have been removed in favor of direct concrete service imports.
|
||||||
|
|
||||||
|
**Status:** Completed ✅
|
||||||
|
|
||||||
**Possible traps and issues:**
|
**Possible traps and issues:**
|
||||||
- Option A requires updating all 16 routers and their test files simultaneously; this is a broad change with high regression risk. Stage it one router at a time.
|
- Option A requires updating all 16 routers and their test files simultaneously; this is a broad change with high regression risk. Stage it one router at a time.
|
||||||
- Option B means deleting `services/protocols.py` (398 lines) and all `cast("…Service", …)` calls in `dependencies.py`. Ensure nothing outside this layer references the Protocol classes (check test files).
|
- Option B means deleting `services/protocols.py` (398 lines) and all `cast("…Service", …)` calls in `dependencies.py`. Ensure nothing outside this layer references the Protocol classes (check test files).
|
||||||
|
|||||||
@@ -29,16 +29,6 @@ from app.repositories.protocols import (
|
|||||||
ImportLogRepository,
|
ImportLogRepository,
|
||||||
SessionRepository,
|
SessionRepository,
|
||||||
)
|
)
|
||||||
from app.services.protocols import (
|
|
||||||
AuthService,
|
|
||||||
BlocklistService,
|
|
||||||
ConfigService,
|
|
||||||
GeoService,
|
|
||||||
HealthService,
|
|
||||||
HistoryService,
|
|
||||||
JailService,
|
|
||||||
ServerService,
|
|
||||||
)
|
|
||||||
from app.utils.constants import SESSION_COOKIE_NAME
|
from app.utils.constants import SESSION_COOKIE_NAME
|
||||||
from app.utils.runtime_state import RuntimeState
|
from app.utils.runtime_state import RuntimeState
|
||||||
from app.utils.session_cache import InMemorySessionCache, NoOpSessionCache, SessionCache
|
from app.utils.session_cache import InMemorySessionCache, NoOpSessionCache, SessionCache
|
||||||
@@ -240,62 +230,6 @@ async def get_session_cache(app_context: Annotated[ApplicationContext, Depends(g
|
|||||||
return app_context.session_cache
|
return app_context.session_cache
|
||||||
|
|
||||||
|
|
||||||
async def get_auth_service() -> AuthService:
|
|
||||||
"""Provide the concrete authentication service implementation."""
|
|
||||||
from app.services import auth_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("AuthService", auth_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_jail_service() -> JailService:
|
|
||||||
"""Provide the concrete jail service implementation."""
|
|
||||||
from app.services import jail_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("JailService", jail_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_blocklist_service() -> BlocklistService:
|
|
||||||
"""Provide the concrete blocklist service implementation."""
|
|
||||||
from app.services import blocklist_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("BlocklistService", blocklist_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_config_service() -> ConfigService:
|
|
||||||
"""Provide the concrete configuration service implementation."""
|
|
||||||
from app.services import config_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("ConfigService", config_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_history_service() -> HistoryService:
|
|
||||||
"""Provide the concrete history service implementation."""
|
|
||||||
from app.services import history_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("HistoryService", history_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_geo_service() -> GeoService:
|
|
||||||
"""Provide the concrete geo service implementation."""
|
|
||||||
from app.services import geo_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("GeoService", geo_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_health_service() -> HealthService:
|
|
||||||
"""Provide the concrete health service implementation."""
|
|
||||||
from app.services import health_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("HealthService", health_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_server_service() -> ServerService:
|
|
||||||
"""Provide the concrete server service implementation."""
|
|
||||||
from app.services import server_service # noqa: PLC0415
|
|
||||||
|
|
||||||
return cast("ServerService", server_service)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_session_repo() -> SessionRepository:
|
async def get_session_repo() -> SessionRepository:
|
||||||
"""Provide the concrete session repository implementation."""
|
"""Provide the concrete session repository implementation."""
|
||||||
from app.repositories import session_repo # noqa: PLC0415
|
from app.repositories import session_repo # noqa: PLC0415
|
||||||
@@ -357,7 +291,6 @@ async def require_auth(
|
|||||||
db: Annotated[aiosqlite.Connection, Depends(get_db)],
|
db: Annotated[aiosqlite.Connection, Depends(get_db)],
|
||||||
settings: Annotated[Settings, Depends(get_settings)],
|
settings: Annotated[Settings, Depends(get_settings)],
|
||||||
session_cache: Annotated[SessionCache, Depends(get_session_cache)],
|
session_cache: Annotated[SessionCache, Depends(get_session_cache)],
|
||||||
auth_service: Annotated[AuthService, Depends(get_auth_service)],
|
|
||||||
session_repo: Annotated[SessionRepository, Depends(get_session_repo)],
|
session_repo: Annotated[SessionRepository, Depends(get_session_repo)],
|
||||||
) -> Session:
|
) -> Session:
|
||||||
"""Validate the session token and return the active session.
|
"""Validate the session token and return the active session.
|
||||||
@@ -403,6 +336,8 @@ async def require_auth(
|
|||||||
if cached is not None:
|
if cached is not None:
|
||||||
return cached
|
return cached
|
||||||
|
|
||||||
|
from app.services import auth_service # noqa: PLC0415
|
||||||
|
|
||||||
try:
|
try:
|
||||||
session = await auth_service.validate_session(
|
session = await auth_service.validate_session(
|
||||||
db,
|
db,
|
||||||
@@ -434,14 +369,6 @@ GeoBatchLookupDep = Annotated[GeoBatchLookup, Depends(get_geo_batch_lookup)]
|
|||||||
ServerStatusDep = Annotated[ServerStatus, Depends(get_server_status)]
|
ServerStatusDep = Annotated[ServerStatus, Depends(get_server_status)]
|
||||||
PendingRecoveryDep = Annotated[PendingRecovery | None, Depends(get_pending_recovery)]
|
PendingRecoveryDep = Annotated[PendingRecovery | None, Depends(get_pending_recovery)]
|
||||||
SessionCacheDep = Annotated[SessionCache, Depends(get_session_cache)]
|
SessionCacheDep = Annotated[SessionCache, Depends(get_session_cache)]
|
||||||
AuthServiceDep = Annotated[AuthService, Depends(get_auth_service)]
|
|
||||||
JailServiceDep = Annotated[JailService, Depends(get_jail_service)]
|
|
||||||
BlocklistServiceDep = Annotated[BlocklistService, Depends(get_blocklist_service)]
|
|
||||||
ConfigServiceDep = Annotated[ConfigService, Depends(get_config_service)]
|
|
||||||
HistoryServiceDep = Annotated[HistoryService, Depends(get_history_service)]
|
|
||||||
GeoServiceDep = Annotated[GeoService, Depends(get_geo_service)]
|
|
||||||
HealthServiceDep = Annotated[HealthService, Depends(get_health_service)]
|
|
||||||
ServerServiceDep = Annotated[ServerService, Depends(get_server_service)]
|
|
||||||
SessionRepoDep = Annotated[SessionRepository, Depends(get_session_repo)]
|
SessionRepoDep = Annotated[SessionRepository, Depends(get_session_repo)]
|
||||||
BlocklistRepositoryDep = Annotated[BlocklistRepository, Depends(get_blocklist_repo)]
|
BlocklistRepositoryDep = Annotated[BlocklistRepository, Depends(get_blocklist_repo)]
|
||||||
ImportLogRepositoryDep = Annotated[ImportLogRepository, Depends(get_import_log_repo)]
|
ImportLogRepositoryDep = Annotated[ImportLogRepository, Depends(get_import_log_repo)]
|
||||||
|
|||||||
@@ -12,14 +12,9 @@ from __future__ import annotations
|
|||||||
import structlog
|
import structlog
|
||||||
from fastapi import APIRouter, HTTPException, Request, Response, status
|
from fastapi import APIRouter, HTTPException, Request, Response, status
|
||||||
|
|
||||||
from app.dependencies import (
|
from app.dependencies import DbDep, SessionCacheDep, SessionRepoDep, SettingsDep
|
||||||
AuthServiceDep,
|
|
||||||
DbDep,
|
|
||||||
SessionCacheDep,
|
|
||||||
SessionRepoDep,
|
|
||||||
SettingsDep,
|
|
||||||
)
|
|
||||||
from app.models.auth import LoginRequest, LoginResponse, LogoutResponse
|
from app.models.auth import LoginRequest, LoginResponse, LogoutResponse
|
||||||
|
from app.services import auth_service
|
||||||
from app.utils.constants import SESSION_COOKIE_NAME
|
from app.utils.constants import SESSION_COOKIE_NAME
|
||||||
|
|
||||||
log: structlog.stdlib.BoundLogger = structlog.get_logger()
|
log: structlog.stdlib.BoundLogger = structlog.get_logger()
|
||||||
@@ -37,7 +32,6 @@ async def login(
|
|||||||
response: Response,
|
response: Response,
|
||||||
db: DbDep,
|
db: DbDep,
|
||||||
settings: SettingsDep,
|
settings: SettingsDep,
|
||||||
auth_service: AuthServiceDep,
|
|
||||||
session_repo: SessionRepoDep,
|
session_repo: SessionRepoDep,
|
||||||
) -> LoginResponse:
|
) -> LoginResponse:
|
||||||
"""Verify the master password and return a session token.
|
"""Verify the master password and return a session token.
|
||||||
@@ -93,7 +87,6 @@ async def logout(
|
|||||||
db: DbDep,
|
db: DbDep,
|
||||||
settings: SettingsDep,
|
settings: SettingsDep,
|
||||||
session_cache: SessionCacheDep,
|
session_cache: SessionCacheDep,
|
||||||
auth_service: AuthServiceDep,
|
|
||||||
session_repo: SessionRepoDep,
|
session_repo: SessionRepoDep,
|
||||||
) -> LogoutResponse:
|
) -> LogoutResponse:
|
||||||
"""Invalidate the active session.
|
"""Invalidate the active session.
|
||||||
|
|||||||
@@ -29,9 +29,12 @@ from app.dependencies import (
|
|||||||
Fail2BanSocketDep,
|
Fail2BanSocketDep,
|
||||||
GeoBatchLookupDep,
|
GeoBatchLookupDep,
|
||||||
HttpSessionDep,
|
HttpSessionDep,
|
||||||
JailServiceDep,
|
|
||||||
)
|
)
|
||||||
from app.exceptions import JailNotFoundError, JailOperationError
|
from app.exceptions import (
|
||||||
|
Fail2BanConnectionError,
|
||||||
|
JailNotFoundError,
|
||||||
|
JailOperationError,
|
||||||
|
)
|
||||||
from app.models.ban import JailBannedIpsResponse
|
from app.models.ban import JailBannedIpsResponse
|
||||||
from app.models.jail import (
|
from app.models.jail import (
|
||||||
IgnoreIpRequest,
|
IgnoreIpRequest,
|
||||||
@@ -40,7 +43,6 @@ from app.models.jail import (
|
|||||||
JailListResponse,
|
JailListResponse,
|
||||||
)
|
)
|
||||||
from app.services import jail_service
|
from app.services import jail_service
|
||||||
from app.exceptions import Fail2BanConnectionError
|
|
||||||
|
|
||||||
router: APIRouter = APIRouter(prefix="/api/jails", tags=["Jails"])
|
router: APIRouter = APIRouter(prefix="/api/jails", tags=["Jails"])
|
||||||
|
|
||||||
@@ -109,7 +111,6 @@ def _conflict(message: str) -> HTTPException:
|
|||||||
async def get_jails(
|
async def get_jails(
|
||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailListResponse:
|
) -> JailListResponse:
|
||||||
"""Return a summary of every active fail2ban jail.
|
"""Return a summary of every active fail2ban jail.
|
||||||
|
|
||||||
@@ -124,7 +125,7 @@ async def get_jails(
|
|||||||
:class:`~app.models.jail.JailListResponse` with all active jails.
|
:class:`~app.models.jail.JailListResponse` with all active jails.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return await jail_service_dep.list_jails(socket_path)
|
return await jail_service.list_jails(socket_path)
|
||||||
except Fail2BanConnectionError as exc:
|
except Fail2BanConnectionError as exc:
|
||||||
raise _bad_gateway(exc) from exc
|
raise _bad_gateway(exc) from exc
|
||||||
|
|
||||||
@@ -138,7 +139,6 @@ async def get_jail(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailDetailResponse:
|
) -> JailDetailResponse:
|
||||||
"""Return the complete configuration and runtime state for one jail.
|
"""Return the complete configuration and runtime state for one jail.
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ async def get_jail(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return await jail_service_dep.get_jail(socket_path, name)
|
return await jail_service.get_jail(socket_path, name)
|
||||||
except JailNotFoundError:
|
except JailNotFoundError:
|
||||||
raise _not_found(name) from None
|
raise _not_found(name) from None
|
||||||
except Fail2BanConnectionError as exc:
|
except Fail2BanConnectionError as exc:
|
||||||
@@ -178,7 +178,6 @@ async def get_jail(
|
|||||||
async def reload_all_jails(
|
async def reload_all_jails(
|
||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Reload every fail2ban jail to apply configuration changes.
|
"""Reload every fail2ban jail to apply configuration changes.
|
||||||
|
|
||||||
@@ -196,7 +195,7 @@ async def reload_all_jails(
|
|||||||
HTTPException: 409 when fail2ban reports the operation failed.
|
HTTPException: 409 when fail2ban reports the operation failed.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.reload_all(socket_path)
|
await jail_service.reload_all(socket_path)
|
||||||
return JailCommandResponse(message="All jails reloaded successfully.", jail="*")
|
return JailCommandResponse(message="All jails reloaded successfully.", jail="*")
|
||||||
except JailOperationError as exc:
|
except JailOperationError as exc:
|
||||||
raise _conflict(str(exc)) from exc
|
raise _conflict(str(exc)) from exc
|
||||||
@@ -213,7 +212,6 @@ async def start_jail(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Start a fail2ban jail that is currently stopped.
|
"""Start a fail2ban jail that is currently stopped.
|
||||||
|
|
||||||
@@ -230,7 +228,7 @@ async def start_jail(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.start_jail(socket_path, name)
|
await jail_service.start_jail(socket_path, name)
|
||||||
return JailCommandResponse(message=f"Jail {name!r} started.", jail=name)
|
return JailCommandResponse(message=f"Jail {name!r} started.", jail=name)
|
||||||
except JailNotFoundError:
|
except JailNotFoundError:
|
||||||
raise _not_found(name) from None
|
raise _not_found(name) from None
|
||||||
@@ -249,7 +247,6 @@ async def stop_jail(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Stop a running fail2ban jail.
|
"""Stop a running fail2ban jail.
|
||||||
|
|
||||||
@@ -269,7 +266,7 @@ async def stop_jail(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.stop_jail(socket_path, name)
|
await jail_service.stop_jail(socket_path, name)
|
||||||
return JailCommandResponse(message=f"Jail {name!r} stopped.", jail=name)
|
return JailCommandResponse(message=f"Jail {name!r} stopped.", jail=name)
|
||||||
except JailOperationError as exc:
|
except JailOperationError as exc:
|
||||||
raise _conflict(str(exc)) from exc
|
raise _conflict(str(exc)) from exc
|
||||||
@@ -286,7 +283,6 @@ async def toggle_idle(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
on: bool = Body(..., description="``true`` to enable idle, ``false`` to disable."),
|
on: bool = Body(..., description="``true`` to enable idle, ``false`` to disable."),
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Enable or disable idle mode for a fail2ban jail.
|
"""Enable or disable idle mode for a fail2ban jail.
|
||||||
@@ -309,7 +305,7 @@ async def toggle_idle(
|
|||||||
"""
|
"""
|
||||||
state_str = "on" if on else "off"
|
state_str = "on" if on else "off"
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.set_idle(socket_path, name, on=on)
|
await jail_service.set_idle(socket_path, name, on=on)
|
||||||
return JailCommandResponse(
|
return JailCommandResponse(
|
||||||
message=f"Jail {name!r} idle mode turned {state_str}.",
|
message=f"Jail {name!r} idle mode turned {state_str}.",
|
||||||
jail=name,
|
jail=name,
|
||||||
@@ -331,7 +327,6 @@ async def reload_jail(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Reload a single fail2ban jail to pick up configuration changes.
|
"""Reload a single fail2ban jail to pick up configuration changes.
|
||||||
|
|
||||||
@@ -348,7 +343,7 @@ async def reload_jail(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.reload_jail(socket_path, name)
|
await jail_service.reload_jail(socket_path, name)
|
||||||
return JailCommandResponse(message=f"Jail {name!r} reloaded.", jail=name)
|
return JailCommandResponse(message=f"Jail {name!r} reloaded.", jail=name)
|
||||||
except JailNotFoundError:
|
except JailNotFoundError:
|
||||||
raise _not_found(name) from None
|
raise _not_found(name) from None
|
||||||
@@ -380,7 +375,6 @@ async def get_ignore_list(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
"""Return the current ignore list (IP whitelist) for a fail2ban jail.
|
"""Return the current ignore list (IP whitelist) for a fail2ban jail.
|
||||||
|
|
||||||
@@ -396,7 +390,7 @@ async def get_ignore_list(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return await jail_service_dep.get_ignore_list(socket_path, name)
|
return await jail_service.get_ignore_list(socket_path, name)
|
||||||
except JailNotFoundError:
|
except JailNotFoundError:
|
||||||
raise _not_found(name) from None
|
raise _not_found(name) from None
|
||||||
except Fail2BanConnectionError as exc:
|
except Fail2BanConnectionError as exc:
|
||||||
@@ -414,7 +408,6 @@ async def add_ignore_ip(
|
|||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
body: IgnoreIpRequest,
|
body: IgnoreIpRequest,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Add an IP address or CIDR network to a jail's ignore list.
|
"""Add an IP address or CIDR network to a jail's ignore list.
|
||||||
|
|
||||||
@@ -436,7 +429,7 @@ async def add_ignore_ip(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.add_ignore_ip(socket_path, name, body.ip)
|
await jail_service.add_ignore_ip(socket_path, name, body.ip)
|
||||||
return JailCommandResponse(
|
return JailCommandResponse(
|
||||||
message=f"IP {body.ip!r} added to ignore list of jail {name!r}.",
|
message=f"IP {body.ip!r} added to ignore list of jail {name!r}.",
|
||||||
jail=name,
|
jail=name,
|
||||||
@@ -464,7 +457,6 @@ async def del_ignore_ip(
|
|||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
body: IgnoreIpRequest,
|
body: IgnoreIpRequest,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Remove an IP address or CIDR network from a jail's ignore list.
|
"""Remove an IP address or CIDR network from a jail's ignore list.
|
||||||
|
|
||||||
@@ -482,7 +474,7 @@ async def del_ignore_ip(
|
|||||||
HTTPException: 502 when fail2ban is unreachable.
|
HTTPException: 502 when fail2ban is unreachable.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.del_ignore_ip(socket_path, name, body.ip)
|
await jail_service.del_ignore_ip(socket_path, name, body.ip)
|
||||||
return JailCommandResponse(
|
return JailCommandResponse(
|
||||||
message=f"IP {body.ip!r} removed from ignore list of jail {name!r}.",
|
message=f"IP {body.ip!r} removed from ignore list of jail {name!r}.",
|
||||||
jail=name,
|
jail=name,
|
||||||
@@ -504,7 +496,6 @@ async def toggle_ignore_self(
|
|||||||
_auth: AuthDep,
|
_auth: AuthDep,
|
||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
on: bool = Body(..., description="``true`` to enable ignoreself, ``false`` to disable."),
|
on: bool = Body(..., description="``true`` to enable ignoreself, ``false`` to disable."),
|
||||||
) -> JailCommandResponse:
|
) -> JailCommandResponse:
|
||||||
"""Toggle the ``ignoreself`` flag for a fail2ban jail.
|
"""Toggle the ``ignoreself`` flag for a fail2ban jail.
|
||||||
@@ -527,7 +518,7 @@ async def toggle_ignore_self(
|
|||||||
"""
|
"""
|
||||||
state_str = "enabled" if on else "disabled"
|
state_str = "enabled" if on else "disabled"
|
||||||
try:
|
try:
|
||||||
await jail_service_dep.set_ignore_self(socket_path, name, on=on)
|
await jail_service.set_ignore_self(socket_path, name, on=on)
|
||||||
return JailCommandResponse(
|
return JailCommandResponse(
|
||||||
message=f"ignoreself {state_str} for jail {name!r}.",
|
message=f"ignoreself {state_str} for jail {name!r}.",
|
||||||
jail=name,
|
jail=name,
|
||||||
@@ -556,7 +547,6 @@ async def get_jail_banned_ips(
|
|||||||
name: _NamePath,
|
name: _NamePath,
|
||||||
socket_path: Fail2BanSocketDep,
|
socket_path: Fail2BanSocketDep,
|
||||||
http_session: HttpSessionDep,
|
http_session: HttpSessionDep,
|
||||||
jail_service_dep: JailServiceDep,
|
|
||||||
geo_batch_lookup: GeoBatchLookupDep,
|
geo_batch_lookup: GeoBatchLookupDep,
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
page_size: int = 25,
|
page_size: int = 25,
|
||||||
@@ -595,7 +585,7 @@ async def get_jail_banned_ips(
|
|||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return await jail_service_dep.get_jail_banned_ips(
|
return await jail_service.get_jail_banned_ips(
|
||||||
socket_path=socket_path,
|
socket_path=socket_path,
|
||||||
jail_name=name,
|
jail_name=name,
|
||||||
page=page,
|
page=page,
|
||||||
|
|||||||
Reference in New Issue
Block a user