Fixed stale job issue

This commit is contained in:
Donald Zou
2025-10-24 09:21:48 +08:00
parent 18531b71c7
commit d763867566
5 changed files with 43 additions and 13 deletions

View File

@@ -174,8 +174,6 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
def getPeers(self): def getPeers(self):
self.Peers.clear() self.Peers.clear()
current_app.logger.info(f"Refreshing {self.Name} peer list")
if self.configurationFileChanged(): if self.configurationFileChanged():
with open(self.configPath, 'r') as configFile: with open(self.configPath, 'r') as configFile:
p = [] p = []

View File

@@ -2,8 +2,12 @@
Peer Job Logger Peer Job Logger
""" """
import uuid import uuid
from typing import Sequence
import sqlalchemy as db import sqlalchemy as db
from flask import current_app from flask import current_app
from sqlalchemy import RowMapping
from .ConnectionString import ConnectionString from .ConnectionString import ConnectionString
from .Log import Log from .Log import Log
@@ -57,3 +61,20 @@ class PeerJobLogger:
current_app.logger.error(f"Getting Peer Job Log Error", e) current_app.logger.error(f"Getting Peer Job Log Error", e)
return logs return logs
return logs 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

View File

@@ -1,6 +1,8 @@
""" """
Peer Jobs Peer Jobs
""" """
import sqlalchemy
from .ConnectionString import ConnectionString from .ConnectionString import ConnectionString
from .PeerJob import PeerJob from .PeerJob import PeerJob
from .PeerJobLogger import PeerJobLogger from .PeerJobLogger import PeerJobLogger
@@ -117,7 +119,7 @@ class PeerJobs:
} }
).where(self.peerJobTable.columns.JobID == Job.JobID) ).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.__getJobs()
self.WireguardConfigurations.get(Job.Configuration).searchPeer(Job.Peer)[1].getJobs() self.WireguardConfigurations.get(Job.Configuration).searchPeer(Job.Peer)[1].getJobs()
return True, None return True, None
@@ -142,7 +144,7 @@ class PeerJobs:
def runJob(self): def runJob(self):
current_app.logger.info("Running scheduled jobs") self.cleanJob()
needToDelete = [] needToDelete = []
self.__getJobs() self.__getJobs()
for job in self.Jobs: for job in self.Jobs:
@@ -172,10 +174,8 @@ class PeerJobs:
self.JobLogger.log(job.JobID, s, self.JobLogger.log(job.JobID, s,
f"Peer {fp.id} from {c.Name} is successfully {job.Action}ed." 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) needToDelete.append(job)
else: else:
current_app.logger.info(f"Peer {fp.id} from {c.Name} is failed {job.Action}ed.")
self.JobLogger.log(job.JobID, s, self.JobLogger.log(job.JobID, s,
f"Peer {fp.id} from {c.Name} failed {job.Action}ed." f"Peer {fp.id} from {c.Name} failed {job.Action}ed."
) )
@@ -190,6 +190,19 @@ class PeerJobs:
for j in needToDelete: for j in needToDelete:
self.deleteJob(j) 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): def __runJob_Compare(self, x: float | datetime, y: float | datetime, operator: str):
if operator == "eq": if operator == "eq":
return x == y return x == y

View File

@@ -396,8 +396,6 @@ class WireguardConfiguration:
def getPeers(self): def getPeers(self):
tmpList = [] tmpList = []
current_app.logger.info(f"Refreshing {self.Name} peer list")
if self.configurationFileChanged(): if self.configurationFileChanged():
with open(self.configPath, 'r') as configFile: with open(self.configPath, 'r') as configFile:
p = [] p = []

View File

@@ -146,8 +146,8 @@ export default {
<td v-if="showLogID"><samp class="text-muted">{{log.LogID}}</samp></td> <td v-if="showLogID"><samp class="text-muted">{{log.LogID}}</samp></td>
<td v-if="showJobID"><samp class="text-muted">{{log.JobID}}</samp></td> <td v-if="showJobID"><samp class="text-muted">{{log.JobID}}</samp></td>
<td> <td>
<span class="badge" :class="[log.Status === '1' ? 'text-success-emphasis bg-success-subtle':'text-danger-emphasis bg-danger-subtle']"> <span class="badge" :class="[(log.Status === '1' || log.Status === 'true') ? 'text-success-emphasis bg-success-subtle':'text-danger-emphasis bg-danger-subtle']">
{{log.Status === "1" ? 'Success': 'Failed'}} {{(log.Status === "1" || log.Status === "true") ? 'Success': 'Failed'}}
</span> </span>
</td> </td>
<td>{{log.Message}}</td> <td>{{log.Message}}</td>