- Implemented RuleManager and JSON storage - Added background enforcement scheduler - Added Web UI for rule management at /ui/rules - Bumped version to 0.3.0
124 lines
2.6 KiB
Python
124 lines
2.6 KiB
Python
from enum import Enum
|
|
from typing import List, Optional, Dict
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class DayOfWeek(str, Enum):
|
|
MONDAY = "mon"
|
|
TUESDAY = "tue"
|
|
WEDNESDAY = "wed"
|
|
THURSDAY = "thu"
|
|
FRIDAY = "fri"
|
|
SATURDAY = "sat"
|
|
SUNDAY = "sun"
|
|
|
|
|
|
class TimeWindow(BaseModel):
|
|
days: List[DayOfWeek]
|
|
start_time: str = Field(..., pattern=r"^\d{2}:\d{2}$", description="HH:MM format")
|
|
end_time: str = Field(..., pattern=r"^\d{2}:\d{2}$", description="HH:MM format")
|
|
|
|
|
|
class AccessRule(BaseModel):
|
|
user: str
|
|
enabled: bool = True
|
|
auto_reenable: bool = False
|
|
allowed_windows: List[TimeWindow] = []
|
|
|
|
|
|
class RuleSet(BaseModel):
|
|
rules: Dict[str, AccessRule] = {} # Keyed by username for O(1) lookup
|
|
|
|
|
|
class ActionRequest(BaseModel):
|
|
countdown: Optional[int] = Field(default=None, ge=0, description="Seconds for countdown")
|
|
sound: Optional[bool] = Field(default=None, description="Play sound alongside notification")
|
|
message: Optional[str] = Field(
|
|
default=None,
|
|
description="Optional message to show the user; falls back to default text.",
|
|
)
|
|
|
|
|
|
class ActionResponse(BaseModel):
|
|
user: str
|
|
action: str
|
|
dry_run: bool
|
|
steps: List[str]
|
|
logged_in: bool
|
|
|
|
|
|
class UserStatus(BaseModel):
|
|
user: str
|
|
logged_in: bool
|
|
account_locked: bool
|
|
|
|
|
|
class LoginRequest(BaseModel):
|
|
username: str
|
|
password: str
|
|
|
|
|
|
class LoginResponse(BaseModel):
|
|
token: str
|
|
expires_in: int
|
|
|
|
|
|
class UpdateStatus(BaseModel):
|
|
current_version: str
|
|
last_status: str
|
|
last_error: Optional[str] = None
|
|
last_timestamp: Optional[str] = None
|
|
enrolled: bool = False
|
|
|
|
|
|
class EnrollRequest(BaseModel):
|
|
enroll_token: Optional[str] = None
|
|
|
|
|
|
class EnrollResponse(BaseModel):
|
|
enrolled: bool
|
|
message: str
|
|
|
|
|
|
class UpdateCheckResponse(BaseModel):
|
|
available: bool
|
|
latest_version: str
|
|
artifact_url: str
|
|
sha256: str
|
|
message: Optional[str] = None
|
|
|
|
|
|
class UpdateActionResponse(BaseModel):
|
|
started: bool
|
|
message: str
|
|
|
|
|
|
class UpdateLogEntry(BaseModel):
|
|
timestamp: str
|
|
status: str
|
|
message: Optional[str] = None
|
|
version: Optional[str] = None
|
|
error: Optional[str] = None
|
|
device_id: Optional[str] = None
|
|
|
|
|
|
class UpdateServiceStatus(BaseModel):
|
|
url: str
|
|
reachable: bool
|
|
status_code: Optional[int] = None
|
|
error: Optional[str] = None
|
|
checked_url: str
|
|
environment: str
|
|
|
|
|
|
class SystemMetrics(BaseModel):
|
|
cpu_percent: float
|
|
ram_total_mb: float
|
|
ram_used_percent: float
|
|
gpu_vram_total_mb: Optional[float] = None
|
|
gpu_vram_used_percent: Optional[float] = None
|
|
gpu_present: bool = False
|
|
net_rx_mbps: float
|
|
net_tx_mbps: float
|