mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-05 14:51:13 +02:00
Use Pydantic to validate the server config file.
This commit is contained in:
1 parent
478119b40d
commit
30ebae207f
61 files changed
+871
-695
No files matched your search
@@ -15,7 +15,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from .config import ServerConfig
|
||||
from .iou_license import IOULicense
|
||||
from .links import Link
|
||||
from .common import ErrorMessage
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from pydantic import BaseModel, Field, SecretStr, validator
|
||||
from typing import List, Optional, Union
|
||||
from uuid import UUID, uuid4
|
||||
from enum import Enum
|
||||
@@ -51,7 +51,7 @@ class ComputeCreate(ComputeBase):
|
||||
"""
|
||||
|
||||
compute_id: Union[str, UUID] = Field(default_factory=uuid4)
|
||||
password: Optional[str] = None
|
||||
password: Optional[SecretStr] = None
|
||||
|
||||
class Config:
|
||||
schema_extra = {
|
||||
@@ -91,7 +91,7 @@ class ComputeUpdate(ComputeBase):
|
||||
protocol: Optional[Protocol] = None
|
||||
host: Optional[str] = None
|
||||
port: Optional[int] = Field(None, gt=0, le=65535)
|
||||
password: Optional[str] = None
|
||||
password: Optional[SecretStr] = None
|
||||
|
||||
class Config:
|
||||
schema_extra = {
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2021 GNS3 Technologies Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from enum import Enum
|
||||
from pydantic import BaseModel, Field, SecretStr, validator
|
||||
from typing import List
|
||||
|
||||
|
||||
class ControllerSettings(BaseModel):
|
||||
|
||||
jwt_secret_key: str = None
|
||||
jwt_algorithm: str = "HS256"
|
||||
jwt_access_token_expire_minutes: int = 1440
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class VPCSSettings(BaseModel):
|
||||
|
||||
vpcs_path: str = "vpcs"
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class DynamipsSettings(BaseModel):
|
||||
|
||||
allocate_aux_console_ports: bool = False
|
||||
mmap_support: bool = True
|
||||
dynamips_path: str = "dynamips"
|
||||
sparse_memory_support: bool = True
|
||||
ghost_ios_support: bool = True
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class IOUSettings(BaseModel):
|
||||
|
||||
iourc_path: str = None
|
||||
license_check: bool = True
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class QemuSettings(BaseModel):
|
||||
|
||||
enable_monitor: bool = True
|
||||
monitor_host: str = "127.0.0.1"
|
||||
enable_hardware_acceleration: bool = True
|
||||
require_hardware_acceleration: bool = False
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class VirtualBoxSettings(BaseModel):
|
||||
|
||||
vboxmanage_path: str = None
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class VMwareSettings(BaseModel):
|
||||
|
||||
vmrun_path: str = None
|
||||
vmnet_start_range: int = Field(2, ge=1, le=255)
|
||||
vmnet_end_range: int = Field(255, ge=1, le=255) # should be limited to 19 on Windows
|
||||
block_host_traffic: bool = False
|
||||
|
||||
@validator("vmnet_end_range")
|
||||
def vmnet_port_range(cls, v, values):
|
||||
if "vmnet_start_range" in values and v <= values["vmnet_start_range"]:
|
||||
raise ValueError("vmnet_end_range must be > vmnet_start_range")
|
||||
return v
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
|
||||
|
||||
class ServerProtocol(str, Enum):
|
||||
|
||||
http = "http"
|
||||
https = "https"
|
||||
|
||||
|
||||
class ServerSettings(BaseModel):
|
||||
|
||||
protocol: ServerProtocol = ServerProtocol.http
|
||||
host: str = "0.0.0.0"
|
||||
port: int = Field(3080, gt=0, le=65535)
|
||||
secrets_dir: str = None
|
||||
ssl: bool = False
|
||||
certfile: str = None
|
||||
certkey: str = None
|
||||
images_path: str = "~/GNS3/images"
|
||||
projects_path: str = "~/GNS3/projects"
|
||||
appliances_path: str = "~/GNS3/appliances"
|
||||
symbols_path: str = "~/GNS3/symbols"
|
||||
configs_path: str = "~/GNS3/configs"
|
||||
report_errors: bool = True
|
||||
additional_images_paths: List[str] = Field(default_factory=list)
|
||||
console_start_port_range: int = Field(5000, gt=0, le=65535)
|
||||
console_end_port_range: int = Field(10000, gt=0, le=65535)
|
||||
vnc_console_start_port_range: int = Field(5900, ge=5900, le=65535)
|
||||
vnc_console_end_port_range: int = Field(10000, ge=5900, le=65535)
|
||||
udp_start_port_range: int = Field(10000, gt=0, le=65535)
|
||||
udp_end_port_range: int = Field(30000, gt=0, le=65535)
|
||||
ubridge_path: str = "ubridge"
|
||||
user: str = None
|
||||
password: SecretStr = None
|
||||
auth: bool = False
|
||||
allowed_interfaces: List[str] = Field(default_factory=list)
|
||||
default_nat_interface: str = None
|
||||
logfile: str = None
|
||||
logmaxsize: int = 10000000 # default is 10MB
|
||||
logbackupcount: int = 10
|
||||
logcompression: bool = False
|
||||
|
||||
local: bool = False
|
||||
allow_remote_console: bool = False
|
||||
quiet: bool = False
|
||||
debug: bool = False
|
||||
|
||||
@validator("additional_images_paths", pre=True)
|
||||
def split_additional_images_paths(cls, v):
|
||||
if v:
|
||||
return v.split(';')
|
||||
return list()
|
||||
|
||||
@validator("allowed_interfaces", pre=True)
|
||||
def split_allowed_interfaces(cls, v):
|
||||
if v:
|
||||
return v.split(',')
|
||||
return list()
|
||||
|
||||
@validator("console_end_port_range")
|
||||
def console_port_range(cls, v, values):
|
||||
if "console_start_port_range" in values and v <= values["console_start_port_range"]:
|
||||
raise ValueError("console_end_port_range must be > console_start_port_range")
|
||||
return v
|
||||
|
||||
@validator("vnc_console_end_port_range")
|
||||
def vnc_console_port_range(cls, v, values):
|
||||
if "vnc_console_start_port_range" in values and v <= values["vnc_console_start_port_range"]:
|
||||
raise ValueError("vnc_console_end_port_range must be > vnc_console_start_port_range")
|
||||
return v
|
||||
|
||||
@validator("auth")
|
||||
def validate_enable_auth(cls, v, values):
|
||||
|
||||
if v is True:
|
||||
if "user" not in values or not values["user"]:
|
||||
raise ValueError("HTTP authentication is enabled but no username is configured")
|
||||
return v
|
||||
|
||||
class Config:
|
||||
validate_assignment = True
|
||||
anystr_strip_whitespace = True
|
||||
use_enum_values = True
|
||||
|
||||
|
||||
class ServerConfig(BaseModel):
|
||||
|
||||
Server: ServerSettings= ServerSettings()
|
||||
Controller: ControllerSettings = ControllerSettings()
|
||||
VPCS: VPCSSettings = VPCSSettings()
|
||||
Dynamips: DynamipsSettings = DynamipsSettings()
|
||||
IOU: IOUSettings = IOUSettings()
|
||||
Qemu: QemuSettings = QemuSettings()
|
||||
VirtualBox: VirtualBoxSettings = VirtualBoxSettings()
|
||||
VMware: VMwareSettings = VMwareSettings()
|
||||
Reference in new issue
Block a user