From 1e264ca4a132eb18c4c45c2c794081d2db727270 Mon Sep 17 00:00:00 2001 From: Donald Zou Date: Thu, 14 Aug 2025 22:36:14 +0800 Subject: [PATCH] Added Pydantic for configurations info --- src/modules/WireguardConfiguration.py | 20 ++++++++++++++++++- src/modules/WireguardConfigurationInfo.py | 24 +++++++++++++++++++++++ src/requirements.txt | 3 ++- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/modules/WireguardConfigurationInfo.py diff --git a/src/modules/WireguardConfiguration.py b/src/modules/WireguardConfiguration.py index ec9e4d77..76a1db7c 100644 --- a/src/modules/WireguardConfiguration.py +++ b/src/modules/WireguardConfiguration.py @@ -12,6 +12,7 @@ from .Peer import Peer from .PeerJobs import PeerJobs from .PeerShareLinks import PeerShareLinks from .Utilities import StringToBoolean, GenerateWireguardPublicKey, RegexMatch +from .WireguardConfigurationInfo import WireguardConfigurationInfo class WireguardConfiguration: @@ -122,6 +123,8 @@ class WireguardConfiguration: if self.getAutostartStatus() and not self.getStatus() and startup: self.toggleConfiguration() print(f"[WGDashboard] Autostart Configuration: {name}") + + self.configurationInfo: WireguardConfigurationInfo | None = None def __getProtocolPath(self): return self.DashboardConfig.GetConfig("Server", "wg_conf_path")[1] if self.Protocol == "wg" \ @@ -296,6 +299,12 @@ class WireguardConfiguration: sqlalchemy.Column('preshared_key', sqlalchemy.String(255)), extend_existing=True ) + self.infoTable = sqlalchemy.Table( + 'ConfigurationsInfo', self.metadata, + sqlalchemy.Column('ID', sqlalchemy.String(255), primary_key=True), + sqlalchemy.Column('Info', sqlalchemy.Text), + extend_existing=True + ) self.metadata.create_all(self.engine) @@ -1048,4 +1057,13 @@ class WireguardConfiguration: else: return { "sent": 0, "recv": 0 } else: - return { "sent": 0, "recv": 0 } \ No newline at end of file + return { "sent": 0, "recv": 0 } + + def readConfigurationInfo(self): + with self.engine.connect() as conn: + result = conn.execute( + self.infoTable.select().where( + self.infoTable.c.ID == self.Name + ) + ).mappings().fetchone() + return result \ No newline at end of file diff --git a/src/modules/WireguardConfigurationInfo.py b/src/modules/WireguardConfigurationInfo.py new file mode 100644 index 00000000..c91328c6 --- /dev/null +++ b/src/modules/WireguardConfigurationInfo.py @@ -0,0 +1,24 @@ +from pydantic import BaseModel, PositiveInt + +class OverridePeerSettingsClass(BaseModel): + DNS: str = '' + EndpointAllowedIPs: str = '' + MTU: str | int = '' + PersistentKeepalive: int | str = '' + PeerRemoteEndpoint: str = '' + ListenPort: int | str = '' + +class PeerGroupsClass(BaseModel): + Description: str = '' + BackgroundColor: str = '' + Peers: list[str] = [] + +class WireguardConfigurationInfo(BaseModel): + Description: str = '' + OverridePeerSettings: OverridePeerSettingsClass = OverridePeerSettingsClass(**{}) + PeerGroups: dict[str, PeerGroupsClass] = {} + + +if __name__ == '__main__': + d = WireguardConfigurationInfo.model_validate_json("{\"Description\": \"Hi!\"}") + print(d.model_dump()) \ No newline at end of file diff --git a/src/requirements.txt b/src/requirements.txt index b2266d57..bac3fa86 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -13,4 +13,5 @@ sqlalchemy_utils psycopg mysqlclient tzlocal -python-jose \ No newline at end of file +python-jose +pydantic \ No newline at end of file