Added support to postgresql and Mysql with SqlAlchemy

This commit is contained in:
Donald Zou 2025-05-05 00:40:29 +08:00
parent 16051981d7
commit 6e6cd9a7e5
4 changed files with 25 additions and 14 deletions

View File

@ -1799,7 +1799,10 @@ class DashboardConfig:
"welcome_session": "true" "welcome_session": "true"
}, },
"Database":{ "Database":{
"type": "sqlite" "type": "sqlite",
"host": "",
"username": "",
"password": ""
}, },
"Email":{ "Email":{
"server": "", "server": "",
@ -1825,6 +1828,13 @@ class DashboardConfig:
self.APIAccessed = False self.APIAccessed = False
self.SetConfig("Server", "version", DASHBOARD_VERSION) self.SetConfig("Server", "version", DASHBOARD_VERSION)
def getConnectionString(self, database) -> str or None:
if self.GetConfig("Database", "type")[1] == "sqlite":
return f'sqlite:///{os.path.join(CONFIGURATION_PATH, "db", f".db")}'
elif self.GetConfig("Database", "type")[1] == "postgresql":
return f'postgresql+psycopg2://{self.GetConfig("Database", "username")[1]}:{self.GetConfig("Database", "password")[1]}@{self.GetConfig("Database", "host")[1]}/{database}'
return None
def __createAPIKeyTable(self): def __createAPIKeyTable(self):
existingTable = sqlSelect("SELECT name FROM sqlite_master WHERE type='table' AND name = 'DashboardAPIKeys'").fetchall() existingTable = sqlSelect("SELECT name FROM sqlite_master WHERE type='table' AND name = 'DashboardAPIKeys'").fetchall()
if len(existingTable) == 0: if len(existingTable) == 0:
@ -3178,8 +3188,8 @@ def InitWireguardConfigurationsList(startup: bool = False):
AllPeerShareLinks: PeerShareLinks = PeerShareLinks() AllPeerShareLinks: PeerShareLinks = PeerShareLinks()
AllPeerJobs: PeerJobs = PeerJobs() AllPeerJobs: PeerJobs = PeerJobs()
JobLogger: PeerJobLogger = PeerJobLogger(CONFIGURATION_PATH, AllPeerJobs) JobLogger: PeerJobLogger = PeerJobLogger(CONFIGURATION_PATH, AllPeerJobs, DashboardConfig)
DashboardLogger: DashboardLogger = DashboardLogger(CONFIGURATION_PATH) DashboardLogger: DashboardLogger = DashboardLogger(CONFIGURATION_PATH, DashboardConfig)
_, app_ip = DashboardConfig.GetConfig("Server", "app_ip") _, app_ip = DashboardConfig.GetConfig("Server", "app_ip")
_, app_port = DashboardConfig.GetConfig("Server", "app_port") _, app_port = DashboardConfig.GetConfig("Server", "app_port")
_, WG_CONF_PATH = DashboardConfig.GetConfig("Server", "wg_conf_path") _, WG_CONF_PATH = DashboardConfig.GetConfig("Server", "wg_conf_path")

View File

@ -6,13 +6,13 @@ import sqlalchemy as db
from datetime import datetime from datetime import datetime
class DashboardLogger: class DashboardLogger:
def __init__(self, CONFIGURATION_PATH): def __init__(self, CONFIGURATION_PATH, DashboardConfig):
self.engine = db.create_engine(f'sqlite:///{os.path.join(CONFIGURATION_PATH, "db", "wgdashboard_log.db")}') self.engine = db.create_engine(DashboardConfig.getConnectionString("wgdashboard_log"))
self.loggerdb = self.engine.connect() self.loggerdb = self.engine.connect()
self.metadata = db.MetaData() self.metadata = db.MetaData()
self.dashboardLoggerTable = db.Table('DashboardLog', self.metadata, self.dashboardLoggerTable = db.Table('DashboardLog', self.metadata,
db.Column('LogID', db.VARCHAR, nullable=False, primary_key=True), db.Column('LogID', db.VARCHAR, nullable=False, primary_key=True),
db.Column('LogDate', db.DATETIME, db.Column('LogDate', (db.DATETIME if DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else db.TIMESTAMP),
server_default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")), server_default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")),
db.Column('URL', db.VARCHAR), db.Column('URL', db.VARCHAR),
db.Column('IP', db.VARCHAR), db.Column('IP', db.VARCHAR),

View File

@ -7,17 +7,17 @@ from .Log import Log
from datetime import datetime from datetime import datetime
class PeerJobLogger: class PeerJobLogger:
def __init__(self, CONFIGURATION_PATH, AllPeerJobs): def __init__(self, CONFIGURATION_PATH, AllPeerJobs, DashboardConfig):
self.engine = db.create_engine(f'sqlite:///{os.path.join(CONFIGURATION_PATH, "db", "wgdashboard_log.db")}') self.engine = db.create_engine(DashboardConfig.getConnectionString("wgdashboard_log"))
self.loggerdb = self.engine.connect() self.loggerdb = self.engine.connect()
self.metadata = db.MetaData() self.metadata = db.MetaData()
self.jobLogTable = db.Table('JobLog', self.metadata, self.jobLogTable = db.Table('JobLog', self.metadata,
db.Column('LogID', db.VARCHAR, nullable=False, primary_key=True), db.Column('LogID', db.String, nullable=False, primary_key=True),
db.Column('JobID', db.VARCHAR, nullable=False), db.Column('JobID', db.String, nullable=False),
db.Column('LogDate', db.DATETIME, db.Column('LogDate', (db.DATETIME if DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else db.TIMESTAMP),
server_default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")), server_default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")),
db.Column('Status', db.VARCHAR, nullable=False), db.Column('Status', db.String, nullable=False),
db.Column('Message', db.VARCHAR) db.Column('Message', db.String)
) )
self.logs: list[Log] = [] self.logs: list[Log] = []
self.metadata.create_all(self.engine) self.metadata.create_all(self.engine)

View File

@ -9,3 +9,4 @@ gunicorn
requests requests
tcconfig tcconfig
sqlalchemy sqlalchemy
psycopg2