mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2025-10-03 15:56:17 +00:00
refac: rework the variable times, mostly in ConnectionString
This commit is contained in:
@@ -3,19 +3,19 @@ import configparser
|
|||||||
import os
|
import os
|
||||||
from sqlalchemy_utils import database_exists, create_database
|
from sqlalchemy_utils import database_exists, create_database
|
||||||
|
|
||||||
# Ensure SQLite folder exists
|
default_db = "wgdashboard"
|
||||||
SQLITE_PATH = "db"
|
default_log_db = "wgdashboard_log"
|
||||||
os.makedirs(SQLITE_PATH, exist_ok=True)
|
default_job_db = "wgdashboard_job"
|
||||||
|
sqlite_path = "db"
|
||||||
DEFAULT_DB = "wgdashboard"
|
if os.path.exists(sqlite_path):
|
||||||
DEFAULT_LOG_DB = "wgdashboard_log"
|
os.makedirs(sqlite_path, exist_ok=True)
|
||||||
DEFAULT_JOB_DB = "wgdashboard_job"
|
|
||||||
|
|
||||||
def ConnectionString(database_name: str) -> str:
|
def ConnectionString(database_name: str) -> str:
|
||||||
"""
|
"""
|
||||||
Returns a SQLAlchemy-compatible connection string for the chosen database.
|
Returns a SQLAlchemy-compatible connection string for the chosen database.
|
||||||
Creates the database if it doesn't exist.
|
Creates the database if it doesn't exist.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Read and parse the INI file once at startup
|
# Read and parse the INI file once at startup
|
||||||
parser = configparser.ConfigParser(strict=False)
|
parser = configparser.ConfigParser(strict=False)
|
||||||
parser.read("wg-dashboard.ini")
|
parser.read("wg-dashboard.ini")
|
||||||
@@ -35,7 +35,7 @@ def ConnectionString(database_name: str) -> str:
|
|||||||
host = parser.get("Database", "host")
|
host = parser.get("Database", "host")
|
||||||
cn = f"mysql+pymysql://{username}:{password}@{host}/{database_name}"
|
cn = f"mysql+pymysql://{username}:{password}@{host}/{database_name}"
|
||||||
else:
|
else:
|
||||||
cn = f'sqlite:///{os.path.join(sqlitePath, f"{database}.db")}'
|
cn = f'sqlite:///{os.path.join(sqlite_path, f"{database_name}.db")}'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not database_exists(cn):
|
if not database_exists(cn):
|
||||||
|
@@ -8,7 +8,7 @@ import pyotp
|
|||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
from .DashboardClientsPeerAssignment import DashboardClientsPeerAssignment
|
from .DashboardClientsPeerAssignment import DashboardClientsPeerAssignment
|
||||||
from .DashboardClientsTOTP import DashboardClientsTOTP
|
from .DashboardClientsTOTP import DashboardClientsTOTP
|
||||||
from .DashboardOIDC import DashboardOIDC
|
from .DashboardOIDC import DashboardOIDC
|
||||||
@@ -20,7 +20,7 @@ from flask import session
|
|||||||
class DashboardClients:
|
class DashboardClients:
|
||||||
def __init__(self, wireguardConfigurations):
|
def __init__(self, wireguardConfigurations):
|
||||||
self.logger = DashboardLogger()
|
self.logger = DashboardLogger()
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.OIDC = DashboardOIDC("Client")
|
self.OIDC = DashboardOIDC("Client")
|
||||||
|
|
||||||
@@ -32,10 +32,10 @@ class DashboardClients:
|
|||||||
db.Column('TotpKey', db.String(500)),
|
db.Column('TotpKey', db.String(500)),
|
||||||
db.Column('TotpKeyVerified', db.Integer),
|
db.Column('TotpKeyVerified', db.Integer),
|
||||||
db.Column('CreatedDate',
|
db.Column('CreatedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP),
|
||||||
server_default=db.func.now()),
|
server_default=db.func.now()),
|
||||||
db.Column('DeletedDate',
|
db.Column('DeletedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP)),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP)),
|
||||||
extend_existing=True,
|
extend_existing=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,10 +46,10 @@ class DashboardClients:
|
|||||||
db.Column('ProviderIssuer', db.String(500), nullable=False, index=True),
|
db.Column('ProviderIssuer', db.String(500), nullable=False, index=True),
|
||||||
db.Column('ProviderSubject', db.String(500), nullable=False, index=True),
|
db.Column('ProviderSubject', db.String(500), nullable=False, index=True),
|
||||||
db.Column('CreatedDate',
|
db.Column('CreatedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP),
|
||||||
server_default=db.func.now()),
|
server_default=db.func.now()),
|
||||||
db.Column('DeletedDate',
|
db.Column('DeletedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP)),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP)),
|
||||||
extend_existing=True,
|
extend_existing=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -65,10 +65,10 @@ class DashboardClients:
|
|||||||
db.Column('ResetToken', db.String(255), nullable=False, primary_key=True),
|
db.Column('ResetToken', db.String(255), nullable=False, primary_key=True),
|
||||||
db.Column('ClientID', db.String(255), nullable=False),
|
db.Column('ClientID', db.String(255), nullable=False),
|
||||||
db.Column('CreatedDate',
|
db.Column('CreatedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP),
|
||||||
server_default=db.func.now()),
|
server_default=db.func.now()),
|
||||||
db.Column('ExpiryDate',
|
db.Column('ExpiryDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP)),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP)),
|
||||||
extend_existing=True
|
extend_existing=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
from .DashboardLogger import DashboardLogger
|
from .DashboardLogger import DashboardLogger
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .WireguardConfiguration import WireguardConfiguration
|
from .WireguardConfiguration import WireguardConfiguration
|
||||||
@@ -31,7 +31,7 @@ class Assignment:
|
|||||||
class DashboardClientsPeerAssignment:
|
class DashboardClientsPeerAssignment:
|
||||||
def __init__(self, wireguardConfigurations: dict[str, WireguardConfiguration]):
|
def __init__(self, wireguardConfigurations: dict[str, WireguardConfiguration]):
|
||||||
self.logger = DashboardLogger()
|
self.logger = DashboardLogger()
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.wireguardConfigurations = wireguardConfigurations
|
self.wireguardConfigurations = wireguardConfigurations
|
||||||
self.dashboardClientsPeerAssignmentTable = db.Table(
|
self.dashboardClientsPeerAssignmentTable = db.Table(
|
||||||
@@ -41,10 +41,10 @@ class DashboardClientsPeerAssignment:
|
|||||||
db.Column('ConfigurationName', db.String(255)),
|
db.Column('ConfigurationName', db.String(255)),
|
||||||
db.Column('PeerID', db.String(500)),
|
db.Column('PeerID', db.String(500)),
|
||||||
db.Column('AssignedDate',
|
db.Column('AssignedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP),
|
||||||
server_default=db.func.now()),
|
server_default=db.func.now()),
|
||||||
db.Column('UnassignedDate',
|
db.Column('UnassignedDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP)),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP)),
|
||||||
extend_existing=True
|
extend_existing=True
|
||||||
)
|
)
|
||||||
self.metadata.create_all(self.engine)
|
self.metadata.create_all(self.engine)
|
||||||
|
@@ -3,19 +3,19 @@ import hashlib
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
|
|
||||||
|
|
||||||
class DashboardClientsTOTP:
|
class DashboardClientsTOTP:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.dashboardClientsTOTPTable = db.Table(
|
self.dashboardClientsTOTPTable = db.Table(
|
||||||
'DashboardClientsTOTPTokens', self.metadata,
|
'DashboardClientsTOTPTokens', self.metadata,
|
||||||
db.Column("Token", db.String(500), primary_key=True, index=True),
|
db.Column("Token", db.String(500), primary_key=True, index=True),
|
||||||
db.Column("ClientID", db.String(500), index=True),
|
db.Column("ClientID", db.String(500), index=True),
|
||||||
db.Column(
|
db.Column(
|
||||||
"ExpireTime", (db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP)
|
"ExpireTime", (db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
self.metadata.create_all(self.engine)
|
self.metadata.create_all(self.engine)
|
||||||
|
@@ -7,7 +7,7 @@ import sqlalchemy as db
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
from .Utilities import (
|
from .Utilities import (
|
||||||
GetRemoteEndpoint, ValidateDNSAddress
|
GetRemoteEndpoint, ValidateDNSAddress
|
||||||
)
|
)
|
||||||
@@ -100,7 +100,7 @@ class DashboardConfig:
|
|||||||
self.SetConfig("Server", "version", DashboardConfig.DashboardVersion)
|
self.SetConfig("Server", "version", DashboardConfig.DashboardVersion)
|
||||||
self.SaveConfig()
|
self.SaveConfig()
|
||||||
|
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.dbMetadata = db.MetaData()
|
self.dbMetadata = db.MetaData()
|
||||||
self.__createAPIKeyTable()
|
self.__createAPIKeyTable()
|
||||||
self.DashboardAPIKeys = self.__getAPIKeys()
|
self.DashboardAPIKeys = self.__getAPIKeys()
|
||||||
|
@@ -4,18 +4,18 @@ Dashboard Logger Class
|
|||||||
import uuid
|
import uuid
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB, DEFAULT_LOG_DB
|
from .ConnectionString import ConnectionString, default_db, default_log_db
|
||||||
|
|
||||||
|
|
||||||
class DashboardLogger:
|
class DashboardLogger:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_LOG_DB))
|
self.engine = db.create_engine(ConnectionString(default_log_db))
|
||||||
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.String(255), nullable=False, primary_key=True),
|
db.Column('LogID', db.String(255), nullable=False, primary_key=True),
|
||||||
db.Column('LogDate',
|
db.Column('LogDate',
|
||||||
(db.DATETIME if 'sqlite:///' in ConnectionString(DEFAULT_DB) else db.TIMESTAMP),
|
(db.DATETIME if 'sqlite:///' in ConnectionString(default_db) else db.TIMESTAMP),
|
||||||
server_default=db.func.now()),
|
server_default=db.func.now()),
|
||||||
db.Column('URL', db.String(255)),
|
db.Column('URL', db.String(255)),
|
||||||
db.Column('IP', db.String(255)),
|
db.Column('IP', db.String(255)),
|
||||||
|
@@ -8,7 +8,7 @@ from datetime import datetime, timedelta
|
|||||||
import requests
|
import requests
|
||||||
from pydantic import BaseModel, field_serializer
|
from pydantic import BaseModel, field_serializer
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
|
|
||||||
WebHookActions = ['peer_created', 'peer_deleted', 'peer_updated']
|
WebHookActions = ['peer_created', 'peer_deleted', 'peer_updated']
|
||||||
@@ -40,7 +40,7 @@ class WebHookSessionLogs(BaseModel):
|
|||||||
|
|
||||||
class DashboardWebHooks:
|
class DashboardWebHooks:
|
||||||
def __init__(self, DashboardConfig):
|
def __init__(self, DashboardConfig):
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.webHooksTable = db.Table(
|
self.webHooksTable = db.Table(
|
||||||
'DashboardWebHooks', self.metadata,
|
'DashboardWebHooks', self.metadata,
|
||||||
@@ -201,7 +201,7 @@ class DashboardWebHooks:
|
|||||||
|
|
||||||
class WebHookSession:
|
class WebHookSession:
|
||||||
def __init__(self, webHook: WebHook, data: dict[str, str]):
|
def __init__(self, webHook: WebHook, data: dict[str, str]):
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.webHookSessionsTable = db.Table('DashboardWebHookSessions', self.metadata, autoload_with=self.engine)
|
self.webHookSessionsTable = db.Table('DashboardWebHookSessions', self.metadata, autoload_with=self.engine)
|
||||||
self.webHook = webHook
|
self.webHook = webHook
|
||||||
|
@@ -2,7 +2,7 @@ import uuid
|
|||||||
|
|
||||||
from pydantic import BaseModel, field_serializer
|
from pydantic import BaseModel, field_serializer
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
|
|
||||||
|
|
||||||
class NewConfigurationTemplate(BaseModel):
|
class NewConfigurationTemplate(BaseModel):
|
||||||
@@ -14,7 +14,7 @@ class NewConfigurationTemplate(BaseModel):
|
|||||||
|
|
||||||
class NewConfigurationTemplates:
|
class NewConfigurationTemplates:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.templatesTable = db.Table(
|
self.templatesTable = db.Table(
|
||||||
'NewConfigurationTemplates', self.metadata,
|
'NewConfigurationTemplates', self.metadata,
|
||||||
|
@@ -4,12 +4,12 @@ Peer Job Logger
|
|||||||
import uuid
|
import uuid
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_LOG_DB
|
from .ConnectionString import ConnectionString, default_log_db
|
||||||
from .Log import Log
|
from .Log import Log
|
||||||
|
|
||||||
class PeerJobLogger:
|
class PeerJobLogger:
|
||||||
def __init__(self, AllPeerJobs, DashboardConfig):
|
def __init__(self, AllPeerJobs, DashboardConfig):
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_LOG_DB))
|
self.engine = db.create_engine(ConnectionString(default_log_db))
|
||||||
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.String(255), nullable=False, primary_key=True),
|
db.Column('LogID', db.String(255), nullable=False, primary_key=True),
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
"""
|
"""
|
||||||
Peer Jobs
|
Peer Jobs
|
||||||
"""
|
"""
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_JOB_DB
|
from .ConnectionString import ConnectionString, default_job_db
|
||||||
from .PeerJob import PeerJob
|
from .PeerJob import PeerJob
|
||||||
from .PeerJobLogger import PeerJobLogger
|
from .PeerJobLogger import PeerJobLogger
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
@@ -11,7 +11,7 @@ from flask import current_app
|
|||||||
class PeerJobs:
|
class PeerJobs:
|
||||||
def __init__(self, DashboardConfig, WireguardConfigurations):
|
def __init__(self, DashboardConfig, WireguardConfigurations):
|
||||||
self.Jobs: list[PeerJob] = []
|
self.Jobs: list[PeerJob] = []
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_JOB_DB))
|
self.engine = db.create_engine(ConnectionString(default_job_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.peerJobTable = db.Table('PeerJobs', self.metadata,
|
self.peerJobTable = db.Table('PeerJobs', self.metadata,
|
||||||
db.Column('JobID', db.String(255), nullable=False, primary_key=True),
|
db.Column('JobID', db.String(255), nullable=False, primary_key=True),
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
from .PeerShareLink import PeerShareLink
|
from .PeerShareLink import PeerShareLink
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -10,7 +10,7 @@ Peer Share Links
|
|||||||
class PeerShareLinks:
|
class PeerShareLinks:
|
||||||
def __init__(self, DashboardConfig, WireguardConfigurations):
|
def __init__(self, DashboardConfig, WireguardConfigurations):
|
||||||
self.Links: list[PeerShareLink] = []
|
self.Links: list[PeerShareLink] = []
|
||||||
self.engine = db.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine = db.create_engine(ConnectionString(default_db))
|
||||||
self.metadata = db.MetaData()
|
self.metadata = db.MetaData()
|
||||||
self.peerShareLinksTable = db.Table(
|
self.peerShareLinksTable = db.Table(
|
||||||
'PeerShareLinks', self.metadata,
|
'PeerShareLinks', self.metadata,
|
||||||
|
@@ -10,7 +10,7 @@ from datetime import datetime, timedelta
|
|||||||
from itertools import islice
|
from itertools import islice
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString, DEFAULT_DB
|
from .ConnectionString import ConnectionString, default_db
|
||||||
from .DashboardConfig import DashboardConfig
|
from .DashboardConfig import DashboardConfig
|
||||||
from .Peer import Peer
|
from .Peer import Peer
|
||||||
from .PeerJobs import PeerJobs
|
from .PeerJobs import PeerJobs
|
||||||
@@ -64,7 +64,7 @@ class WireguardConfiguration:
|
|||||||
self.AllPeerShareLinks = AllPeerShareLinks
|
self.AllPeerShareLinks = AllPeerShareLinks
|
||||||
self.DashboardWebHooks = DashboardWebHooks
|
self.DashboardWebHooks = DashboardWebHooks
|
||||||
self.configPath = os.path.join(self.__getProtocolPath(), f'{self.Name}.conf')
|
self.configPath = os.path.join(self.__getProtocolPath(), f'{self.Name}.conf')
|
||||||
self.engine: sqlalchemy.Engine = sqlalchemy.create_engine(ConnectionString(DEFAULT_DB))
|
self.engine: sqlalchemy.Engine = sqlalchemy.create_engine(ConnectionString(default_db))
|
||||||
self.metadata: sqlalchemy.MetaData = sqlalchemy.MetaData()
|
self.metadata: sqlalchemy.MetaData = sqlalchemy.MetaData()
|
||||||
self.dbType = self.DashboardConfig.GetConfig("Database", "type")[1]
|
self.dbType = self.DashboardConfig.GetConfig("Database", "type")[1]
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user