ahoy/deployer.js

87 lines
3.6 KiB
JavaScript

const fs = require("fs")
const shell = require("child_process")
const split = require("split")
const path = require("path")
const moment = require("moment")
const log = require("./logger")
function stripAnsi(text) {
return text.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '')
}
function dump(wid) {
return new Promise((resolve, reject) => {
let result = ""
fs.createReadStream(path.join(__dirname, "latest.log"), "utf8").pipe(split())
.on("data", (line) => { if (line.indexOf(wid) > -1) result += `${line},` })
.on("close", () => {
let json = JSON.parse(`[${result.slice(0, -1)}]`)
let filtered = []
let { buildEnded, buildStarted, downEnded, downStarted, mixStarted, mixEnded } = 0
for (let i = 0; i < json.length; i++) {
let message = json[i].message.split("\n")[0].replace(/(\r\n|\n|\r)/gm, " ").trim()
let buildType = message.split("=")[0].trim().split(" ").at(-1).trim()
switch (buildType) {
case "BUILD_STARTED":
buildStarted = parseInt(message.split("=")[1].trim())
break
case "BUILD_ENDED":
buildEnded = parseInt(message.split("=")[1].trim())
break
case "DOWNTIME_STARTED":
downStarted = parseInt(message.split("=")[1].trim())
break
case "DOWNTIME_ENDED":
downEnded = parseInt(message.split("=")[1].trim())
break
case "MIX_STARTED":
mixStarted = parseInt(message.split("=")[1].trim())
break
case "MIX_ENDED":
mixEnded = parseInt(message.split("=")[1].trim())
break
default:
filtered.push(`${moment(json[i].timestamp).format("MM/DD/YY - h:mm:ss A")} | ${json[i].message.replace(/(\r\n|\n|\r)/gm, "").trim()}`)
}
}
resolve({
dump: filtered.join(`\n`),
buildTime: buildEnded - buildStarted,
downTime: downEnded - downStarted,
mixTime: mixEnded - mixStarted
})
})
})
}
function deploy(wid) {
return new Promise(async (resolve, reject) => {
log.info(`[${wid}] Event receieved`)
fs.writeFileSync(path.join(__dirname, "DEPLOYING"), "Don't touch me! Otherwise, a race condition will occur. I get deleted automatically!")
if (!fs.existsSync(path.join(__dirname, "deploy.sh"))) {
throw "No deploy script exists"
}
log.info(`[${wid}] Running script`)
let child = shell.exec(`${path.join(__dirname, "deploy.sh")} -n ${process.env.NGINX_PATH} -w ${process.env.NGINX_WWW_PATH} -t ${process.env.TADAH_PATH}`)
child.stdout.on("data", (data) => { log.info(`[${wid}] ${stripAnsi(data)}`) })
child.stderr.on("data", (data) => { log.info(`[${wid}] ${stripAnsi(data)}`) })
child.on("close", () => {
log.info(`[${wid}] Script closed.`)
fs.unlinkSync(path.join(__dirname, "DEPLOYING"))
dump(wid).then((result) => { resolve(result) })
})
})
}
module.exports = { deploy, dump }