Expose ban-time escalation settings in jail detail and config UI
- Backend: Add BantimeEscalation + BantimeEscalationUpdate Pydantic models to app/models/config.py; add bantime_escalation field to Jail in jail.py - Backend: jail_service.get_jail_detail() fetches 7 bantime.* socket commands (increment, factor, formula, multipliers, maxtime, rndtime, overalljails) and populates bantime_escalation on the returned Jail object - Backend: config_service.get_jail_config() fetches same 7 commands; update_jail_config() writes escalation fields when provided - Frontend: Add BantimeEscalation + BantimeEscalationUpdate interfaces to types/config.ts; extend JailConfig + JailConfigUpdate; extend Jail in types/jail.ts - Frontend: JailDetailPage.tsx adds BantimeEscalationSection component that renders only when increment is enabled (shows factor, formula, multipliers, max_time, rnd_time, overall_jails) - Frontend: ConfigPage.tsx JailAccordionPanel adds full escalation edit form (Switch for enable/disable, number inputs for factor/max_time/rnd_time, text inputs for formula/multipliers, Switch for overall_jails); handleSave includes bantime_escalation in the JailConfigUpdate payload - Tests: Update ConfigPageLogPath.test.tsx mock to include bantime_escalation:null - Docs: Mark Task 6 as DONE in Tasks.md
This commit is contained in:
@@ -138,3 +138,55 @@ Reference config directory: `/home/lukas/Volume/repo/BanGUI/Docker/fail2ban-dev-
|
||||
- Added inline "Add Log Path" form below the existing log-path list — an `Input` for the file path, a `Switch` for tail/head selection, and an "Add" button with `aria-label="Add log path"`.
|
||||
- 6 new frontend tests in `src/components/__tests__/ConfigPageLogPath.test.tsx` covering: rendering, disabled state, enabled state, successful add, success message, and API error surfacing.
|
||||
- `tsc --noEmit`, `eslint`: zero errors.
|
||||
|
||||
---
|
||||
|
||||
## Task 6 — Expose Ban-Time Escalation Settings ✅ DONE
|
||||
|
||||
**Goal:** Surface fail2ban's incremental ban-time escalation settings in the web UI, as called out in [Features.md § 5 (Jail Detail)](Features.md) and [Features.md § 6 (Edit Configuration)](Features.md).
|
||||
|
||||
**Features.md requirements:**
|
||||
- §5 Jail Detail: "Shows ban-time escalation settings if incremental banning is enabled (factor, formula, multipliers, max time)."
|
||||
- §6 Edit Configuration: "Configure ban-time escalation: enable incremental banning and set factor, formula, multipliers, maximum ban time, and random jitter."
|
||||
|
||||
**Tasks:**
|
||||
|
||||
### 6a — Backend: Add `BantimeEscalation` model and extend jail + config models
|
||||
|
||||
- Add `BantimeEscalation` Pydantic model with fields: `increment` (bool), `factor` (float|None), `formula` (str|None), `multipliers` (str|None), `max_time` (int|None), `rnd_time` (int|None), `overall_jails` (bool).
|
||||
- Add `bantime_escalation: BantimeEscalation | None` field to `Jail` in `app/models/jail.py`.
|
||||
- Add escalation fields to `JailConfig` in `app/models/config.py` (mirrored via `BantimeEscalation`).
|
||||
- Add escalation fields to `JailConfigUpdate` in `app/models/config.py`.
|
||||
|
||||
### 6b — Backend: Read escalation settings from fail2ban socket
|
||||
|
||||
- In `jail_service.get_jail_detail()`: fetch the seven `bantime.*` socket commands in the existing `asyncio.gather()` block; populate `bantime_escalation` on the returned `Jail`.
|
||||
- In `config_service.get_jail_config()`: same gather pattern; populate `bantime_escalation` on `JailConfig`.
|
||||
|
||||
### 6c — Backend: Write escalation settings to fail2ban socket
|
||||
|
||||
- In `config_service.update_jail_config()`: when `JailConfigUpdate.bantime_escalation` is provided, `set <jail> bantime.increment`, and any non-None sub-fields.
|
||||
|
||||
### 6d — Frontend: Update types
|
||||
|
||||
- `types/jail.ts`: add `BantimeEscalation` interface; add `bantime_escalation: BantimeEscalation | null` to `Jail`.
|
||||
- `types/config.ts`: add `bantime_escalation: BantimeEscalation | null` to `JailConfig`; add `BantimeEscalationUpdate` and include it in `JailConfigUpdate`.
|
||||
|
||||
### 6e — Frontend: Show escalation in Jail Detail
|
||||
|
||||
- In `JailDetailPage.tsx`, add a "Ban-time Escalation" info card that is only rendered when `bantime_escalation?.increment === true`.
|
||||
- Show: increment enabled indicator, factor, formula, multipliers, max time, random jitter.
|
||||
|
||||
### 6f — Frontend: Edit escalation in ConfigPage
|
||||
|
||||
- In `ConfigPage.tsx` `JailAccordionPanel`, add a "Ban-time Escalation" section with:
|
||||
- A `Switch` for `increment` (enable/disable).
|
||||
- When enabled: numeric inputs for `max_time` (seconds), `rnd_time` (seconds), `factor`; text inputs for `formula` and `multipliers`; Switch for `overall_jails`.
|
||||
- Saving triggers `updateJailConfig` with the escalation payload.
|
||||
|
||||
### 6g — Tests
|
||||
|
||||
- Backend: unit tests in `test_config_service.py` verifying that escalation fields are fetched and written.
|
||||
- Backend: router integration tests in `test_config.py` verifying the escalation round-trip.
|
||||
- Frontend: update `ConfigPageLogPath.test.tsx` mock `JailConfig` to include `bantime_escalation: null`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user