from datetime import datetime from typing import Optional from pydantic import BaseModel # --- Auth --- class UserOut(BaseModel): id: int username: str email: str is_active: bool model_config = {"from_attributes": True} # --- Config --- class ConfigCreate(BaseModel): name: str description: str = "" is_active: bool = True class ConfigUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None is_active: Optional[bool] = None class ConfigOut(BaseModel): id: int name: str description: str is_active: bool created_at: datetime updated_at: datetime owner_id: int model_config = {"from_attributes": True} # --- Zone --- class ZoneCreate(BaseModel): name: str type: str options: str = "" class ZoneUpdate(BaseModel): name: Optional[str] = None type: Optional[str] = None options: Optional[str] = None class ZoneOut(BaseModel): id: int config_id: int name: str type: str options: str model_config = {"from_attributes": True} # --- Interface --- class InterfaceCreate(BaseModel): name: str zone_id: Optional[int] = None broadcast: str = "" options: str = "" class InterfaceUpdate(BaseModel): name: Optional[str] = None zone_id: Optional[int] = None broadcast: Optional[str] = None options: Optional[str] = None class InterfaceOut(BaseModel): id: int config_id: int name: str zone_id: Optional[int] broadcast: str options: str model_config = {"from_attributes": True} # --- Policy --- class PolicyCreate(BaseModel): src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None policy: str log_level: str = "" limit_burst: str = "" connlimit_mask: str = "" comment: str = "" position: int = 0 class PolicyUpdate(BaseModel): src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None policy: Optional[str] = None log_level: Optional[str] = None limit_burst: Optional[str] = None connlimit_mask: Optional[str] = None comment: Optional[str] = None position: Optional[int] = None class PolicyOut(BaseModel): id: int config_id: int src_zone_id: Optional[int] dst_zone_id: Optional[int] policy: str log_level: str limit_burst: str connlimit_mask: str comment: str position: int model_config = {"from_attributes": True} # --- Rule --- class RuleCreate(BaseModel): action: str src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None src_ip: str = "" dst_ip: str = "" proto: str = "" dport: str = "" sport: str = "" origdest: str = "" rate_limit: str = "" user_group: str = "" mark: str = "" connlimit: str = "" time: str = "" headers: str = "" switch_name: str = "" helper: str = "" comment: str = "" position: int = 0 class RuleUpdate(BaseModel): action: Optional[str] = None src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None src_ip: Optional[str] = None dst_ip: Optional[str] = None proto: Optional[str] = None dport: Optional[str] = None sport: Optional[str] = None origdest: Optional[str] = None rate_limit: Optional[str] = None user_group: Optional[str] = None mark: Optional[str] = None connlimit: Optional[str] = None time: Optional[str] = None headers: Optional[str] = None switch_name: Optional[str] = None helper: Optional[str] = None comment: Optional[str] = None position: Optional[int] = None class RuleOut(BaseModel): id: int config_id: int action: str src_zone_id: Optional[int] dst_zone_id: Optional[int] src_ip: str dst_ip: str proto: str dport: str sport: str origdest: str rate_limit: str user_group: str mark: str connlimit: str time: str headers: str switch_name: str helper: str comment: str position: int model_config = {"from_attributes": True} # --- Snat --- class SnatCreate(BaseModel): source_network: str out_interface: str to_address: str = "" proto: str = "" port: str = "" ipsec: str = "" mark: str = "" user_group: str = "" switch_name: str = "" origdest: str = "" probability: str = "" comment: str = "" class SnatUpdate(BaseModel): source_network: Optional[str] = None out_interface: Optional[str] = None to_address: Optional[str] = None proto: Optional[str] = None port: Optional[str] = None ipsec: Optional[str] = None mark: Optional[str] = None user_group: Optional[str] = None switch_name: Optional[str] = None origdest: Optional[str] = None probability: Optional[str] = None comment: Optional[str] = None class SnatOut(BaseModel): id: int config_id: int source_network: str out_interface: str to_address: str proto: str port: str ipsec: str mark: str user_group: str switch_name: str origdest: str probability: str comment: str model_config = {"from_attributes": True} # --- Host --- class HostCreate(BaseModel): zone_id: int interface: str subnet: str options: str = "" class HostUpdate(BaseModel): zone_id: Optional[int] = None interface: Optional[str] = None subnet: Optional[str] = None options: Optional[str] = None class HostOut(BaseModel): id: int config_id: int zone_id: int interface: str subnet: str options: str model_config = {"from_attributes": True} # --- Param --- class ParamCreate(BaseModel): name: str value: str class ParamUpdate(BaseModel): name: Optional[str] = None value: Optional[str] = None class ParamOut(BaseModel): id: int config_id: int name: str value: str model_config = {"from_attributes": True} # --- Generate --- class GenerateOut(BaseModel): zones: str interfaces: str policy: str rules: str snat: str hosts: str params: str