const fs = require('fs'); const child_process = require('child_process'); // TODO: Jobs history let jobs = require('../../data/jobs.json'); let history = require('../../data/history.json'); setInterval(() => { if (JSON.stringify(JSON.parse(fs.readFileSync("../../data/jobs.json").toString())) !== JSON.stringify(jobs)) { console.log("Updating the jobs list..."); jobs = JSON.parse(fs.readFileSync("../../data/jobs.json").toString()); } }, 1000); setTimeout(() => { setInterval(() => { if (jobs.length > 0) { let pickup = new Date(); console.log(jobs.length + " job(s)"); console.log("\nRunning jobs:"); for (let job of jobs) { console.log(" " + job.name); let output; let start; let end; try { start = new Date(); output = child_process.execFileSync("php", [job.name + ".php", JSON.stringify(job.options)], { cwd: "../../jobs" }); end = new Date(); let runtime = end.getTime() - start.getTime(); let description = ""; for (let name of Object.keys(job.options)) { description = "," + name + "=" + JSON.stringify(job.options[name]); } jobs.splice(jobs.indexOf(job), 1); fs.writeFileSync("../../data/jobs.json", JSON.stringify(jobs)); history.unshift({ completed: true, error: null, options: job.options, name: job.name + "(" + description.substring(1) + ")", output: output.toString(), time: runtime, tracking: { queue: new Date(job.date).toISOString(), pickup: pickup.toISOString(), start: start.toISOString(), end: end.toISOString(), logged: new Date().toISOString() } }); history = history.slice(0, 200); fs.writeFileSync("../../data/history.json", JSON.stringify(history)); } catch (e) { end = start ? new Date() : null; console.log(" Failed to process job"); console.error(e); let runtime = end ? (start ? end.getTime() - start.getTime() : null) : null; let description = ""; for (let name of Object.keys(job.options)) { description = "," + name + "=" + JSON.stringify(job.options[name]); } jobs.splice(jobs.indexOf(job), 1); fs.writeFileSync("../../data/jobs.json", JSON.stringify(jobs)); history.unshift({ completed: false, error: e.stack, options: job.options, name: job.name + "(" + description.substring(1) + ")", output: (output ?? e.stdout ?? e.stderr).toString(), time: runtime, tracking: { queue: new Date(job.date).toISOString(), pickup: pickup.toISOString(), start: start ? start.toISOString() : null, end: end ? end.toISOString() : null, logged: new Date().toISOString() } }); history = history.slice(0, 200); fs.writeFileSync("../../data/history.json", JSON.stringify(history)); } } console.log("\nCompleted"); } }, 1000); }, 500);