diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1ac9050 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,17 @@ +{ + "name": "Wireguard-Dashboard", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "dayjs": "^1.11.12" + } + }, + "node_modules/dayjs": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f2f14d4 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "dayjs": "^1.11.12" + } +} diff --git a/src/dashboard.py b/src/dashboard.py index 6baf54c..c324881 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -76,7 +76,7 @@ class CustomJsonEncoder(DefaultJSONProvider): super().__init__(app) def default(self, o): - if isinstance(o, WireguardConfiguration) or isinstance(o, Peer) or isinstance(o, PeerJob): + if isinstance(o, WireguardConfiguration) or isinstance(o, Peer) or isinstance(o, PeerJob) or isinstance(o, Log): return o.toJson() return super().default(self, o) @@ -99,6 +99,10 @@ class Log: "Status": self.Status, "Message": self.Message } + + def __dict__(self): + return self.toJson() + class Logger: def __init__(self): self.loggerdb = sqlite3.connect(os.path.join(CONFIGURATION_PATH, 'db', 'wgdashboard_log.db'), @@ -120,21 +124,26 @@ class Logger: self.loggerdbCursor.execute(f"INSERT INTO JobLog (LogID, JobID, Status, Message) VALUES (?, ?, ?, ?)", (str(uuid.uuid4()), JobID, Status, Message,)) self.loggerdb.commit() - self.getLogs() except Exception as e: print(e) return False return True - def getLogs(self, all: bool = False): + def getLogs(self, all: bool = False, configName = None) -> list[Log]: + logs: list[Log] = [] try: - table = self.loggerdb.execute(f"SELECT * FROM JobLog ORDER BY LogDate DESC {'LIMIT 5' if not all else ''}").fetchall() + allJobs = AllPeerJobs.getAllJobs(configName) + allJobsID = ", ".join([f"'{x.JobID}'" for x in allJobs]) + table = self.loggerdb.execute(f"SELECT * FROM JobLog WHERE JobID IN ({allJobsID}) ORDER BY LogDate DESC").fetchall() self.logs.clear() for l in table: - self.logs.append( + logs.append( Log(l["LogID"], l["JobID"], l["LogDate"], l["Status"], l["Message"])) except Exception as e: - pass + return logs + return logs + + @@ -186,7 +195,18 @@ class PeerJobs: self.Jobs.append(PeerJob( job['JobID'], job['Configuration'], job['Peer'], job['Field'], job['Operator'], job['Value'], job['CreationDate'], job['ExpireDate'], job['Action'])) - # print(self.Jobs) + + def getAllJobs(self, configuration: str = None): + if configuration is not None: + jobs = self.jobdbCursor.execute( + f"SELECT * FROM PeerJobs WHERE Configuration = ?", (configuration, )).fetchall() + j = [] + for job in jobs: + j.append(PeerJob( + job['JobID'], job['Configuration'], job['Peer'], job['Field'], job['Operator'], job['Value'], + job['CreationDate'], job['ExpireDate'], job['Action'])) + return j + return [] def __createPeerJobsDatabase(self): existingTable = self.jobdbCursor.execute("SELECT name from sqlite_master where type='table'").fetchall() @@ -239,21 +259,6 @@ class PeerJobs: except Exception as e: return False, str(e) - # def finishJob(self, Job: PeerJob) -> tuple[bool, list] | tuple[bool, str]: - # try: - # if (len(str(Job.CreationDate))) == 0: - # return False, "Job does not exist" - # self.jobdbCursor.execute(''' - # UPDATE PeerJobs SET ExpireDate = strftime('%Y-%m-%d %H:%M:%S','now') WHERE JobId = ? - # ''', (Job.JobID,)) - # self.jobdb.commit() - # self.__getJobs() - # return True, list( - # filter(lambda x: x.Configuration == Job.Configuration and x.Peer == Job.Peer and x.JobID == Job.JobID, - # self.Jobs)) - # except Exception as e: - # return False, str(e) - def runJob(self): needToDelete = [] for job in self.Jobs: @@ -1555,6 +1560,17 @@ def API_deletePeerScheduleJob(): return ResponseObject(s, data=p) return ResponseObject(s, message=p) +@app.route('/api/getPeerScheduleJobLogs/', methods=['GET']) +def API_getPeerScheduleJobLogs(configName): + if configName not in WireguardConfigurations.keys(): + return ResponseObject(False, "Configuration does not exist") + data = request.args.get("requestAll") + requestAll = False + if data is not None and data == "true": + requestAll = True + return ResponseObject(data=JobLogger.getLogs(requestAll, configName)) + + ''' Tools diff --git a/src/static/app/package-lock.json b/src/static/app/package-lock.json index 33e53b8..e28aff8 100644 --- a/src/static/app/package-lock.json +++ b/src/static/app/package-lock.json @@ -14,7 +14,7 @@ "bootstrap": "^5.3.2", "bootstrap-icons": "^1.11.2", "cidr-tools": "^7.0.4", - "dayjs": "^1.11.10", + "dayjs": "^1.11.12", "fuse.js": "^7.0.0", "i": "^0.3.7", "is-cidr": "^5.0.3", @@ -938,9 +938,9 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" }, "node_modules/decamelize": { "version": "1.2.0", diff --git a/src/static/app/package.json b/src/static/app/package.json index c278609..be37e4b 100644 --- a/src/static/app/package.json +++ b/src/static/app/package.json @@ -15,7 +15,7 @@ "bootstrap": "^5.3.2", "bootstrap-icons": "^1.11.2", "cidr-tools": "^7.0.4", - "dayjs": "^1.11.10", + "dayjs": "^1.11.12", "fuse.js": "^7.0.0", "i": "^0.3.7", "is-cidr": "^5.0.3", diff --git a/src/static/app/src/components/configurationComponents/peer.vue b/src/static/app/src/components/configurationComponents/peer.vue index 25c64b1..d92ca21 100644 --- a/src/static/app/src/components/configurationComponents/peer.vue +++ b/src/static/app/src/components/configurationComponents/peer.vue @@ -61,9 +61,9 @@ export default {
-
+
{{Peer.name ? Peer.name : 'Untitled Peer'}} -
+
Public Key

{{Peer.id}}

@@ -100,13 +100,14 @@ export default { \ No newline at end of file diff --git a/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue b/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue new file mode 100644 index 0000000..81b4981 --- /dev/null +++ b/src/static/app/src/components/configurationComponents/peerJobsLogsModal.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/src/static/app/src/components/configurationComponents/peerList.vue b/src/static/app/src/components/configurationComponents/peerList.vue index 1fff815..8211c2a 100644 --- a/src/static/app/src/components/configurationComponents/peerList.vue +++ b/src/static/app/src/components/configurationComponents/peerList.vue @@ -37,6 +37,8 @@ import PeerSettings from "@/components/configurationComponents/peerSettings.vue" import PeerQRCode from "@/components/configurationComponents/peerQRCode.vue"; import PeerCreate from "@/components/configurationComponents/peerCreate.vue"; import PeerJobs from "@/components/configurationComponents/peerJobs.vue"; +import PeerJobsAllModal from "@/components/configurationComponents/peerJobsAllModal.vue"; +import PeerJobsLogsModal from "@/components/configurationComponents/peerJobsLogsModal.vue"; Chart.register( ArcElement, @@ -66,7 +68,9 @@ Chart.register( export default { name: "peerList", - components: {PeerJobs, PeerCreate, PeerQRCode, PeerSettings, PeerSearch, Peer, Line, Bar}, + components: { + PeerJobsLogsModal, + PeerJobsAllModal, PeerJobs, PeerCreate, PeerQRCode, PeerSettings, PeerSearch, Peer, Line, Bar}, setup(){ const dashboardConfigurationStore = DashboardConfigurationStore(); const wireguardConfigurationStore = WireguardConfigurationsStore(); @@ -119,6 +123,12 @@ export default { }, peerCreate: { modalOpen: false + }, + peerScheduleJobsAll: { + modalOpen: false + }, + peerScheduleJobsLogs: { + modalOpen: false } } }, @@ -173,19 +183,6 @@ export default { }, (res) => { this.configurationInfo = res.data.configurationInfo; this.configurationPeers = res.data.configurationPeers; - - // let modals = [this.peerSetting, this.peerScheduleJobs, this.peerQRCode] - // modals.forEach(x => { - // - // if (x.modalOpen && this.configurationPeers.find(p => p.id === x.selectedPeer.id)){ - // x.selectedPeer = this.configurationPeers.find(p => p.id === x.selectedPeer.id) - // console.log(this.configurationPeers.find(p => p.id === x.selectedPeer.id)) - // }else{ - // x.modalOpen = false - // } - // }) - - this.configurationPeers.forEach(x => { x.restricted = false; }) @@ -534,12 +531,16 @@ export default { - +
- + - + - + - - - - - - - + + + + + + + +
diff --git a/src/static/app/src/components/configurationComponents/peerQRCode.vue b/src/static/app/src/components/configurationComponents/peerQRCode.vue index 700211b..93f7817 100644 --- a/src/static/app/src/components/configurationComponents/peerQRCode.vue +++ b/src/static/app/src/components/configurationComponents/peerQRCode.vue @@ -6,7 +6,8 @@ export default { peerConfigData: String }, mounted() { - QRCode.toCanvas(document.querySelector("#qrcode"), this.peerConfigData , function (error) { + QRCode.toCanvas(document.querySelector("#qrcode"), this.peerConfigData , (error) => { + console.log(this.peerConfigData) if (error) console.error(error) }) } @@ -14,10 +15,10 @@ export default { diff --git a/src/static/app/src/components/configurationComponents/peerSettings.vue b/src/static/app/src/components/configurationComponents/peerSettings.vue index 97c3810..2c37595 100644 --- a/src/static/app/src/components/configurationComponents/peerSettings.vue +++ b/src/static/app/src/components/configurationComponents/peerSettings.vue @@ -53,7 +53,7 @@ export default {