diff --git a/server/auth.js b/server/auth.js index 5cf96b6f..597cf3d7 100644 --- a/server/auth.js +++ b/server/auth.js @@ -130,7 +130,7 @@ function userAuthorizer(username, password, callback) { * @param {express.Request} req Express request object * @param {express.Response} res Express response object * @param {express.NextFunction} next Next handler in chain - * @returns {void} + * @returns {Promise} */ exports.basicAuth = async function (req, res, next) { const middleware = basicAuth({ @@ -153,7 +153,7 @@ exports.basicAuth = async function (req, res, next) { * @param {express.Request} req Express request object * @param {express.Response} res Express response object * @param {express.NextFunction} next Next handler in chain - * @returns {void} + * @returns {Promise} */ exports.apiAuth = async function (req, res, next) { if (!await Settings.get("disableAuth")) { diff --git a/server/database.js b/server/database.js index 4a12746f..cfe14fe7 100644 --- a/server/database.js +++ b/server/database.js @@ -378,7 +378,7 @@ class Database { /** * Patch the database - * @returns {void} + * @returns {Promise} */ static async patch() { // Still need to keep this for old versions of Uptime Kuma diff --git a/server/docker.js b/server/docker.js index bec0e0b1..ee6051df 100644 --- a/server/docker.js +++ b/server/docker.js @@ -65,7 +65,7 @@ class DockerHost { /** * Fetches the amount of containers on the Docker host * @param {object} dockerHost Docker host to check for - * @returns {number} Total amount of containers on the host + * @returns {Promise} Total amount of containers on the host */ static async testDockerHost(dockerHost) { const options = { diff --git a/server/model/group.js b/server/model/group.js index 98ac2a47..bd2c3018 100644 --- a/server/model/group.js +++ b/server/model/group.js @@ -9,7 +9,7 @@ class Group extends BeanModel { * @param {boolean} showTags Should the JSON include monitor tags * @param {boolean} certExpiry Should JSON include info about * certificate expiry? - * @returns {object} Object ready to parse + * @returns {Promise} Object ready to parse */ async toPublicJSON(showTags = false, certExpiry = false) { let monitorBeanList = await this.getMonitorList(); @@ -29,7 +29,7 @@ class Group extends BeanModel { /** * Get all monitors - * @returns {Bean[]} List of monitors + * @returns {Promise} List of monitors */ async getMonitorList() { return R.convertToBeans("monitor", await R.getAll(` diff --git a/server/model/maintenance.js b/server/model/maintenance.js index fb51060e..516c0377 100644 --- a/server/model/maintenance.js +++ b/server/model/maintenance.js @@ -11,7 +11,7 @@ class Maintenance extends BeanModel { /** * Return an object that ready to parse to JSON for public * Only show necessary data to public - * @returns {object} Object ready to parse + * @returns {Promise} Object ready to parse */ async toPublicJSON() { @@ -98,7 +98,7 @@ class Maintenance extends BeanModel { /** * Return an object that ready to parse to JSON * @param {string} timezone If not specified, the timeRange will be in UTC - * @returns {object} Object ready to parse + * @returns {Promise} Object ready to parse */ async toJSON(timezone = null) { return this.toPublicJSON(timezone); @@ -143,7 +143,7 @@ class Maintenance extends BeanModel { * Convert data from socket to bean * @param {Bean} bean Bean to fill in * @param {object} obj Data to fill bean with - * @returns {Bean} Filled bean + * @returns {Promise} Filled bean */ static async jsonToBean(bean, obj) { if (obj.id) { @@ -189,9 +189,9 @@ class Maintenance extends BeanModel { /** * Throw error if cron is invalid * @param {string|Date} cron Pattern or date - * @returns {Promise} + * @returns {void} */ - static async validateCron(cron) { + static validateCron(cron) { let job = new Cron(cron, () => {}); job.stop(); } @@ -324,7 +324,7 @@ class Maintenance extends BeanModel { /** * Is this maintenance currently active - * @returns {boolean} The maintenance is active? + * @returns {Promise} The maintenance is active? */ async isUnderMaintenance() { return (await this.getStatus()) === "under-maintenance"; @@ -332,7 +332,7 @@ class Maintenance extends BeanModel { /** * Get the timezone of the maintenance - * @returns {string} timezone + * @returns {Promise} timezone */ async getTimezone() { if (!this.timezone || this.timezone === "SAME_AS_SERVER") { @@ -343,7 +343,7 @@ class Maintenance extends BeanModel { /** * Get offset for timezone - * @returns {string} offset + * @returns {Promise} offset */ async getTimezoneOffset() { return dayjs.tz(dayjs(), await this.getTimezone()).format("Z"); @@ -351,7 +351,7 @@ class Maintenance extends BeanModel { /** * Get the current status of the maintenance - * @returns {string} Current status + * @returns {Promise} Current status */ async getStatus() { if (!this.active) { diff --git a/server/model/monitor.js b/server/model/monitor.js index fbed48f9..1667b83a 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -43,7 +43,7 @@ class Monitor extends BeanModel { * @param {boolean} showTags Include tags in JSON * @param {boolean} certExpiry Include certificate expiry info in * JSON - * @returns {object} Object ready to parse + * @returns {Promise} Object ready to parse */ async toPublicJSON(showTags = false, certExpiry = false) { let obj = { @@ -74,7 +74,7 @@ class Monitor extends BeanModel { * Return an object that ready to parse to JSON * @param {boolean} includeSensitiveData Include sensitive data in * JSON - * @returns {object} Object ready to parse + * @returns {Promise} Object ready to parse */ async toJSON(includeSensitiveData = true) { @@ -328,9 +328,9 @@ class Monitor extends BeanModel { /** * Start monitor * @param {Server} io Socket server instance - * @returns {void} + * @returns {Promise} */ - start(io) { + async start(io) { let previousBeat = null; let retries = 0; @@ -947,7 +947,7 @@ class Monitor extends BeanModel { log.debug("monitor", `[${this.name}] apicache clear`); apicache.clear(); - UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); + await UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id); } else { bean.important = false; @@ -1102,9 +1102,9 @@ class Monitor extends BeanModel { /** * Stop monitor - * @returns {void} + * @returns {Promise} */ - stop() { + async stop() { clearTimeout(this.heartbeatInterval); this.isStop = true; @@ -1377,7 +1377,7 @@ class Monitor extends BeanModel { let notifyDays = await setting("tlsExpiryNotifyDays"); if (notifyDays == null || !Array.isArray(notifyDays)) { // Reset Default - setSetting("tlsExpiryNotifyDays", [ 7, 14, 21 ], "general"); + await setSetting("tlsExpiryNotifyDays", [ 7, 14, 21 ], "general"); notifyDays = [ 7, 14, 21 ]; } diff --git a/server/model/status_page.js b/server/model/status_page.js index 06fa7a68..23558298 100644 --- a/server/model/status_page.js +++ b/server/model/status_page.js @@ -18,7 +18,7 @@ class StatusPage extends BeanModel { * @param {Response} response Response object * @param {string} indexHTML HTML to render * @param {string} slug Status page slug - * @returns {void} + * @returns {Promise} */ static async handleStatusPageResponse(response, indexHTML, slug) { // Handle url with trailing slash (http://localhost:3001/status/) @@ -42,7 +42,7 @@ class StatusPage extends BeanModel { * SSR for status pages * @param {string} indexHTML HTML page to render * @param {StatusPage} statusPage Status page populate HTML with - * @returns {void} + * @returns {Promise} the rendered html */ static async renderHTML(indexHTML, statusPage) { const $ = cheerio.load(indexHTML); diff --git a/server/monitor-types/monitor-type.js b/server/monitor-types/monitor-type.js index 782bedd5..eb75307b 100644 --- a/server/monitor-types/monitor-type.js +++ b/server/monitor-types/monitor-type.js @@ -1,5 +1,4 @@ class MonitorType { - name = undefined; /** diff --git a/server/monitor-types/mqtt.js b/server/monitor-types/mqtt.js index cff5c93d..9b2db43d 100644 --- a/server/monitor-types/mqtt.js +++ b/server/monitor-types/mqtt.js @@ -81,7 +81,8 @@ class MqttMonitorType extends MonitorType { let client = mqtt.connect(mqttUrl, { username, - password + password, + clientId: "uptime-kuma_" + Math.random().toString(16).substr(2, 8) }); client.on("connect", () => { diff --git a/server/monitor-types/tailscale-ping.js b/server/monitor-types/tailscale-ping.js index 0a39544e..5950cc21 100644 --- a/server/monitor-types/tailscale-ping.js +++ b/server/monitor-types/tailscale-ping.js @@ -16,7 +16,7 @@ class TailscalePing extends MonitorType { * @param {object} monitor The monitor object associated with the check. * @param {object} heartbeat The heartbeat object to update. * @returns {Promise} - * @throws Will throw an error if checking Tailscale ping encounters any error + * @throws Error if checking Tailscale ping encounters any error */ async check(monitor, heartbeat) { try { diff --git a/server/notification-providers/alerta.js b/server/notification-providers/alerta.js index 62092178..f9a273b4 100644 --- a/server/notification-providers/alerta.js +++ b/server/notification-providers/alerta.js @@ -3,17 +3,15 @@ const { DOWN, UP } = require("../../src/util"); const axios = require("axios"); class Alerta extends NotificationProvider { - name = "alerta"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { - let alertaUrl = `${notification.alertaApiEndpoint}`; let config = { headers: { "Content-Type": "application/json;charset=UTF-8", @@ -40,7 +38,7 @@ class Alerta extends NotificationProvider { resource: "Message", }, data); - await axios.post(alertaUrl, postData, config); + await axios.post(notification.alertaApiEndpoint, postData, config); } else { let datadup = Object.assign( { correlate: [ "service_up", "service_down" ], @@ -52,11 +50,11 @@ class Alerta extends NotificationProvider { if (heartbeatJSON["status"] === DOWN) { datadup.severity = notification.alertaAlertState; // critical datadup.text = "Service " + monitorJSON["type"] + " is down."; - await axios.post(alertaUrl, datadup, config); + await axios.post(notification.alertaApiEndpoint, datadup, config); } else if (heartbeatJSON["status"] === UP) { datadup.severity = notification.alertaRecoverState; // cleaned datadup.text = "Service " + monitorJSON["type"] + " is up."; - await axios.post(alertaUrl, datadup, config); + await axios.post(notification.alertaApiEndpoint, datadup, config); } } return okMsg; diff --git a/server/notification-providers/alertnow.js b/server/notification-providers/alertnow.js index 1206b72e..4257ca9c 100644 --- a/server/notification-providers/alertnow.js +++ b/server/notification-providers/alertnow.js @@ -4,14 +4,14 @@ const { setting } = require("../util-server"); const { getMonitorRelativeURL, UP, DOWN } = require("../../src/util"); class AlertNow extends NotificationProvider { - name = "AlertNow"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { let textMsg = ""; let status = "open"; diff --git a/server/notification-providers/aliyun-sms.js b/server/notification-providers/aliyun-sms.js index 1718bbfe..ff38bd0d 100644 --- a/server/notification-providers/aliyun-sms.js +++ b/server/notification-providers/aliyun-sms.js @@ -11,7 +11,7 @@ class AliyunSMS extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { if (heartbeatJSON != null) { @@ -44,7 +44,7 @@ class AliyunSMS extends NotificationProvider { * Send the SMS notification * @param {BeanModel} notification Notification details * @param {string} msgbody Message template - * @returns {boolean} True if successful else false + * @returns {Promise} True if successful else false */ async sendSms(notification, msgbody) { let params = { diff --git a/server/notification-providers/apprise.js b/server/notification-providers/apprise.js index 5e4d23c3..0f698214 100644 --- a/server/notification-providers/apprise.js +++ b/server/notification-providers/apprise.js @@ -2,13 +2,14 @@ const NotificationProvider = require("./notification-provider"); const childProcessAsync = require("promisify-child-process"); class Apprise extends NotificationProvider { - name = "apprise"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + const args = [ "-vv", "-b", msg, notification.appriseURL ]; if (notification.title) { args.push("-t"); @@ -23,7 +24,7 @@ class Apprise extends NotificationProvider { if (output) { if (! output.includes("ERROR")) { - return "Sent Successfully"; + return okMsg; } throw new Error(output); diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js index 7fe9a7a9..0907d5f1 100644 --- a/server/notification-providers/bark.js +++ b/server/notification-providers/bark.js @@ -46,29 +46,29 @@ class Bark extends NotificationProvider { } /** - * Add additional parameter for Bark v1 endpoints + * Add additional parameter for Bark v1 endpoints. + * Leads to better on device styles (iOS 15 optimized) * @param {BeanModel} notification Notification to send - * @param {string} postUrl URL to append parameters to * @returns {string} Additional URL parameters */ - appendAdditionalParameters(notification, postUrl) { + additionalParameters(notification) { // set icon to uptime kuma icon, 11kb should be fine - postUrl += "?icon=" + barkNotificationAvatar; + let params = "?icon=" + barkNotificationAvatar; // grouping all our notifications if (notification.barkGroup != null) { - postUrl += "&group=" + notification.barkGroup; + params += "&group=" + notification.barkGroup; } else { // default name - postUrl += "&group=" + "UptimeKuma"; + params += "&group=" + "UptimeKuma"; } // picked a sound, this should follow system's mute status when arrival if (notification.barkSound != null) { - postUrl += "&sound=" + notification.barkSound; + params += "&sound=" + notification.barkSound; } else { // default sound - postUrl += "&sound=" + "telegraph"; + params += "&sound=" + "telegraph"; } - return postUrl; + return params; } /** @@ -92,7 +92,7 @@ class Bark extends NotificationProvider { * @param {string} title Message title * @param {string} subtitle Message * @param {string} endpoint Endpoint to send request to - * @returns {string} Success message + * @returns {Promise} Success message */ async postNotification(notification, title, subtitle, endpoint) { let result; @@ -100,9 +100,8 @@ class Bark extends NotificationProvider { // url encode title and subtitle title = encodeURIComponent(title); subtitle = encodeURIComponent(subtitle); - let postUrl = endpoint + "/" + title + "/" + subtitle; - postUrl = this.appendAdditionalParameters(notification, postUrl); - result = await axios.get(postUrl); + const params = this.additionalParameters(notification); + result = await axios.get(`${endpoint}/${title}/${subtitle}${params}`); } else { result = await axios.post(`${endpoint}/push`, { title, diff --git a/server/notification-providers/clicksendsms.js b/server/notification-providers/clicksendsms.js index 5539a6a4..c090b7f3 100644 --- a/server/notification-providers/clicksendsms.js +++ b/server/notification-providers/clicksendsms.js @@ -2,14 +2,15 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class ClickSendSMS extends NotificationProvider { - name = "clicksendsms"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://rest.clicksend.com/v3/sms/send"; + try { let config = { headers: { @@ -28,7 +29,7 @@ class ClickSendSMS extends NotificationProvider { } ] }; - let resp = await axios.post("https://rest.clicksend.com/v3/sms/send", data, config); + let resp = await axios.post(url, data, config); if (resp.data.data.messages[0].status !== "SUCCESS") { let error = "Something gone wrong. Api returned " + resp.data.data.messages[0].status + "."; this.throwGeneralAxiosError(error); diff --git a/server/notification-providers/dingding.js b/server/notification-providers/dingding.js index be3a2fbc..5e7f030b 100644 --- a/server/notification-providers/dingding.js +++ b/server/notification-providers/dingding.js @@ -10,7 +10,7 @@ class DingDing extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { if (heartbeatJSON != null) { @@ -21,7 +21,7 @@ class DingDing extends NotificationProvider { text: `## [${this.statusToString(heartbeatJSON["status"])}] ${monitorJSON["name"]} \n> ${heartbeatJSON["msg"]}\n> Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`, } }; - if (this.sendToDingDing(notification, params)) { + if (await this.sendToDingDing(notification, params)) { return okMsg; } } else { @@ -31,7 +31,7 @@ class DingDing extends NotificationProvider { content: msg } }; - if (this.sendToDingDing(notification, params)) { + if (await this.sendToDingDing(notification, params)) { return okMsg; } } @@ -44,7 +44,7 @@ class DingDing extends NotificationProvider { * Send message to DingDing * @param {BeanModel} notification Notification to send * @param {object} params Parameters of message - * @returns {boolean} True if successful else false + * @returns {Promise} True if successful else false */ async sendToDingDing(notification, params) { let timestamp = Date.now(); diff --git a/server/notification-providers/discord.js b/server/notification-providers/discord.js index f24cd616..f24d4725 100644 --- a/server/notification-providers/discord.js +++ b/server/notification-providers/discord.js @@ -3,14 +3,13 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class Discord extends NotificationProvider { - name = "discord"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { const discordDisplayName = notification.discordUsername || "Uptime Kuma"; diff --git a/server/notification-providers/feishu.js b/server/notification-providers/feishu.js index dd5ce295..23af6911 100644 --- a/server/notification-providers/feishu.js +++ b/server/notification-providers/feishu.js @@ -9,8 +9,7 @@ class Feishu extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - let feishuWebHookUrl = notification.feishuWebHookUrl; + const okMsg = "Sent Successfully."; try { if (heartbeatJSON == null) { @@ -20,7 +19,7 @@ class Feishu extends NotificationProvider { text: msg, }, }; - await axios.post(feishuWebHookUrl, testdata); + await axios.post(notification.feishuWebHookUrl, testdata); return okMsg; } @@ -46,7 +45,7 @@ class Feishu extends NotificationProvider { }, }, }; - await axios.post(feishuWebHookUrl, downdata); + await axios.post(notification.feishuWebHookUrl, downdata); return okMsg; } @@ -72,7 +71,7 @@ class Feishu extends NotificationProvider { }, }, }; - await axios.post(feishuWebHookUrl, updata); + await axios.post(notification.feishuWebHookUrl, updata); return okMsg; } } catch (error) { diff --git a/server/notification-providers/freemobile.js b/server/notification-providers/freemobile.js index 44c55bfd..4de45acd 100644 --- a/server/notification-providers/freemobile.js +++ b/server/notification-providers/freemobile.js @@ -2,14 +2,14 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class FreeMobile extends NotificationProvider { - name = "FreeMobile"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { await axios.post(`https://smsapi.free-mobile.fr/sendmsg?msg=${encodeURIComponent(msg.replace("🔴", "⛔️"))}`, { "user": notification.freemobileUser, diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js index abf77924..847c6a00 100644 --- a/server/notification-providers/goalert.js +++ b/server/notification-providers/goalert.js @@ -3,21 +3,20 @@ const axios = require("axios"); const { UP } = require("../../src/util"); class GoAlert extends NotificationProvider { - name = "GoAlert"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { - let closeAction = "close"; let data = { summary: msg, }; if (heartbeatJSON != null && heartbeatJSON["status"] === UP) { - data["action"] = closeAction; + data["action"] = "close"; } let headers = { "Content-Type": "multipart/form-data", @@ -27,7 +26,6 @@ class GoAlert extends NotificationProvider { }; await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming?token=${notification.goAlertToken}`, data, config); return okMsg; - } catch (error) { let msg = (error.response.data) ? error.response.data : "Error without response"; throw new Error(msg); diff --git a/server/notification-providers/google-chat.js b/server/notification-providers/google-chat.js index 413fde26..9f1b53b7 100644 --- a/server/notification-providers/google-chat.js +++ b/server/notification-providers/google-chat.js @@ -5,14 +5,14 @@ const { getMonitorRelativeURL } = require("../../src/util"); const { DOWN, UP } = require("../../src/util"); class GoogleChat extends NotificationProvider { - name = "GoogleChat"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { // Google Chat message formatting: https://developers.google.com/chat/api/guides/message-formats/basic diff --git a/server/notification-providers/gorush.js b/server/notification-providers/gorush.js index 28f03ab9..ba9d470f 100644 --- a/server/notification-providers/gorush.js +++ b/server/notification-providers/gorush.js @@ -2,14 +2,13 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Gorush extends NotificationProvider { - name = "gorush"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; let platformMapping = { "ios": 1, diff --git a/server/notification-providers/gotify.js b/server/notification-providers/gotify.js index 3e99b3d1..a52ef511 100644 --- a/server/notification-providers/gotify.js +++ b/server/notification-providers/gotify.js @@ -2,14 +2,14 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Gotify extends NotificationProvider { - name = "gotify"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { if (notification.gotifyserverurl && notification.gotifyserverurl.endsWith("/")) { notification.gotifyserverurl = notification.gotifyserverurl.slice(0, -1); diff --git a/server/notification-providers/grafana-oncall.js b/server/notification-providers/grafana-oncall.js index ee1bfd47..e93c77cd 100644 --- a/server/notification-providers/grafana-oncall.js +++ b/server/notification-providers/grafana-oncall.js @@ -3,19 +3,18 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class GrafanaOncall extends NotificationProvider { - name = "GrafanaOncall"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; if (!notification.GrafanaOncallURL) { throw new Error("GrafanaOncallURL cannot be empty"); } - let okMsg = "Sent Successfully."; try { if (heartbeatJSON === null) { let grafanaupdata = { @@ -23,10 +22,7 @@ class GrafanaOncall extends NotificationProvider { message: msg, state: "alerting", }; - await axios.post( - notification.GrafanaOncallURL, - grafanaupdata - ); + await axios.post(notification.GrafanaOncallURL, grafanaupdata); return okMsg; } else if (heartbeatJSON["status"] === DOWN) { let grafanadowndata = { @@ -34,10 +30,7 @@ class GrafanaOncall extends NotificationProvider { message: heartbeatJSON["msg"], state: "alerting", }; - await axios.post( - notification.GrafanaOncallURL, - grafanadowndata - ); + await axios.post(notification.GrafanaOncallURL, grafanadowndata); return okMsg; } else if (heartbeatJSON["status"] === UP) { let grafanaupdata = { @@ -45,10 +38,7 @@ class GrafanaOncall extends NotificationProvider { message: heartbeatJSON["msg"], state: "ok", }; - await axios.post( - notification.GrafanaOncallURL, - grafanaupdata - ); + await axios.post(notification.GrafanaOncallURL, grafanaupdata); return okMsg; } } catch (error) { diff --git a/server/notification-providers/heii-oncall.js b/server/notification-providers/heii-oncall.js new file mode 100644 index 00000000..20b53e6a --- /dev/null +++ b/server/notification-providers/heii-oncall.js @@ -0,0 +1,52 @@ +const { UP, DOWN, getMonitorRelativeURL } = require("../../src/util"); +const { setting } = require("../util-server"); + +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); +class HeiiOnCall extends NotificationProvider { + name = "HeiiOnCall"; + + /** + * @inheritdoc + */ + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + const payload = heartbeatJSON || {}; + + const baseURL = await setting("primaryBaseURL"); + if (baseURL && monitorJSON) { + payload["url"] = baseURL + getMonitorRelativeURL(monitorJSON.id); + } + + const config = { + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + notification.heiiOnCallApiKey, + }, + }; + const heiiUrl = `https://heiioncall.com/triggers/${notification.heiiOnCallTriggerId}/`; + // docs https://heiioncall.com/docs#manual-triggers + try { + if (!heartbeatJSON) { + // Testing or general notification like certificate expiry + payload["msg"] = msg; + await axios.post(heiiUrl + "alert", payload, config); + return okMsg; + } + + if (heartbeatJSON.status === DOWN) { + await axios.post(heiiUrl + "alert", payload, config); + return okMsg; + } + if (heartbeatJSON.status === UP) { + await axios.post(heiiUrl + "resolve", payload, config); + return okMsg; + } + } catch (error) { + this.throwGeneralAxiosError(error); + } + } +} + +module.exports = HeiiOnCall; diff --git a/server/notification-providers/home-assistant.js b/server/notification-providers/home-assistant.js index 292fc3e6..ee95ba0b 100644 --- a/server/notification-providers/home-assistant.js +++ b/server/notification-providers/home-assistant.js @@ -9,7 +9,9 @@ class HomeAssistant extends NotificationProvider { /** * @inheritdoc */ - async send(notification, message, monitor = null, heartbeat = null) { + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + const notificationService = notification?.notificationService || defaultNotificationService; try { @@ -17,10 +19,10 @@ class HomeAssistant extends NotificationProvider { `${notification.homeAssistantUrl.trim().replace(/\/*$/, "")}/api/services/notify/${notificationService}`, { title: "Uptime Kuma", - message, + message: msg, ...(notificationService !== "persistent_notification" && { data: { - name: monitor?.name, - status: heartbeat?.status, + name: monitorJSON?.name, + status: heartbeatJSON?.status, } }), }, { @@ -31,7 +33,7 @@ class HomeAssistant extends NotificationProvider { } ); - return "Sent Successfully."; + return okMsg; } catch (error) { this.throwGeneralAxiosError(error); } diff --git a/server/notification-providers/kook.js b/server/notification-providers/kook.js index b9b68f43..dab19513 100644 --- a/server/notification-providers/kook.js +++ b/server/notification-providers/kook.js @@ -2,15 +2,15 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Kook extends NotificationProvider { - name = "Kook"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - let url = "https://www.kookapp.cn/api/v3/message/create"; + const okMsg = "Sent Successfully."; + const url = "https://www.kookapp.cn/api/v3/message/create"; + let data = { target_id: notification.kookGuildID, content: msg, diff --git a/server/notification-providers/line.js b/server/notification-providers/line.js index 73dc962f..57dc87e7 100644 --- a/server/notification-providers/line.js +++ b/server/notification-providers/line.js @@ -3,16 +3,16 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class Line extends NotificationProvider { - name = "line"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://api.line.me/v2/bot/message/push"; + try { - let lineAPIUrl = "https://api.line.me/v2/bot/message/push"; let config = { headers: { "Content-Type": "application/json", @@ -29,7 +29,7 @@ class Line extends NotificationProvider { } ] }; - await axios.post(lineAPIUrl, testMessage, config); + await axios.post(url, testMessage, config); } else if (heartbeatJSON["status"] === DOWN) { let downMessage = { "to": notification.lineUserID, @@ -43,7 +43,7 @@ class Line extends NotificationProvider { } ] }; - await axios.post(lineAPIUrl, downMessage, config); + await axios.post(url, downMessage, config); } else if (heartbeatJSON["status"] === UP) { let upMessage = { "to": notification.lineUserID, @@ -57,7 +57,7 @@ class Line extends NotificationProvider { } ] }; - await axios.post(lineAPIUrl, upMessage, config); + await axios.post(url, upMessage, config); } return okMsg; } catch (error) { diff --git a/server/notification-providers/linenotify.js b/server/notification-providers/linenotify.js index dfe7e598..2622e3f1 100644 --- a/server/notification-providers/linenotify.js +++ b/server/notification-providers/linenotify.js @@ -4,16 +4,16 @@ const qs = require("qs"); const { DOWN, UP } = require("../../src/util"); class LineNotify extends NotificationProvider { - name = "LineNotify"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://notify-api.line.me/api/notify"; + try { - let lineAPIUrl = "https://notify-api.line.me/api/notify"; let config = { headers: { "Content-Type": "application/x-www-form-urlencoded", @@ -24,7 +24,7 @@ class LineNotify extends NotificationProvider { let testMessage = { "message": msg, }; - await axios.post(lineAPIUrl, qs.stringify(testMessage), config); + await axios.post(url, qs.stringify(testMessage), config); } else if (heartbeatJSON["status"] === DOWN) { let downMessage = { "message": "\n[🔴 Down]\n" + @@ -32,7 +32,7 @@ class LineNotify extends NotificationProvider { heartbeatJSON["msg"] + "\n" + `Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}` }; - await axios.post(lineAPIUrl, qs.stringify(downMessage), config); + await axios.post(url, qs.stringify(downMessage), config); } else if (heartbeatJSON["status"] === UP) { let upMessage = { "message": "\n[✅ Up]\n" + @@ -40,7 +40,7 @@ class LineNotify extends NotificationProvider { heartbeatJSON["msg"] + "\n" + `Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}` }; - await axios.post(lineAPIUrl, qs.stringify(upMessage), config); + await axios.post(url, qs.stringify(upMessage), config); } return okMsg; } catch (error) { diff --git a/server/notification-providers/lunasea.js b/server/notification-providers/lunasea.js index 3729b0fe..787a704a 100644 --- a/server/notification-providers/lunasea.js +++ b/server/notification-providers/lunasea.js @@ -3,28 +3,23 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class LunaSea extends NotificationProvider { - name = "lunasea"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - let lunaseaurl = ""; - if (notification.lunaseaTarget === "user") { - lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaUserID; - } else { - lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice; - } + const okMsg = "Sent Successfully."; + const url = "https://notify.lunasea.app/v1"; try { + const target = this.getTarget(notification); if (heartbeatJSON == null) { let testdata = { "title": "Uptime Kuma Alert", "body": msg, }; - await axios.post(lunaseaurl, testdata); + await axios.post(`${url}/custom/${target}`, testdata); return okMsg; } @@ -35,7 +30,7 @@ class LunaSea extends NotificationProvider { heartbeatJSON["msg"] + `\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}` }; - await axios.post(lunaseaurl, downdata); + await axios.post(`${url}/custom/${target}`, downdata); return okMsg; } @@ -46,13 +41,25 @@ class LunaSea extends NotificationProvider { heartbeatJSON["msg"] + `\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}` }; - await axios.post(lunaseaurl, updata); + await axios.post(`${url}/custom/${target}`, updata); return okMsg; } } catch (error) { this.throwGeneralAxiosError(error); } + } + + /** + * Generates the lunasea target to send the notification to + * @param {BeanModel} notification Notification details + * @returns {string} The target to send the notification to + */ + getTarget(notification) { + if (notification.lunaseaTarget === "user") { + return "user/" + notification.lunaseaUserID; + } + return "device/" + notification.lunaseaDevice; } } diff --git a/server/notification-providers/matrix.js b/server/notification-providers/matrix.js index c9baf48b..805a4947 100644 --- a/server/notification-providers/matrix.js +++ b/server/notification-providers/matrix.js @@ -10,7 +10,7 @@ class Matrix extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; const size = 20; const randomString = encodeURIComponent( diff --git a/server/notification-providers/mattermost.js b/server/notification-providers/mattermost.js index 5a6a8e2c..9946d02b 100644 --- a/server/notification-providers/mattermost.js +++ b/server/notification-providers/mattermost.js @@ -3,14 +3,14 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class Mattermost extends NotificationProvider { - name = "mattermost"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { const mattermostUserName = notification.mattermostusername || "Uptime Kuma"; // If heartbeatJSON is null, assume non monitoring notification (Certificate warning) or testing. @@ -98,10 +98,7 @@ class Mattermost extends NotificationProvider { }, ], }; - await axios.post( - notification.mattermostWebhookUrl, - mattermostdata - ); + await axios.post(notification.mattermostWebhookUrl, mattermostdata); return okMsg; } catch (error) { this.throwGeneralAxiosError(error); diff --git a/server/notification-providers/nostr.js b/server/notification-providers/nostr.js index 9d93678f..453b86d0 100644 --- a/server/notification-providers/nostr.js +++ b/server/notification-providers/nostr.js @@ -107,7 +107,7 @@ class Nostr extends NotificationProvider { /** * Get public keys for recipients * @param {string} recipients Newline delimited list of recipients - * @returns {nip19.DecodeResult[]} Public keys + * @returns {Promise} Public keys */ async getPublicKeys(recipients) { const recipientsList = recipients.split("\n"); diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js index 12c9258b..ad1d39f8 100644 --- a/server/notification-providers/ntfy.js +++ b/server/notification-providers/ntfy.js @@ -3,14 +3,14 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class Ntfy extends NotificationProvider { - name = "ntfy"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { let headers = {}; if (notification.ntfyAuthenticationMethod === "usernamePassword") { @@ -31,7 +31,7 @@ class Ntfy extends NotificationProvider { "priority": notification.ntfyPriority, "tags": [ "test_tube" ], }; - await axios.post(`${notification.ntfyserverurl}`, ntfyTestData, { headers: headers }); + await axios.post(notification.ntfyserverurl, ntfyTestData, { headers: headers }); return okMsg; } let tags = []; @@ -70,7 +70,7 @@ class Ntfy extends NotificationProvider { data.icon = notification.ntfyIcon; } - await axios.post(`${notification.ntfyserverurl}`, data, { headers: headers }); + await axios.post(notification.ntfyserverurl, data, { headers: headers }); return okMsg; diff --git a/server/notification-providers/octopush.js b/server/notification-providers/octopush.js index ec62cd3a..7576e0ad 100644 --- a/server/notification-providers/octopush.js +++ b/server/notification-providers/octopush.js @@ -2,14 +2,15 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Octopush extends NotificationProvider { - name = "octopush"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const urlV2 = "https://api.octopush.com/v1/public/sms-campaign/send"; + const urlV1 = "https://www.octopush-dm.com/api/sms/json"; try { // Default - V2 @@ -33,7 +34,7 @@ class Octopush extends NotificationProvider { "purpose": "alert", "sender": notification.octopushSenderName }; - await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config); + await axios.post(urlV2, data, config); } else if (notification.octopushVersion === "1") { let data = { "user_login": notification.octopushDMLogin, @@ -55,7 +56,7 @@ class Octopush extends NotificationProvider { // V1 API returns 200 even on error so we must check // response data - let response = await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config); + let response = await axios.post(urlV1, {}, config); if ("error_code" in response.data) { if (response.data.error_code !== "000") { this.throwGeneralAxiosError(`Octopush error ${JSON.stringify(response.data)}`); diff --git a/server/notification-providers/onebot.js b/server/notification-providers/onebot.js index ec7fc46d..b04794de 100644 --- a/server/notification-providers/onebot.js +++ b/server/notification-providers/onebot.js @@ -2,23 +2,23 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class OneBot extends NotificationProvider { - name = "OneBot"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { - let httpAddr = notification.httpAddr; - if (!httpAddr.startsWith("http")) { - httpAddr = "http://" + httpAddr; + let url = notification.httpAddr; + if (!url.startsWith("http")) { + url = "http://" + url; } - if (!httpAddr.endsWith("/")) { - httpAddr += "/"; + if (!url.endsWith("/")) { + url += "/"; } - let onebotAPIUrl = httpAddr + "send_msg"; + url += "send_msg"; let config = { headers: { "Content-Type": "application/json", @@ -37,7 +37,7 @@ class OneBot extends NotificationProvider { data["message_type"] = "private"; data["user_id"] = notification.recieverId; } - await axios.post(onebotAPIUrl, data, config); + await axios.post(url, data, config); return okMsg; } catch (error) { this.throwGeneralAxiosError(error); diff --git a/server/notification-providers/opsgenie.js b/server/notification-providers/opsgenie.js index e2dc38a7..59a79705 100644 --- a/server/notification-providers/opsgenie.js +++ b/server/notification-providers/opsgenie.js @@ -4,10 +4,9 @@ const { UP, DOWN } = require("../../src/util"); const opsgenieAlertsUrlEU = "https://api.eu.opsgenie.com/v2/alerts"; const opsgenieAlertsUrlUS = "https://api.opsgenie.com/v2/alerts"; -let okMsg = "Sent Successfully."; +const okMsg = "Sent Successfully."; class Opsgenie extends NotificationProvider { - name = "Opsgenie"; /** diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js index 7ec91971..05334e90 100644 --- a/server/notification-providers/promosms.js +++ b/server/notification-providers/promosms.js @@ -2,14 +2,14 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class PromoSMS extends NotificationProvider { - name = "promosms"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://promosms.com/api/rest/v3_2/sms"; if (notification.promosmsAllowLongSMS === undefined) { notification.promosmsAllowLongSMS = false; @@ -36,7 +36,7 @@ class PromoSMS extends NotificationProvider { "sender": notification.promosmsSenderName }; - let resp = await axios.post("https://promosms.com/api/rest/v3_2/sms", data, config); + let resp = await axios.post(url, data, config); if (resp.data.response.status !== 0) { let error = "Something gone wrong. Api returned " + resp.data.response.status + "."; diff --git a/server/notification-providers/pushbullet.js b/server/notification-providers/pushbullet.js index 9fbd4d4c..0b730310 100644 --- a/server/notification-providers/pushbullet.js +++ b/server/notification-providers/pushbullet.js @@ -4,17 +4,16 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class Pushbullet extends NotificationProvider { - name = "pushbullet"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://api.pushbullet.com/v2/pushes"; try { - let pushbulletUrl = "https://api.pushbullet.com/v2/pushes"; let config = { headers: { "Access-Token": notification.pushbulletAccessToken, @@ -27,7 +26,7 @@ class Pushbullet extends NotificationProvider { "title": "Uptime Kuma Alert", "body": msg, }; - await axios.post(pushbulletUrl, data, config); + await axios.post(url, data, config); } else if (heartbeatJSON["status"] === DOWN) { let downData = { "type": "note", @@ -36,7 +35,7 @@ class Pushbullet extends NotificationProvider { heartbeatJSON["msg"] + `\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`, }; - await axios.post(pushbulletUrl, downData, config); + await axios.post(url, downData, config); } else if (heartbeatJSON["status"] === UP) { let upData = { "type": "note", @@ -45,7 +44,7 @@ class Pushbullet extends NotificationProvider { heartbeatJSON["msg"] + `\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`, }; - await axios.post(pushbulletUrl, upData, config); + await axios.post(url, upData, config); } return okMsg; } catch (error) { diff --git a/server/notification-providers/pushdeer.js b/server/notification-providers/pushdeer.js index 78525a54..276c2f47 100644 --- a/server/notification-providers/pushdeer.js +++ b/server/notification-providers/pushdeer.js @@ -3,17 +3,15 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class PushDeer extends NotificationProvider { - name = "PushDeer"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - let endpoint = "/message/push"; - let serverUrl = notification.pushdeerServer || "https://api2.pushdeer.com"; - let pushdeerlink = `${serverUrl.trim().replace(/\/*$/, "")}${endpoint}`; + const okMsg = "Sent Successfully."; + const serverUrl = notification.pushdeerServer || "https://api2.pushdeer.com"; + const url = `${serverUrl.trim().replace(/\/*$/, "")}/message/push`; let valid = msg != null && monitorJSON != null && heartbeatJSON != null; @@ -34,7 +32,7 @@ class PushDeer extends NotificationProvider { }; try { - let res = await axios.post(pushdeerlink, data); + let res = await axios.post(url, data); if ("error" in res.data) { let error = res.data.error; diff --git a/server/notification-providers/pushover.js b/server/notification-providers/pushover.js index 31f8d885..304aa351 100644 --- a/server/notification-providers/pushover.js +++ b/server/notification-providers/pushover.js @@ -2,15 +2,14 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Pushover extends NotificationProvider { - name = "pushover"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; - let pushoverlink = "https://api.pushover.net/1/messages.json"; + const okMsg = "Sent Successfully."; + const url = "https://api.pushover.net/1/messages.json"; let data = { "message": msg, @@ -33,11 +32,11 @@ class Pushover extends NotificationProvider { try { if (heartbeatJSON == null) { - await axios.post(pushoverlink, data); + await axios.post(url, data); return okMsg; } else { data.message += `\nTime (${heartbeatJSON["timezone"]}):${heartbeatJSON["localDateTime"]}`; - await axios.post(pushoverlink, data); + await axios.post(url, data); return okMsg; } } catch (error) { diff --git a/server/notification-providers/pushy.js b/server/notification-providers/pushy.js index afb9e617..cb700229 100644 --- a/server/notification-providers/pushy.js +++ b/server/notification-providers/pushy.js @@ -2,14 +2,13 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Pushy extends NotificationProvider { - name = "pushy"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { await axios.post(`https://api.pushy.me/push?api_key=${notification.pushyAPIKey}`, { diff --git a/server/notification-providers/rocket-chat.js b/server/notification-providers/rocket-chat.js index 13b39cde..690e33a8 100644 --- a/server/notification-providers/rocket-chat.js +++ b/server/notification-providers/rocket-chat.js @@ -5,14 +5,14 @@ const { setting } = require("../util-server"); const { getMonitorRelativeURL, DOWN } = require("../../src/util"); class RocketChat extends NotificationProvider { - name = "rocket.chat"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { if (heartbeatJSON == null) { let data = { diff --git a/server/notification-providers/serverchan.js b/server/notification-providers/serverchan.js index 2315e1c3..cefe61f1 100644 --- a/server/notification-providers/serverchan.js +++ b/server/notification-providers/serverchan.js @@ -3,14 +3,14 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class ServerChan extends NotificationProvider { - name = "ServerChan"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + try { await axios.post(`https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`, { "title": this.checkStatus(heartbeatJSON, monitorJSON), diff --git a/server/notification-providers/serwersms.js b/server/notification-providers/serwersms.js index 76e1ef2c..f7c8644a 100644 --- a/server/notification-providers/serwersms.js +++ b/server/notification-providers/serwersms.js @@ -2,14 +2,14 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class SerwerSMS extends NotificationProvider { - name = "serwersms"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://api2.serwersms.pl/messages/send_sms"; try { let config = { @@ -25,7 +25,7 @@ class SerwerSMS extends NotificationProvider { "sender": notification.serwersmsSenderName, }; - let resp = await axios.post("https://api2.serwersms.pl/messages/send_sms", data, config); + let resp = await axios.post(url, data, config); if (!resp.data.success) { if (resp.data.error) { diff --git a/server/notification-providers/signal.js b/server/notification-providers/signal.js index c445ee82..9702d06b 100644 --- a/server/notification-providers/signal.js +++ b/server/notification-providers/signal.js @@ -2,14 +2,13 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Signal extends NotificationProvider { - name = "signal"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { let data = { diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js index d512a7cd..9347b07c 100644 --- a/server/notification-providers/slack.js +++ b/server/notification-providers/slack.js @@ -4,7 +4,6 @@ const { setSettings, setting } = require("../util-server"); const { getMonitorRelativeURL, UP } = require("../../src/util"); class Slack extends NotificationProvider { - name = "slack"; /** @@ -31,7 +30,7 @@ class Slack extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; if (notification.slackchannelnotify) { msg += " "; diff --git a/server/notification-providers/smsc.js b/server/notification-providers/smsc.js index 34d9c8fa..89f01d01 100644 --- a/server/notification-providers/smsc.js +++ b/server/notification-providers/smsc.js @@ -8,7 +8,9 @@ class SMSC extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://smsc.kz/sys/send.php?"; + try { let config = { headers: { @@ -29,7 +31,7 @@ class SMSC extends NotificationProvider { getArray.push("sender=" + notification.smscSenderName); } - let resp = await axios.get("https://smsc.kz/sys/send.php?" + getArray.join("&"), config); + let resp = await axios.get(url + getArray.join("&"), config); if (resp.data.id === undefined) { let error = `Something gone wrong. Api returned code ${resp.data.error_code}: ${resp.data.error}`; this.throwGeneralAxiosError(error); diff --git a/server/notification-providers/smseagle.js b/server/notification-providers/smseagle.js index 988f17fd..4e897006 100644 --- a/server/notification-providers/smseagle.js +++ b/server/notification-providers/smseagle.js @@ -2,14 +2,13 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class SMSEagle extends NotificationProvider { - name = "SMSEagle"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { let config = { diff --git a/server/notification-providers/smsmanager.js b/server/notification-providers/smsmanager.js index 7d55d410..d01285d8 100644 --- a/server/notification-providers/smsmanager.js +++ b/server/notification-providers/smsmanager.js @@ -2,23 +2,24 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class SMSManager extends NotificationProvider { - name = "SMSManager"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + const url = "https://http-api.smsmanager.cz/Send"; + try { let data = { apikey: notification.smsmanagerApiKey, - endpoint: "https://http-api.smsmanager.cz/Send", message: msg.replace(/[^\x00-\x7F]/g, ""), - to: notification.numbers, - messageType: notification.messageType, + number: notification.numbers, + gateway: notification.messageType, }; - await axios.get(`${data.endpoint}?apikey=${data.apikey}&message=${data.message}&number=${data.to}&gateway=${data.messageType}`); - return "SMS sent sucessfully."; + await axios.get(`${url}?apikey=${data.apikey}&message=${data.message}&number=${data.number}&gateway=${data.messageType}`); + return okMsg; } catch (error) { this.throwGeneralAxiosError(error); } diff --git a/server/notification-providers/smtp.js b/server/notification-providers/smtp.js index 0e761bc0..b403117b 100644 --- a/server/notification-providers/smtp.js +++ b/server/notification-providers/smtp.js @@ -4,13 +4,13 @@ const { DOWN } = require("../../src/util"); const { Liquid } = require("liquidjs"); class SMTP extends NotificationProvider { - name = "smtp"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; const config = { host: notification.smtpHost, @@ -76,7 +76,7 @@ class SMTP extends NotificationProvider { text: body, }); - return "Sent Successfully."; + return okMsg; } /** diff --git a/server/notification-providers/squadcast.js b/server/notification-providers/squadcast.js index 0b60503d..1c653d14 100644 --- a/server/notification-providers/squadcast.js +++ b/server/notification-providers/squadcast.js @@ -3,14 +3,13 @@ const axios = require("axios"); const { DOWN } = require("../../src/util"); class Squadcast extends NotificationProvider { - name = "squadcast"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { diff --git a/server/notification-providers/stackfield.js b/server/notification-providers/stackfield.js index 26c038ea..65a92459 100644 --- a/server/notification-providers/stackfield.js +++ b/server/notification-providers/stackfield.js @@ -4,14 +4,14 @@ const { setting } = require("../util-server"); const { getMonitorRelativeURL } = require("../../src/util"); class Stackfield extends NotificationProvider { - name = "stackfield"; /** * @inheritdoc */ - async send(notification, msg, monitorJSON = null) { - let okMsg = "Sent Successfully."; + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + try { // Stackfield message formatting: https://www.stackfield.com/help/formatting-messages-2001 diff --git a/server/notification-providers/teams.js b/server/notification-providers/teams.js index bf2cd764..f34ba1ce 100644 --- a/server/notification-providers/teams.js +++ b/server/notification-providers/teams.js @@ -208,7 +208,7 @@ class Teams extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { if (heartbeatJSON == null) { diff --git a/server/notification-providers/techulus-push.js b/server/notification-providers/techulus-push.js index bfd9503b..230897f3 100644 --- a/server/notification-providers/techulus-push.js +++ b/server/notification-providers/techulus-push.js @@ -2,14 +2,13 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class TechulusPush extends NotificationProvider { - name = "PushByTechulus"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { await axios.post(`https://push.techulus.com/api/v1/notify/${notification.pushAPIKey}`, { diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js index 896b9e08..c5bbb190 100644 --- a/server/notification-providers/telegram.js +++ b/server/notification-providers/telegram.js @@ -2,14 +2,14 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Telegram extends NotificationProvider { - name = "telegram"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; + const url = "https://api.telegram.org"; try { let params = { @@ -22,7 +22,7 @@ class Telegram extends NotificationProvider { params.message_thread_id = notification.telegramMessageThreadID; } - await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, { + await axios.get(`${url}/bot${notification.telegramBotToken}/sendMessage`, { params: params, }); return okMsg; diff --git a/server/notification-providers/twilio.js b/server/notification-providers/twilio.js index 2abb38b9..c38a6d7e 100644 --- a/server/notification-providers/twilio.js +++ b/server/notification-providers/twilio.js @@ -2,26 +2,21 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class Twilio extends NotificationProvider { - name = "twilio"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; - let okMsg = "Sent Successfully."; - - let accountSID = notification.twilioAccountSID; - let apiKey = notification.twilioApiKey ? notification.twilioApiKey : accountSID; - let authToken = notification.twilioAuthToken; + let apiKey = notification.twilioApiKey ? notification.twilioApiKey : notification.twilioAccountSID; try { - let config = { headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8", - "Authorization": "Basic " + Buffer.from(apiKey + ":" + authToken).toString("base64"), + "Authorization": "Basic " + Buffer.from(apiKey + ":" + notification.twilioAuthToken).toString("base64"), } }; @@ -30,9 +25,7 @@ class Twilio extends NotificationProvider { data.append("From", notification.twilioFromNumber); data.append("Body", msg); - let url = "https://api.twilio.com/2010-04-01/Accounts/" + accountSID + "/Messages.json"; - - await axios.post(url, data, config); + await axios.post(`https://api.twilio.com/2010-04-01/Accounts/${(notification.twilioAccountSID)}/Messages.json`, data, config); return okMsg; } catch (error) { diff --git a/server/notification-providers/webhook.js b/server/notification-providers/webhook.js index 597ef846..986986d4 100644 --- a/server/notification-providers/webhook.js +++ b/server/notification-providers/webhook.js @@ -4,14 +4,13 @@ const FormData = require("form-data"); const { Liquid } = require("liquidjs"); class Webhook extends NotificationProvider { - name = "webhook"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { let data = { diff --git a/server/notification-providers/wecom.js b/server/notification-providers/wecom.js index ea30b26d..03fa7c18 100644 --- a/server/notification-providers/wecom.js +++ b/server/notification-providers/wecom.js @@ -3,24 +3,22 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class WeCom extends NotificationProvider { - name = "WeCom"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { - let WeComUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + notification.weComBotKey; let config = { headers: { "Content-Type": "application/json" } }; let body = this.composeMessage(heartbeatJSON, msg); - await axios.post(WeComUrl, body, config); + await axios.post(`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${notification.weComBotKey}`, body, config); return okMsg; } catch (error) { this.throwGeneralAxiosError(error); diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js index 08653e3d..10381c81 100644 --- a/server/notification-providers/zoho-cliq.js +++ b/server/notification-providers/zoho-cliq.js @@ -3,7 +3,6 @@ const axios = require("axios"); const { DOWN, UP } = require("../../src/util"); class ZohoCliq extends NotificationProvider { - name = "ZohoCliq"; /** @@ -80,7 +79,7 @@ class ZohoCliq extends NotificationProvider { * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { - let okMsg = "Sent Successfully."; + const okMsg = "Sent Successfully."; try { if (heartbeatJSON == null) { diff --git a/server/notification.js b/server/notification.js index 5e76d6eb..5a412c6e 100644 --- a/server/notification.js +++ b/server/notification.js @@ -16,6 +16,7 @@ const Gorush = require("./notification-providers/gorush"); const Gotify = require("./notification-providers/gotify"); const GrafanaOncall = require("./notification-providers/grafana-oncall"); const HomeAssistant = require("./notification-providers/home-assistant"); +const HeiiOnCall = require("./notification-providers/heii-oncall"); const Kook = require("./notification-providers/kook"); const Line = require("./notification-providers/line"); const LineNotify = require("./notification-providers/linenotify"); @@ -87,6 +88,7 @@ class Notification { new Gotify(), new GrafanaOncall(), new HomeAssistant(), + new HeiiOnCall(), new Kook(), new Line(), new LineNotify(), diff --git a/server/server.js b/server/server.js index eeffb063..45732471 100644 --- a/server/server.js +++ b/server/server.js @@ -294,7 +294,7 @@ let needSetup = false; log.debug("server", "Adding socket handler"); io.on("connection", async (socket) => { - sendInfo(socket, true); + await sendInfo(socket, true); if (needSetup) { log.info("server", "Redirect to setup page"); @@ -326,7 +326,7 @@ let needSetup = false; } log.debug("auth", "afterLogin"); - afterLogin(socket, user); + await afterLogin(socket, user); log.debug("auth", "afterLogin ok"); log.info("auth", `Successfully logged in user ${decoded.username}. IP=${clientIP}`); @@ -382,7 +382,7 @@ let needSetup = false; if (user) { if (user.twofa_status === 0) { - afterLogin(socket, user); + await afterLogin(socket, user); log.info("auth", `Successfully logged in user ${data.username}. IP=${clientIP}`); @@ -405,7 +405,7 @@ let needSetup = false; let verify = notp.totp.verify(data.token, user.twofa_secret, twoFAVerifyOptions); if (user.twofa_last_token !== data.token && verify) { - afterLogin(socket, user); + await afterLogin(socket, user); await R.exec("UPDATE `user` SET twofa_last_token = ? WHERE id = ? ", [ data.token, @@ -986,7 +986,7 @@ let needSetup = false; log.info("manage", `Delete Monitor: ${monitorID} User ID: ${socket.userID}`); if (monitorID in server.monitorList) { - server.monitorList[monitorID].stop(); + await server.monitorList[monitorID].stop(); delete server.monitorList[monitorID]; } @@ -1351,8 +1351,8 @@ let needSetup = false; msgi18n: true, }); - sendInfo(socket); - server.sendMaintenanceList(socket); + await sendInfo(socket); + await server.sendMaintenanceList(socket); } catch (e) { callback({ @@ -1532,7 +1532,7 @@ let needSetup = false; log.debug("auth", "check auto login"); if (await setting("disableAuth")) { log.info("auth", "Disabled Auth: auto login to admin"); - afterLogin(socket, await R.findOne("user")); + await afterLogin(socket, await R.findOne("user")); socket.emit("autoLogin"); } else { log.debug("auth", "need auth"); @@ -1548,7 +1548,7 @@ let needSetup = false; process.exit(1); }); - server.start(); + await server.start(); server.httpServer.listen(port, hostname, () => { if (hostname) { @@ -1619,13 +1619,13 @@ async function afterLogin(socket, user) { socket.join(user.id); let monitorList = await server.sendMonitorList(socket); - sendInfo(socket); - server.sendMaintenanceList(socket); - sendNotificationList(socket); - sendProxyList(socket); - sendDockerHostList(socket); - sendAPIKeyList(socket); - sendRemoteBrowserList(socket); + await sendInfo(socket); + await server.sendMaintenanceList(socket); + await sendNotificationList(socket); + await sendProxyList(socket); + await sendDockerHostList(socket); + await sendAPIKeyList(socket); + await sendRemoteBrowserList(socket); await sleep(500); @@ -1703,11 +1703,11 @@ async function startMonitor(userID, monitorID) { ]); if (monitor.id in server.monitorList) { - server.monitorList[monitor.id].stop(); + await server.monitorList[monitor.id].stop(); } server.monitorList[monitor.id] = monitor; - monitor.start(io); + await monitor.start(io); } /** @@ -1737,7 +1737,7 @@ async function pauseMonitor(userID, monitorID) { ]); if (monitorID in server.monitorList) { - server.monitorList[monitorID].stop(); + await server.monitorList[monitorID].stop(); server.monitorList[monitorID].active = 0; } } @@ -1754,7 +1754,7 @@ async function startMonitors() { } for (let monitor of list) { - monitor.start(io); + await monitor.start(io); // Give some delays, so all monitors won't make request at the same moment when just start the server. await sleep(getRandomInt(300, 1000)); } @@ -1775,7 +1775,7 @@ async function shutdownFunction(signal) { log.info("server", "Stopping all monitors"); for (let id in server.monitorList) { let monitor = server.monitorList[id]; - monitor.stop(); + await monitor.stop(); } await sleep(2000); await Database.close(); diff --git a/server/socket-handlers/database-socket-handler.js b/server/socket-handlers/database-socket-handler.js index 8441520a..bcf34c90 100644 --- a/server/socket-handlers/database-socket-handler.js +++ b/server/socket-handlers/database-socket-handler.js @@ -27,7 +27,7 @@ module.exports = (socket) => { socket.on("shrinkDatabase", async (callback) => { try { checkLogin(socket); - Database.shrink(); + await Database.shrink(); callback({ ok: true, }); diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index 2eec9c7c..bcf497b5 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -195,7 +195,7 @@ class UptimeKumaServer { /** * Send list of monitors to client * @param {Socket} socket Socket to send list on - * @returns {object} List of monitors + * @returns {Promise} List of monitors */ async sendMonitorList(socket) { let list = await this.getMonitorJSONList(socket.userID); @@ -227,7 +227,7 @@ class UptimeKumaServer { /** * Send maintenance list to client * @param {Socket} socket Socket.io instance to send to - * @returns {object} Maintenance list + * @returns {Promise} Maintenance list */ async sendMaintenanceList(socket) { return await this.sendMaintenanceListByUserID(socket.userID); @@ -236,7 +236,7 @@ class UptimeKumaServer { /** * Send list of maintenances to user * @param {number} userID User to send list to - * @returns {object} Maintenance list + * @returns {Promise} Maintenance list */ async sendMaintenanceListByUserID(userID) { let list = await this.getMaintenanceJSONList(userID); diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index 57a2fdf2..56580fbf 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -120,6 +120,7 @@ export default { "gorush": "Gorush", "gotify": "Gotify", "GrafanaOncall": "Grafana Oncall", + "HeiiOnCall": "Heii On-Call", "HomeAssistant": "Home Assistant", "Kook": "Kook", "line": "LINE Messenger", diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue index b77967c7..77fce260 100644 --- a/src/components/TagEditDialog.vue +++ b/src/components/TagEditDialog.vue @@ -288,7 +288,7 @@ export default { /** * Submit tag and monitorTag changes to server - * @returns {void} + * @returns {Promise} */ async submit() { this.processing = true; @@ -348,7 +348,7 @@ export default { /** * Delete the editing tag from server - * @returns {void} + * @returns {Promise} */ async deleteTag() { this.processing = true; diff --git a/src/components/TagsManager.vue b/src/components/TagsManager.vue index 37e0ca4e..6b77b1c3 100644 --- a/src/components/TagsManager.vue +++ b/src/components/TagsManager.vue @@ -384,7 +384,7 @@ export default { /** * Submit the form data * @param {number} monitorId ID of monitor this change affects - * @returns {void} + * @returns {Promise} */ async submit(monitorId) { console.log(`Submitting tag changes for monitor ${monitorId}...`); diff --git a/src/components/notifications/HeiiOnCall.vue b/src/components/notifications/HeiiOnCall.vue new file mode 100644 index 00000000..a61c1c32 --- /dev/null +++ b/src/components/notifications/HeiiOnCall.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue index 40473e93..a072c3ed 100644 --- a/src/components/notifications/Telegram.vue +++ b/src/components/notifications/Telegram.vue @@ -85,7 +85,7 @@ export default { /** * Get the telegram chat ID - * @returns {void} + * @returns {Promise} * @throws The chat ID could not be found */ async autoGetTelegramChatID() { diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js index 0606d41a..6cb0c9fd 100644 --- a/src/components/notifications/index.js +++ b/src/components/notifications/index.js @@ -14,6 +14,7 @@ import Gorush from "./Gorush.vue"; import Gotify from "./Gotify.vue"; import GrafanaOncall from "./GrafanaOncall.vue"; import HomeAssistant from "./HomeAssistant.vue"; +import HeiiOnCall from "./HeiiOnCall.vue"; import Kook from "./Kook.vue"; import Line from "./Line.vue"; import LineNotify from "./LineNotify.vue"; @@ -74,6 +75,7 @@ const NotificationFormList = { "gotify": Gotify, "GrafanaOncall": GrafanaOncall, "HomeAssistant": HomeAssistant, + "HeiiOnCall": HeiiOnCall, "Kook": Kook, "line": Line, "LineNotify": LineNotify, diff --git a/src/lang/en.json b/src/lang/en.json index 21828bdb..11190a08 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -885,5 +885,7 @@ "deleteRemoteBrowserMessage": "Are you sure want to delete this Remote Browser for all monitors?", "GrafanaOncallUrl": "Grafana Oncall URL", "Browser Screenshot": "Browser Screenshot", - "What is a Remote Browser?": "What is a Remote Browser?" + "What is a Remote Browser?": "What is a Remote Browser?", + "wayToGetHeiiOnCallDetails": "How to get the Trigger ID and API Keys is explained in the {documentation}", + "documentationOf": "{0} Documentation" } diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 72cb181e..e9f3ac83 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -1470,7 +1470,7 @@ message HealthCheckResponse { /** * Submit the form data for processing - * @returns {void} + * @returns {Promise} */ async submit() { @@ -1535,7 +1535,7 @@ message HealthCheckResponse { // Start the new parent monitor after edit is done if (createdNewParent) { - this.startParentGroupMonitor(); + await this.startParentGroupMonitor(); } this.processing = false; this.$root.getMonitorList();