From 18531b71c774e25ee6991c7ac3149f06a57e7ab9 Mon Sep 17 00:00:00 2001 From: Donald Zou Date: Fri, 24 Oct 2025 08:47:02 +0800 Subject: [PATCH 1/4] Fixed schedule task delete issue --- src/dashboard.py | 2 +- src/modules/PeerJobs.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/dashboard.py b/src/dashboard.py index 223e9d5f..3dd1edeb 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -194,7 +194,7 @@ with app.app_context(): DashboardConfig = DashboardConfig() EmailSender = EmailSender(DashboardConfig) AllPeerShareLinks: PeerShareLinks = PeerShareLinks(DashboardConfig, WireguardConfigurations) - AllPeerJobs: PeerJobs = PeerJobs(DashboardConfig, WireguardConfigurations) + AllPeerJobs: PeerJobs = PeerJobs(DashboardConfig, WireguardConfigurations, AllPeerShareLinks) DashboardLogger: DashboardLogger = DashboardLogger() DashboardPlugins: DashboardPlugins = DashboardPlugins(app, WireguardConfigurations) DashboardWebHooks: DashboardWebHooks = DashboardWebHooks(DashboardConfig) diff --git a/src/modules/PeerJobs.py b/src/modules/PeerJobs.py index 694f6538..913cbe5f 100644 --- a/src/modules/PeerJobs.py +++ b/src/modules/PeerJobs.py @@ -9,7 +9,7 @@ from datetime import datetime from flask import current_app class PeerJobs: - def __init__(self, DashboardConfig, WireguardConfigurations): + def __init__(self, DashboardConfig, WireguardConfigurations, AllPeerShareLinks): self.Jobs: list[PeerJob] = [] self.engine = db.create_engine(ConnectionString('wgdashboard_job')) self.metadata = db.MetaData() @@ -28,6 +28,7 @@ class PeerJobs: self.__getJobs() self.JobLogger: PeerJobLogger = PeerJobLogger(self, DashboardConfig) self.WireguardConfigurations = WireguardConfigurations + self.AllPeerShareLinks = AllPeerShareLinks def __getJobs(self): self.Jobs.clear() @@ -162,7 +163,7 @@ class PeerJobs: if job.Action == "restrict": s, msg = c.restrictPeers([fp.id]) elif job.Action == "delete": - s, msg = c.deletePeers([fp.id]) + s, msg = c.deletePeers([fp.id], self, self.AllPeerShareLinks) elif job.Action == "reset_total_data_usage": s = fp.resetDataUsage("total") c.restrictPeers([fp.id]) @@ -179,12 +180,10 @@ class PeerJobs: f"Peer {fp.id} from {c.Name} failed {job.Action}ed." ) else: - current_app.logger.warning(f"Somehow can't find this peer {job.Peer} from {c.Name} failed {job.Action}ed.") self.JobLogger.log(job.JobID, False, f"Somehow can't find this peer {job.Peer} from {c.Name} failed {job.Action}ed." ) else: - current_app.logger.warning(f"Somehow can't find this peer {job.Peer} from {job.Configuration} failed {job.Action}ed.") self.JobLogger.log(job.JobID, False, f"Somehow can't find this peer {job.Peer} from {job.Configuration} failed {job.Action}ed." ) From d763867566e8db8e478b27dd8ad65e74fa59342f Mon Sep 17 00:00:00 2001 From: Donald Zou Date: Fri, 24 Oct 2025 09:21:48 +0800 Subject: [PATCH 2/4] Fixed stale job issue --- src/modules/AmneziaWireguardConfiguration.py | 4 +--- src/modules/PeerJobLogger.py | 23 ++++++++++++++++++- src/modules/PeerJobs.py | 21 +++++++++++++---- src/modules/WireguardConfiguration.py | 4 +--- .../peerJobsLogsModal.vue | 4 ++-- 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/modules/AmneziaWireguardConfiguration.py b/src/modules/AmneziaWireguardConfiguration.py index 43b8f159..6ada7d5f 100644 --- a/src/modules/AmneziaWireguardConfiguration.py +++ b/src/modules/AmneziaWireguardConfiguration.py @@ -173,9 +173,7 @@ class AmneziaWireguardConfiguration(WireguardConfiguration): self.metadata.create_all(self.engine) def getPeers(self): - self.Peers.clear() - current_app.logger.info(f"Refreshing {self.Name} peer list") - + self.Peers.clear() if self.configurationFileChanged(): with open(self.configPath, 'r') as configFile: p = [] diff --git a/src/modules/PeerJobLogger.py b/src/modules/PeerJobLogger.py index b047f3c4..11768248 100644 --- a/src/modules/PeerJobLogger.py +++ b/src/modules/PeerJobLogger.py @@ -2,8 +2,12 @@ Peer Job Logger """ import uuid +from typing import Sequence + import sqlalchemy as db from flask import current_app +from sqlalchemy import RowMapping + from .ConnectionString import ConnectionString from .Log import Log @@ -56,4 +60,21 @@ class PeerJobLogger: except Exception as e: current_app.logger.error(f"Getting Peer Job Log Error", e) return logs - return logs \ No newline at end of file + return logs + + def getFailingJobs(self) -> Sequence[RowMapping]: + with self.engine.connect() as conn: + table = conn.execute( + db.select( + self.jobLogTable.c.JobID + ).where( + self.jobLogTable.c.Status == 'false' + ).group_by( + self.jobLogTable.c.JobID + ).having( + db.func.count( + self.jobLogTable.c.JobID + ) > 10 + ) + ).mappings().fetchall() + return table \ No newline at end of file diff --git a/src/modules/PeerJobs.py b/src/modules/PeerJobs.py index 913cbe5f..cf4ed976 100644 --- a/src/modules/PeerJobs.py +++ b/src/modules/PeerJobs.py @@ -1,6 +1,8 @@ """ Peer Jobs """ +import sqlalchemy + from .ConnectionString import ConnectionString from .PeerJob import PeerJob from .PeerJobLogger import PeerJobLogger @@ -117,7 +119,7 @@ class PeerJobs: } ).where(self.peerJobTable.columns.JobID == Job.JobID) ) - self.JobLogger.log(Job.JobID, Message=f"Job is removed due to being deleted or finshed.") + self.JobLogger.log(Job.JobID, Message=f"Job is removed due to being deleted or finished.") self.__getJobs() self.WireguardConfigurations.get(Job.Configuration).searchPeer(Job.Peer)[1].getJobs() return True, None @@ -142,7 +144,7 @@ class PeerJobs: def runJob(self): - current_app.logger.info("Running scheduled jobs") + self.cleanJob() needToDelete = [] self.__getJobs() for job in self.Jobs: @@ -172,10 +174,8 @@ class PeerJobs: self.JobLogger.log(job.JobID, s, f"Peer {fp.id} from {c.Name} is successfully {job.Action}ed." ) - current_app.logger.info(f"Peer {fp.id} from {c.Name} is successfully {job.Action}ed.") needToDelete.append(job) else: - current_app.logger.info(f"Peer {fp.id} from {c.Name} is failed {job.Action}ed.") self.JobLogger.log(job.JobID, s, f"Peer {fp.id} from {c.Name} failed {job.Action}ed." ) @@ -189,6 +189,19 @@ class PeerJobs: ) for j in needToDelete: self.deleteJob(j) + + def cleanJob(self): + failingJobs = self.JobLogger.getFailingJobs() + with self.engine.begin() as conn: + for job in failingJobs: + conn.execute( + self.peerJobTable.update().values( + { + "ExpireDate": datetime.now() + } + ).where(self.peerJobTable.columns.JobID == job.get('JobID')) + ) + self.JobLogger.log(job.get('JobID'), Message=f"Job is removed due to being stale.") def __runJob_Compare(self, x: float | datetime, y: float | datetime, operator: str): if operator == "eq": diff --git a/src/modules/WireguardConfiguration.py b/src/modules/WireguardConfiguration.py index b3b04099..20debfda 100644 --- a/src/modules/WireguardConfiguration.py +++ b/src/modules/WireguardConfiguration.py @@ -395,9 +395,7 @@ class WireguardConfiguration: return changed def getPeers(self): - tmpList = [] - current_app.logger.info(f"Refreshing {self.Name} peer list") - + tmpList = [] if self.configurationFileChanged(): with open(self.configPath, 'r') as configFile: p = [] diff --git a/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue b/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue index f35e667c..4f59c1ad 100644 --- a/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue +++ b/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue @@ -146,8 +146,8 @@ export default { {{log.LogID}} {{log.JobID}} - - {{log.Status === "1" ? 'Success': 'Failed'}} + + {{(log.Status === "1" || log.Status === "true") ? 'Success': 'Failed'}} {{log.Message}} From 9dd5341fd9db00c60f3c1a9ccc7e7795456cbc31 Mon Sep 17 00:00:00 2001 From: Donald Zou Date: Fri, 24 Oct 2025 09:53:09 +0800 Subject: [PATCH 3/4] Remove app access log into the database --- src/dashboard.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dashboard.py b/src/dashboard.py index 3dd1edeb..a164742c 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -223,11 +223,11 @@ def auth_req(): return ResponseObject(True) DashboardConfig.APIAccessed = False - if "api" in request.path: - if str(request.method) == "GET": - DashboardLogger.log(str(request.url), str(request.remote_addr), Message=str(request.args)) - elif str(request.method) == "POST": - DashboardLogger.log(str(request.url), str(request.remote_addr), Message=f"Request Args: {str(request.args)} Body:{str(request.get_json())}") + # if "api" in request.path: + # if str(request.method) == "GET": + # DashboardLogger.log(str(request.url), str(request.remote_addr), Message=str(request.args)) + # elif str(request.method) == "POST": + # DashboardLogger.log(str(request.url), str(request.remote_addr), Message=f"Request Args: {str(request.args)} Body:{str(request.get_json())}") authenticationRequired = DashboardConfig.GetConfig("Server", "auth_req")[1] From 10c9b5635f253251dbc9595c73dae39b26f3045d Mon Sep 17 00:00:00 2001 From: Donald Zou Date: Fri, 24 Oct 2025 09:53:40 +0800 Subject: [PATCH 4/4] Fixed duplicated data --- src/modules/WireguardConfiguration.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/modules/WireguardConfiguration.py b/src/modules/WireguardConfiguration.py index 20debfda..8eb07003 100644 --- a/src/modules/WireguardConfiguration.py +++ b/src/modules/WireguardConfiguration.py @@ -501,15 +501,24 @@ class WireguardConfiguration: with self.engine.begin() as conn: for tempPeer in self.Peers: if tempPeer.status == "running": - endpoint = tempPeer.endpoint.rsplit(":", 1) + endpoint = tempPeer.endpoint.rsplit(":", 1) if len(endpoint) == 2 and len(endpoint[0]) > 0: - conn.execute( - self.peersHistoryEndpointTable.insert().values({ - "id": tempPeer.id, - "endpoint": endpoint[0], - "time": datetime.now() - }) - ) + exist = conn.execute( + self.peersHistoryEndpointTable.select().where( + sqlalchemy.and_( + self.peersHistoryEndpointTable.c.id == tempPeer.id, + self.peersHistoryEndpointTable.c.endpoint == endpoint[0] + ) + ) + ).mappings().fetchone() + if not exist: + conn.execute( + self.peersHistoryEndpointTable.insert().values({ + "id": tempPeer.id, + "endpoint": endpoint[0], + "time": datetime.now() + }) + ) def addPeers(self, peers: list) -> tuple[bool, list, str]: result = {