|
|
@ -5,12 +5,18 @@ const nodemailer = require("nodemailer"); |
|
|
|
const child_process = require("child_process"); |
|
|
|
|
|
|
|
class Notification { |
|
|
|
static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { |
|
|
|
|
|
|
|
let res = { |
|
|
|
ok: true, |
|
|
|
msg: "Sent Successfully" |
|
|
|
} |
|
|
|
/** |
|
|
|
* |
|
|
|
* @param notification |
|
|
|
* @param msg |
|
|
|
* @param monitorJSON |
|
|
|
* @param heartbeatJSON |
|
|
|
* @returns {Promise<string>} Successful msg |
|
|
|
* Throw Error with fail msg |
|
|
|
*/ |
|
|
|
static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { |
|
|
|
let okMsg = "Sent Successfully. "; |
|
|
|
|
|
|
|
if (notification.type === "telegram") { |
|
|
|
try { |
|
|
@ -20,15 +26,16 @@ class Notification { |
|
|
|
text: msg, |
|
|
|
} |
|
|
|
}) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
console.error(error) |
|
|
|
return false; |
|
|
|
let msg = (error.response.data.description) ? error.response.data.description : "Error without description" |
|
|
|
throw new Error(msg) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "gotify") { |
|
|
|
try { |
|
|
|
if (notification.gotifyserverurl.endsWith("/")) { |
|
|
|
if (notification.gotifyserverurl && notification.gotifyserverurl.endsWith("/")) { |
|
|
|
notification.gotifyserverurl = notification.gotifyserverurl.slice(0, -1); |
|
|
|
} |
|
|
|
await axios.post(`${notification.gotifyserverurl}/message?token=${notification.gotifyapplicationToken}`, { |
|
|
@ -36,15 +43,15 @@ class Notification { |
|
|
|
"priority": notification.gotifyPriority || 8, |
|
|
|
"title": "Uptime-Kuma" |
|
|
|
}) |
|
|
|
return true; |
|
|
|
|
|
|
|
return okMsg; |
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
console.error(error) |
|
|
|
return false; |
|
|
|
throwGeneralAxiosError(error) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "webhook") { |
|
|
|
try { |
|
|
|
|
|
|
|
let data = { |
|
|
|
heartbeat: heartbeatJSON, |
|
|
|
monitor: monitorJSON, |
|
|
@ -66,10 +73,10 @@ class Notification { |
|
|
|
} |
|
|
|
|
|
|
|
let res = await axios.post(notification.webhookURL, finalData, config) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
console.error(error) |
|
|
|
return false; |
|
|
|
throwGeneralAxiosError(error) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "smtp") { |
|
|
@ -84,7 +91,7 @@ class Notification { |
|
|
|
content: msg |
|
|
|
} |
|
|
|
let res = await axios.post(notification.discordWebhookUrl, data) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} |
|
|
|
// If heartbeatJSON is not null, we go into the normal alerting loop.
|
|
|
|
if(heartbeatJSON['status'] == 0) { |
|
|
@ -110,10 +117,9 @@ class Notification { |
|
|
|
}] |
|
|
|
} |
|
|
|
let res = await axios.post(notification.discordWebhookUrl, data) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} catch(error) { |
|
|
|
console.error(error) |
|
|
|
return false; |
|
|
|
throwGeneralAxiosError(error) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "signal") { |
|
|
@ -126,10 +132,9 @@ class Notification { |
|
|
|
let config = {}; |
|
|
|
|
|
|
|
let res = await axios.post(notification.signalURL, data, config) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} catch (error) { |
|
|
|
console.error(error) |
|
|
|
return false; |
|
|
|
throwGeneralAxiosError(error) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "slack") { |
|
|
@ -137,7 +142,7 @@ class Notification { |
|
|
|
if (heartbeatJSON == null) { |
|
|
|
let data = {'text': "Uptime Kuma Slack testing successful.", 'channel': notification.slackchannel, 'username': notification.slackusername, 'icon_emoji': notification.slackiconemo} |
|
|
|
let res = await axios.post(notification.slackwebhookURL, data) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} |
|
|
|
|
|
|
|
const time = heartbeatJSON["time"]; |
|
|
@ -182,10 +187,9 @@ class Notification { |
|
|
|
] |
|
|
|
} |
|
|
|
let res = await axios.post(notification.slackwebhookURL, data) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} catch (error) { |
|
|
|
console.error(error) |
|
|
|
return false; |
|
|
|
throwGeneralAxiosError(error) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "pushover") { |
|
|
@ -196,7 +200,7 @@ class Notification { |
|
|
|
'user': notification.pushoveruserkey, 'token': notification.pushoverapptoken, 'sound':notification.pushoversounds, |
|
|
|
'priority': notification.pushoverpriority, 'title':notification.pushovertitle, 'retry': "30", 'expire':"3600", 'html': 1} |
|
|
|
let res = await axios.post(pushoverlink, data) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} |
|
|
|
|
|
|
|
let data = { |
|
|
@ -211,10 +215,9 @@ class Notification { |
|
|
|
"html": 1 |
|
|
|
} |
|
|
|
let res = await axios.post(pushoverlink, data) |
|
|
|
return true; |
|
|
|
return okMsg; |
|
|
|
} catch (error) { |
|
|
|
console.log(error) |
|
|
|
return false; |
|
|
|
throwGeneralAxiosError(error) |
|
|
|
} |
|
|
|
|
|
|
|
} else if (notification.type === "apprise") { |
|
|
@ -282,22 +285,24 @@ class Notification { |
|
|
|
text: msg, |
|
|
|
}); |
|
|
|
|
|
|
|
return true; |
|
|
|
return "Sent Successfully."; |
|
|
|
} |
|
|
|
|
|
|
|
static async apprise(notification, msg) { |
|
|
|
let s = child_process.spawnSync("apprise", [ "-vv", "-b", msg, notification.appriseURL]) |
|
|
|
let output = s.stdout.toString(); |
|
|
|
|
|
|
|
console.log(output) |
|
|
|
|
|
|
|
let output = (s.stdout) ? s.stdout.toString() : 'ERROR: maybe apprise not found'; |
|
|
|
|
|
|
|
if (output) { |
|
|
|
return { |
|
|
|
ok: ! output.includes("ERROR"), |
|
|
|
msg: output |
|
|
|
|
|
|
|
if (! output.includes("ERROR")) { |
|
|
|
return "Sent Successfully"; |
|
|
|
} else { |
|
|
|
throw new Error(output) |
|
|
|
} |
|
|
|
} else { |
|
|
|
return { } |
|
|
|
return "" |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -306,6 +311,21 @@ class Notification { |
|
|
|
let exists = commandExistsSync('apprise'); |
|
|
|
return exists; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
function throwGeneralAxiosError(error) { |
|
|
|
let msg = "Error: " + error + " "; |
|
|
|
|
|
|
|
if (error.response && error.response.data) { |
|
|
|
if (typeof error.response.data === "string") { |
|
|
|
msg += error.response.data; |
|
|
|
} else { |
|
|
|
msg += JSON.stringify(error.response.data) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
throw new Error(msg) |
|
|
|
} |
|
|
|
|
|
|
|
module.exports = { |
|
|
|