diff --git a/src/modules/DashboardLogger.py b/src/modules/DashboardLogger.py index 31f3b01..546b52d 100644 --- a/src/modules/DashboardLogger.py +++ b/src/modules/DashboardLogger.py @@ -1,34 +1,40 @@ """ Dashboard Logger Class """ -import sqlite3, os, uuid +import os, uuid +import sqlalchemy as db +from datetime import datetime class DashboardLogger: def __init__(self, CONFIGURATION_PATH): - self.loggerdb = sqlite3.connect(os.path.join(CONFIGURATION_PATH, 'db', 'wgdashboard_log.db'), - isolation_level=None, - check_same_thread=False) - self.loggerdb.row_factory = sqlite3.Row - self.__createLogDatabase() + self.engine = db.create_engine(f'sqlite:///{os.path.join(CONFIGURATION_PATH, "db", "wgdashboard_log.db")}') + self.loggerdb = self.engine.connect() + self.metadata = db.MetaData() + self.dashboardLoggerTable = db.Table('DashboardLog', self.metadata, + db.Column('LogID', db.VARCHAR, nullable=False, primary_key=True), + db.Column('LogDate', db.DATETIME, + server_default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")), + db.Column('URL', db.VARCHAR), + db.Column('IP', db.VARCHAR), + + db.Column('Status', db.VARCHAR, nullable=False), + db.Column('Message', db.VARCHAR) + ) + self.metadata.create_all(self.engine) self.log(Message="WGDashboard started") - def __createLogDatabase(self): - with self.loggerdb: - loggerdbCursor = self.loggerdb.cursor() - existingTable = loggerdbCursor.execute("SELECT name from sqlite_master where type='table'").fetchall() - existingTable = [t['name'] for t in existingTable] - if "DashboardLog" not in existingTable: - loggerdbCursor.execute( - "CREATE TABLE DashboardLog (LogID VARCHAR NOT NULL, LogDate DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%S','now', 'localtime')), URL VARCHAR, IP VARCHAR, Status VARCHAR, Message VARCHAR, PRIMARY KEY (LogID))") - if self.loggerdb.in_transaction: - self.loggerdb.commit() def log(self, URL: str = "", IP: str = "", Status: str = "true", Message: str = "") -> bool: try: - loggerdbCursor = self.loggerdb.cursor() - loggerdbCursor.execute( - "INSERT INTO DashboardLog (LogID, URL, IP, Status, Message) VALUES (?, ?, ?, ?, ?);", (str(uuid.uuid4()), URL, IP, Status, Message,)) - loggerdbCursor.close() - self.loggerdb.commit() + with self.engine.begin() as conn: + conn.execute( + self.dashboardLoggerTable.insert().values( + LogID=str(uuid.uuid4()), + URL=URL, + IP=IP, + Status=Status, + Message=Message + ) + ) return True except Exception as e: print(f"[WGDashboard] Access Log Error: {str(e)}") diff --git a/src/modules/PeerJobLogger.py b/src/modules/PeerJobLogger.py index 3e89791..3ac8234 100644 --- a/src/modules/PeerJobLogger.py +++ b/src/modules/PeerJobLogger.py @@ -1,36 +1,40 @@ """ Peer Job Logger """ -import sqlite3, os, uuid +import os, uuid +import sqlalchemy as db from .Log import Log +from datetime import datetime class PeerJobLogger: def __init__(self, CONFIGURATION_PATH, AllPeerJobs): - self.loggerdb = sqlite3.connect(os.path.join(CONFIGURATION_PATH, 'db', 'wgdashboard_log.db'), - check_same_thread=False) - self.loggerdb.row_factory = sqlite3.Row + self.engine = db.create_engine(f'sqlite:///{os.path.join(CONFIGURATION_PATH, "db", "wgdashboard_log.db")}') + self.loggerdb = self.engine.connect() + self.metadata = db.MetaData() + self.jobLogTable = db.Table('JobLog', self.metadata, + db.Column('LogID', db.VARCHAR, nullable=False, primary_key=True), + db.Column('JobID', db.VARCHAR, nullable=False), + db.Column('LogDate', db.DATETIME, + server_default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")), + db.Column('Status', db.VARCHAR, nullable=False), + db.Column('Message', db.VARCHAR) + ) self.logs: list[Log] = [] - self.__createLogDatabase() + self.metadata.create_all(self.engine) self.AllPeerJobs = AllPeerJobs - def __createLogDatabase(self): - with self.loggerdb: - loggerdbCursor = self.loggerdb.cursor() - - existingTable = loggerdbCursor.execute("SELECT name from sqlite_master where type='table'").fetchall() - existingTable = [t['name'] for t in existingTable] - - if "JobLog" not in existingTable: - loggerdbCursor.execute("CREATE TABLE JobLog (LogID VARCHAR NOT NULL, JobID NOT NULL, LogDate DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%S','now', 'localtime')), Status VARCHAR NOT NULL, Message VARCHAR, PRIMARY KEY (LogID))") - if self.loggerdb.in_transaction: - self.loggerdb.commit() def log(self, JobID: str, Status: bool = True, Message: str = "") -> bool: try: - with self.loggerdb: - loggerdbCursor = self.loggerdb.cursor() - loggerdbCursor.execute(f"INSERT INTO JobLog (LogID, JobID, Status, Message) VALUES (?, ?, ?, ?)", - (str(uuid.uuid4()), JobID, Status, Message,)) - if self.loggerdb.in_transaction: - self.loggerdb.commit() + with self.engine.begin() as conn: + conn.execute( + self.jobLogTable.insert().values( + { + "LogID": str(uuid.uuid4()), + "JobID": JobID, + "Status": Status, + "Message": Message + } + ) + ) except Exception as e: print(f"[WGDashboard] Peer Job Log Error: {str(e)}") return False @@ -40,14 +44,15 @@ class PeerJobLogger: logs: list[Log] = [] try: allJobs = self.AllPeerJobs.getAllJobs(configName) - allJobsID = ", ".join([f"'{x.JobID}'" for x in allJobs]) - with self.loggerdb: - loggerdbCursor = self.loggerdb.cursor() - table = loggerdbCursor.execute(f"SELECT * FROM JobLog WHERE JobID IN ({allJobsID}) ORDER BY LogDate DESC").fetchall() - self.logs.clear() - for l in table: - logs.append( - Log(l["LogID"], l["JobID"], l["LogDate"], l["Status"], l["Message"])) + allJobsID = [x.JobID for x in allJobs] + stmt = self.jobLogTable.select().where(self.jobLogTable.columns.JobID.in_( + allJobsID + )) + table = self.loggerdb.execute(stmt).fetchall() + for l in table: + logs.append( + Log(l.LogID, l.JobID, l.LogDate.strftime("%Y-%m-%d %H:%M:%S"), l.Status, l.Message)) except Exception as e: + print(e) return logs - return logs + return logs \ No newline at end of file diff --git a/src/requirements.txt b/src/requirements.txt index 793219e..160be0b 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -7,4 +7,5 @@ flask-cors icmplib gunicorn requests -tcconfig \ No newline at end of file +tcconfig +sqlalchemy \ No newline at end of file