63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
import re
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
ALLOWED_NAME_REGEX = re.compile(r"^[A-Za-z0-9_-]+$")
|
|
|
|
|
|
class RouterBase(BaseModel):
|
|
name: str = Field(min_length=1, max_length=120)
|
|
host: str = Field(min_length=1, max_length=255)
|
|
port: int = Field(default=22, ge=1, le=65535)
|
|
ssh_user: str = Field(default="admin", min_length=1, max_length=120)
|
|
ssh_key: str | None = None
|
|
ssh_password: str | None = None
|
|
|
|
@field_validator("name")
|
|
@classmethod
|
|
def validate_name(cls, value: str) -> str:
|
|
if not ALLOWED_NAME_REGEX.match(value):
|
|
raise ValueError("Only letters, digits, dashes and underscores are allowed")
|
|
return value
|
|
|
|
|
|
class RouterCreate(RouterBase):
|
|
pass
|
|
|
|
|
|
class RouterUpdate(BaseModel):
|
|
name: str | None = None
|
|
host: str | None = None
|
|
port: int | None = Field(default=None, ge=1, le=65535)
|
|
ssh_user: str | None = None
|
|
ssh_key: str | None = None
|
|
ssh_password: str | None = None
|
|
|
|
|
|
class RouterResponse(RouterBase):
|
|
id: int
|
|
owner_id: int
|
|
uses_global_ssh_key: bool = False
|
|
has_effective_ssh_key: bool = False
|
|
last_connection_status: bool | None = None
|
|
last_connection_tested_at: datetime | None = None
|
|
last_connection_error: str | None = None
|
|
last_connection_hostname: str | None = None
|
|
last_connection_model: str | None = None
|
|
last_connection_version: str | None = None
|
|
last_connection_uptime: str | None = None
|
|
created_at: datetime | None = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class RouterTestConnection(BaseModel):
|
|
success: bool
|
|
tested_at: datetime
|
|
model: str
|
|
uptime: str
|
|
hostname: str
|
|
version: str | None = None
|
|
error: str | None = None
|