mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-08-03 12:06:04 -04:00
Merge branch 'master' into something
# Conflicts: # server/notification.js # src/components/NotificationDialog.vue
This commit is contained in:
commit
916b9da0dc
19 changed files with 703 additions and 232 deletions
|
@ -2,9 +2,22 @@ const axios = require("axios");
|
|||
const {R} = require("redbean-node");
|
||||
const FormData = require('form-data');
|
||||
const nodemailer = require("nodemailer");
|
||||
const child_process = require("child_process");
|
||||
|
||||
class Notification {
|
||||
|
||||
/**
|
||||
*
|
||||
* @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 {
|
||||
await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, {
|
||||
|
@ -13,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}`, {
|
||||
|
@ -29,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,
|
||||
|
@ -58,11 +72,11 @@ class Notification {
|
|||
finalData = data;
|
||||
}
|
||||
|
||||
await axios.post(notification.webhookURL, finalData, config)
|
||||
return true;
|
||||
let res = await axios.post(notification.webhookURL, finalData, config)
|
||||
return okMsg;
|
||||
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
return false;
|
||||
throwGeneralAxiosError(error)
|
||||
}
|
||||
|
||||
} else if (notification.type === "smtp") {
|
||||
|
@ -77,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) {
|
||||
|
@ -102,12 +116,10 @@ class Notification {
|
|||
]
|
||||
}]
|
||||
}
|
||||
|
||||
await axios.post(notification.discordWebhookUrl, data)
|
||||
return true;
|
||||
let res = await axios.post(notification.discordWebhookUrl, data)
|
||||
return okMsg;
|
||||
} catch(error) {
|
||||
console.error(error)
|
||||
return false;
|
||||
throwGeneralAxiosError(error)
|
||||
}
|
||||
|
||||
} else if (notification.type === "signal") {
|
||||
|
@ -119,19 +131,18 @@ class Notification {
|
|||
};
|
||||
let config = {};
|
||||
|
||||
await axios.post(notification.signalURL, data, config)
|
||||
return true;
|
||||
let res = await axios.post(notification.signalURL, data, config)
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
return false;
|
||||
throwGeneralAxiosError(error)
|
||||
}
|
||||
|
||||
} else if (notification.type === "slack") {
|
||||
try {
|
||||
if (heartbeatJSON == null) {
|
||||
let data = {'text': "Uptime Kuma Slack testing successful.", 'channel': notification.slackchannel, 'username': notification.slackusername, 'icon_emoji': notification.slackiconemo}
|
||||
await axios.post(notification.slackwebhookURL, data)
|
||||
return true;
|
||||
let res = await axios.post(notification.slackwebhookURL, data)
|
||||
return okMsg;
|
||||
}
|
||||
|
||||
const time = heartbeatJSON["time"];
|
||||
|
@ -175,22 +186,21 @@ class Notification {
|
|||
}
|
||||
]
|
||||
}
|
||||
await axios.post(notification.slackwebhookURL, data)
|
||||
return true;
|
||||
let res = await axios.post(notification.slackwebhookURL, data)
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
return false;
|
||||
throwGeneralAxiosError(error)
|
||||
}
|
||||
|
||||
} else if (notification.type === "pushover") {
|
||||
var pushoverlink = 'https://api.pushover.net/1/messages.json'
|
||||
try {
|
||||
if (heartbeatJSON == null) {
|
||||
let data = {'message': "<b>Uptime Kuma Pushover testing successful.</b>",
|
||||
let data = {'message': "<b>Uptime Kuma Pushover testing successful.</b>",
|
||||
'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 = {
|
||||
|
@ -205,12 +215,15 @@ 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") {
|
||||
|
||||
return Notification.apprise(notification, msg)
|
||||
|
||||
} else {
|
||||
throw new Error("Notification type is not supported")
|
||||
}
|
||||
|
@ -272,20 +285,47 @@ class Notification {
|
|||
text: msg,
|
||||
});
|
||||
|
||||
return true;
|
||||
return "Sent Successfully.";
|
||||
}
|
||||
|
||||
static async discord(notification, msg) {
|
||||
const client = new Discord.Client();
|
||||
await client.login(notification.discordToken)
|
||||
static async apprise(notification, msg) {
|
||||
let s = child_process.spawnSync("apprise", [ "-vv", "-b", msg, notification.appriseURL])
|
||||
|
||||
const channel = await client.channels.fetch(notification.discordChannelID);
|
||||
await channel.send(msg);
|
||||
|
||||
client.destroy()
|
||||
let output = (s.stdout) ? s.stdout.toString() : 'ERROR: maybe apprise not found';
|
||||
|
||||
return true;
|
||||
if (output) {
|
||||
|
||||
if (! output.includes("ERROR")) {
|
||||
return "Sent Successfully";
|
||||
} else {
|
||||
throw new Error(output)
|
||||
}
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
static checkApprise() {
|
||||
let commandExistsSync = require('command-exists').sync;
|
||||
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 = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue