"""Configuration view/edit Pydantic models. Request, response, and domain models for the config router and service. """ from pydantic import BaseModel, ConfigDict, Field class JailConfigUpdate(BaseModel): """Payload for ``PUT /api/config/jails/{name}``.""" model_config = ConfigDict(strict=True) ban_time: int | None = Field(default=None, description="Ban duration in seconds. -1 for permanent.") max_retry: int | None = Field(default=None, ge=1) find_time: int | None = Field(default=None, ge=1) fail_regex: list[str] | None = Field(default=None, description="Failure detection regex patterns.") ignore_regex: list[str] | None = Field(default=None) date_pattern: str | None = Field(default=None) dns_mode: str | None = Field(default=None, description="DNS lookup mode: raw | warn | no.") enabled: bool | None = Field(default=None) class RegexTestRequest(BaseModel): """Payload for ``POST /api/config/regex-test``.""" model_config = ConfigDict(strict=True) log_line: str = Field(..., description="Sample log line to test against.") fail_regex: str = Field(..., description="Regex pattern to match.") class RegexTestResponse(BaseModel): """Result of a regex test.""" model_config = ConfigDict(strict=True) matched: bool = Field(..., description="Whether the pattern matched the log line.") groups: list[str] = Field( default_factory=list, description="Named groups captured by a successful match.", ) error: str | None = Field( default=None, description="Compilation error message if the regex is invalid.", ) class GlobalConfigResponse(BaseModel): """Response for ``GET /api/config/global``.""" model_config = ConfigDict(strict=True) log_level: str log_target: str db_purge_age: int = Field(..., description="Seconds after which ban records are purged from the fail2ban DB.") db_max_matches: int = Field(..., description="Maximum stored log-line matches per ban record.")