20 changed files with 918 additions and 654 deletions
			
			
		| @ -0,0 +1,26 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const child_process = require("child_process"); | ||||
|  | 
 | ||||
|  | class Apprise extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "apprise"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let s = child_process.spawnSync("apprise", [ "-vv", "-b", msg, notification.appriseURL]) | ||||
|  | 
 | ||||
|  |         let output = (s.stdout) ? s.stdout.toString() : "ERROR: maybe apprise not found"; | ||||
|  | 
 | ||||
|  |         if (output) { | ||||
|  | 
 | ||||
|  |             if (! output.includes("ERROR")) { | ||||
|  |                 return "Sent Successfully"; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             throw new Error(output) | ||||
|  |         } else { | ||||
|  |             return "No output from apprise"; | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Apprise; | ||||
| @ -0,0 +1,105 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | 
 | ||||
|  | class Discord extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "discord"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             const discordDisplayName = notification.discordUsername || "Uptime Kuma"; | ||||
|  | 
 | ||||
|  |             // If heartbeatJSON is null, assume we're testing.
 | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 let discordtestdata = { | ||||
|  |                     username: discordDisplayName, | ||||
|  |                     content: msg, | ||||
|  |                 } | ||||
|  |                 await axios.post(notification.discordWebhookUrl, discordtestdata) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             let url; | ||||
|  | 
 | ||||
|  |             if (monitorJSON["type"] === "port") { | ||||
|  |                 url = monitorJSON["hostname"]; | ||||
|  |                 if (monitorJSON["port"]) { | ||||
|  |                     url += ":" + monitorJSON["port"]; | ||||
|  |                 } | ||||
|  | 
 | ||||
|  |             } else { | ||||
|  |                 url = monitorJSON["url"]; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             // If heartbeatJSON is not null, we go into the normal alerting loop.
 | ||||
|  |             if (heartbeatJSON["status"] == DOWN) { | ||||
|  |                 let discorddowndata = { | ||||
|  |                     username: discordDisplayName, | ||||
|  |                     embeds: [{ | ||||
|  |                         title: "❌ Your service " + monitorJSON["name"] + " went down. ❌", | ||||
|  |                         color: 16711680, | ||||
|  |                         timestamp: heartbeatJSON["time"], | ||||
|  |                         fields: [ | ||||
|  |                             { | ||||
|  |                                 name: "Service Name", | ||||
|  |                                 value: monitorJSON["name"], | ||||
|  |                             }, | ||||
|  |                             { | ||||
|  |                                 name: "Service URL", | ||||
|  |                                 value: url, | ||||
|  |                             }, | ||||
|  |                             { | ||||
|  |                                 name: "Time (UTC)", | ||||
|  |                                 value: heartbeatJSON["time"], | ||||
|  |                             }, | ||||
|  |                             { | ||||
|  |                                 name: "Error", | ||||
|  |                                 value: heartbeatJSON["msg"], | ||||
|  |                             }, | ||||
|  |                         ], | ||||
|  |                     }], | ||||
|  |                 } | ||||
|  |                 await axios.post(notification.discordWebhookUrl, discorddowndata) | ||||
|  |                 return okMsg; | ||||
|  | 
 | ||||
|  |             } else if (heartbeatJSON["status"] == UP) { | ||||
|  |                 let discordupdata = { | ||||
|  |                     username: discordDisplayName, | ||||
|  |                     embeds: [{ | ||||
|  |                         title: "✅ Your service " + monitorJSON["name"] + " is up! ✅", | ||||
|  |                         color: 65280, | ||||
|  |                         timestamp: heartbeatJSON["time"], | ||||
|  |                         fields: [ | ||||
|  |                             { | ||||
|  |                                 name: "Service Name", | ||||
|  |                                 value: monitorJSON["name"], | ||||
|  |                             }, | ||||
|  |                             { | ||||
|  |                                 name: "Service URL", | ||||
|  |                                 value: url.startsWith("http") ? "[Visit Service](" + url + ")" : url, | ||||
|  |                             }, | ||||
|  |                             { | ||||
|  |                                 name: "Time (UTC)", | ||||
|  |                                 value: heartbeatJSON["time"], | ||||
|  |                             }, | ||||
|  |                             { | ||||
|  |                                 name: "Ping", | ||||
|  |                                 value: heartbeatJSON["ping"] + "ms", | ||||
|  |                             }, | ||||
|  |                         ], | ||||
|  |                     }], | ||||
|  |                 } | ||||
|  |                 await axios.post(notification.discordWebhookUrl, discordupdata) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  |     } | ||||
|  | 
 | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Discord; | ||||
| @ -0,0 +1,28 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Gotify extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "gotify"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         try { | ||||
|  |             if (notification.gotifyserverurl && notification.gotifyserverurl.endsWith("/")) { | ||||
|  |                 notification.gotifyserverurl = notification.gotifyserverurl.slice(0, -1); | ||||
|  |             } | ||||
|  |             await axios.post(`${notification.gotifyserverurl}/message?token=${notification.gotifyapplicationToken}`, { | ||||
|  |                 "message": msg, | ||||
|  |                 "priority": notification.gotifyPriority || 8, | ||||
|  |                 "title": "Uptime-Kuma", | ||||
|  |             }) | ||||
|  | 
 | ||||
|  |             return okMsg; | ||||
|  | 
 | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error); | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Gotify; | ||||
| @ -0,0 +1,60 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | 
 | ||||
|  | class Line extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "line"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         try { | ||||
|  |             let lineAPIUrl = "https://api.line.me/v2/bot/message/push"; | ||||
|  |             let config = { | ||||
|  |                 headers: { | ||||
|  |                     "Content-Type": "application/json", | ||||
|  |                     "Authorization": "Bearer " + notification.lineChannelAccessToken | ||||
|  |                 } | ||||
|  |             }; | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 let testMessage = { | ||||
|  |                     "to": notification.lineUserID, | ||||
|  |                     "messages": [ | ||||
|  |                         { | ||||
|  |                             "type": "text", | ||||
|  |                             "text": "Test Successful!" | ||||
|  |                         } | ||||
|  |                     ] | ||||
|  |                 } | ||||
|  |                 await axios.post(lineAPIUrl, testMessage, config) | ||||
|  |             } else if (heartbeatJSON["status"] == DOWN) { | ||||
|  |                 let downMessage = { | ||||
|  |                     "to": notification.lineUserID, | ||||
|  |                     "messages": [ | ||||
|  |                         { | ||||
|  |                             "type": "text", | ||||
|  |                             "text": "UptimeKuma Alert: [🔴 Down]\n" + "Name: " + monitorJSON["name"] + " \n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"] | ||||
|  |                         } | ||||
|  |                     ] | ||||
|  |                 } | ||||
|  |                 await axios.post(lineAPIUrl, downMessage, config) | ||||
|  |             } else if (heartbeatJSON["status"] == UP) { | ||||
|  |                 let upMessage = { | ||||
|  |                     "to": notification.lineUserID, | ||||
|  |                     "messages": [ | ||||
|  |                         { | ||||
|  |                             "type": "text", | ||||
|  |                             "text": "UptimeKuma Alert: [✅ Up]\n" + "Name: " + monitorJSON["name"] + " \n" + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"] | ||||
|  |                         } | ||||
|  |                     ] | ||||
|  |                 } | ||||
|  |                 await axios.post(lineAPIUrl, upMessage, config) | ||||
|  |             } | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Line; | ||||
| @ -0,0 +1,48 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | 
 | ||||
|  | class LunaSea extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "lunasea"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         let lunaseadevice = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 let testdata = { | ||||
|  |                     "title": "Uptime Kuma Alert", | ||||
|  |                     "body": "Testing Successful.", | ||||
|  |                 } | ||||
|  |                 await axios.post(lunaseadevice, testdata) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             if (heartbeatJSON["status"] == DOWN) { | ||||
|  |                 let downdata = { | ||||
|  |                     "title": "UptimeKuma Alert: " + monitorJSON["name"], | ||||
|  |                     "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], | ||||
|  |                 } | ||||
|  |                 await axios.post(lunaseadevice, downdata) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             if (heartbeatJSON["status"] == UP) { | ||||
|  |                 let updata = { | ||||
|  |                     "title": "UptimeKuma Alert: " + monitorJSON["name"], | ||||
|  |                     "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], | ||||
|  |                 } | ||||
|  |                 await axios.post(lunaseadevice, updata) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = LunaSea; | ||||
| @ -0,0 +1,123 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | 
 | ||||
|  | class Mattermost extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "mattermost"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         try { | ||||
|  |             const mattermostUserName = notification.mattermostusername || "Uptime Kuma"; | ||||
|  |             // If heartbeatJSON is null, assume we're testing.
 | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 let mattermostTestData = { | ||||
|  |                     username: mattermostUserName, | ||||
|  |                     text: msg, | ||||
|  |                 } | ||||
|  |                 await axios.post(notification.mattermostWebhookUrl, mattermostTestData) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             const mattermostChannel = notification.mattermostchannel; | ||||
|  |             const mattermostIconEmoji = notification.mattermosticonemo; | ||||
|  |             const mattermostIconUrl = notification.mattermosticonurl; | ||||
|  | 
 | ||||
|  |             if (heartbeatJSON["status"] == DOWN) { | ||||
|  |                 let mattermostdowndata = { | ||||
|  |                     username: mattermostUserName, | ||||
|  |                     text: "Uptime Kuma Alert", | ||||
|  |                     channel: mattermostChannel, | ||||
|  |                     icon_emoji: mattermostIconEmoji, | ||||
|  |                     icon_url: mattermostIconUrl, | ||||
|  |                     attachments: [ | ||||
|  |                         { | ||||
|  |                             fallback: | ||||
|  |                                 "Your " + | ||||
|  |                                 monitorJSON["name"] + | ||||
|  |                                 " service went down.", | ||||
|  |                             color: "#FF0000", | ||||
|  |                             title: | ||||
|  |                                 "❌ " + | ||||
|  |                                 monitorJSON["name"] + | ||||
|  |                                 " service went down. ❌", | ||||
|  |                             title_link: monitorJSON["url"], | ||||
|  |                             fields: [ | ||||
|  |                                 { | ||||
|  |                                     short: true, | ||||
|  |                                     title: "Service Name", | ||||
|  |                                     value: monitorJSON["name"], | ||||
|  |                                 }, | ||||
|  |                                 { | ||||
|  |                                     short: true, | ||||
|  |                                     title: "Time (UTC)", | ||||
|  |                                     value: heartbeatJSON["time"], | ||||
|  |                                 }, | ||||
|  |                                 { | ||||
|  |                                     short: false, | ||||
|  |                                     title: "Error", | ||||
|  |                                     value: heartbeatJSON["msg"], | ||||
|  |                                 }, | ||||
|  |                             ], | ||||
|  |                         }, | ||||
|  |                     ], | ||||
|  |                 }; | ||||
|  |                 await axios.post( | ||||
|  |                     notification.mattermostWebhookUrl, | ||||
|  |                     mattermostdowndata | ||||
|  |                 ); | ||||
|  |                 return okMsg; | ||||
|  |             } else if (heartbeatJSON["status"] == UP) { | ||||
|  |                 let mattermostupdata = { | ||||
|  |                     username: mattermostUserName, | ||||
|  |                     text: "Uptime Kuma Alert", | ||||
|  |                     channel: mattermostChannel, | ||||
|  |                     icon_emoji: mattermostIconEmoji, | ||||
|  |                     icon_url: mattermostIconUrl, | ||||
|  |                     attachments: [ | ||||
|  |                         { | ||||
|  |                             fallback: | ||||
|  |                                 "Your " + | ||||
|  |                                 monitorJSON["name"] + | ||||
|  |                                 " service went up!", | ||||
|  |                             color: "#32CD32", | ||||
|  |                             title: | ||||
|  |                                 "✅ " + | ||||
|  |                                 monitorJSON["name"] + | ||||
|  |                                 " service went up! ✅", | ||||
|  |                             title_link: monitorJSON["url"], | ||||
|  |                             fields: [ | ||||
|  |                                 { | ||||
|  |                                     short: true, | ||||
|  |                                     title: "Service Name", | ||||
|  |                                     value: monitorJSON["name"], | ||||
|  |                                 }, | ||||
|  |                                 { | ||||
|  |                                     short: true, | ||||
|  |                                     title: "Time (UTC)", | ||||
|  |                                     value: heartbeatJSON["time"], | ||||
|  |                                 }, | ||||
|  |                                 { | ||||
|  |                                     short: false, | ||||
|  |                                     title: "Ping", | ||||
|  |                                     value: heartbeatJSON["ping"] + "ms", | ||||
|  |                                 }, | ||||
|  |                             ], | ||||
|  |                         }, | ||||
|  |                     ], | ||||
|  |                 }; | ||||
|  |                 await axios.post( | ||||
|  |                     notification.mattermostWebhookUrl, | ||||
|  |                     mattermostupdata | ||||
|  |                 ); | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error); | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Mattermost; | ||||
| @ -0,0 +1,36 @@ | |||||
|  | class NotificationProvider { | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * Notification Provider Name | ||||
|  |      * @type string | ||||
|  |      */ | ||||
|  |     name = undefined; | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * @param notification : BeanModel | ||||
|  |      * @param msg : string General Message | ||||
|  |      * @param monitorJSON : object Monitor details (For Up/Down only) | ||||
|  |      * @param heartbeatJSON : object Heartbeat details (For Up/Down only) | ||||
|  |      * @returns {Promise<string>} Return Successful Message | ||||
|  |      * Throw Error with fail msg | ||||
|  |      */ | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         throw new Error("Have to override Notification.send(...)"); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     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 = NotificationProvider; | ||||
| @ -0,0 +1,40 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Octopush extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "octopush"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             let config = { | ||||
|  |                 headers: { | ||||
|  |                     "api-key": notification.octopushAPIKey, | ||||
|  |                     "api-login": notification.octopushLogin, | ||||
|  |                     "cache-control": "no-cache" | ||||
|  |                 } | ||||
|  |             }; | ||||
|  |             let data = { | ||||
|  |                 "recipients": [ | ||||
|  |                     { | ||||
|  |                         "phone_number": notification.octopushPhoneNumber | ||||
|  |                     } | ||||
|  |                 ], | ||||
|  |                 //octopush not supporting non ascii char
 | ||||
|  |                 "text": msg.replace(/[^\x00-\x7F]/g, ""), | ||||
|  |                 "type": notification.octopushSMSType, | ||||
|  |                 "purpose": "alert", | ||||
|  |                 "sender": notification.octopushSenderName | ||||
|  |             }; | ||||
|  | 
 | ||||
|  |             await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config) | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error); | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Octopush; | ||||
| @ -0,0 +1,50 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | 
 | ||||
|  | class Pushbullet extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "pushbullet"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             let pushbulletUrl = "https://api.pushbullet.com/v2/pushes"; | ||||
|  |             let config = { | ||||
|  |                 headers: { | ||||
|  |                     "Access-Token": notification.pushbulletAccessToken, | ||||
|  |                     "Content-Type": "application/json" | ||||
|  |                 } | ||||
|  |             }; | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 let testdata = { | ||||
|  |                     "type": "note", | ||||
|  |                     "title": "Uptime Kuma Alert", | ||||
|  |                     "body": "Testing Successful.", | ||||
|  |                 } | ||||
|  |                 await axios.post(pushbulletUrl, testdata, config) | ||||
|  |             } else if (heartbeatJSON["status"] == DOWN) { | ||||
|  |                 let downdata = { | ||||
|  |                     "type": "note", | ||||
|  |                     "title": "UptimeKuma Alert: " + monitorJSON["name"], | ||||
|  |                     "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], | ||||
|  |                 } | ||||
|  |                 await axios.post(pushbulletUrl, downdata, config) | ||||
|  |             } else if (heartbeatJSON["status"] == UP) { | ||||
|  |                 let updata = { | ||||
|  |                     "type": "note", | ||||
|  |                     "title": "UptimeKuma Alert: " + monitorJSON["name"], | ||||
|  |                     "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"], | ||||
|  |                 } | ||||
|  |                 await axios.post(pushbulletUrl, updata, config) | ||||
|  |             } | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Pushbullet; | ||||
| @ -0,0 +1,49 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Pushover extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "pushover"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         let pushoverlink = "https://api.pushover.net/1/messages.json" | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 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, | ||||
|  |                 } | ||||
|  |                 await axios.post(pushoverlink, data) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             let data = { | ||||
|  |                 "message": "<b>Uptime Kuma Alert</b>\n\n<b>Message</b>:" + msg + "\n<b>Time (UTC)</b>:" + heartbeatJSON["time"], | ||||
|  |                 "user": notification.pushoveruserkey, | ||||
|  |                 "token": notification.pushoverapptoken, | ||||
|  |                 "sound": notification.pushoversounds, | ||||
|  |                 "priority": notification.pushoverpriority, | ||||
|  |                 "title": notification.pushovertitle, | ||||
|  |                 "retry": "30", | ||||
|  |                 "expire": "3600", | ||||
|  |                 "html": 1, | ||||
|  |             } | ||||
|  |             await axios.post(pushoverlink, data) | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Pushover; | ||||
| @ -0,0 +1,30 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Pushy extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "pushy"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             await axios.post(`https://api.pushy.me/push?api_key=${notification.pushyAPIKey}`, { | ||||
|  |                 "to": notification.pushyToken, | ||||
|  |                 "data": { | ||||
|  |                     "message": "Uptime-Kuma" | ||||
|  |                 }, | ||||
|  |                 "notification": { | ||||
|  |                     "body": msg, | ||||
|  |                     "badge": 1, | ||||
|  |                     "sound": "ping.aiff" | ||||
|  |                 } | ||||
|  |             }) | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Pushy; | ||||
| @ -0,0 +1,46 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class RocketChat extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "rocket.chat"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         try { | ||||
|  |             if (heartbeatJSON == null) { | ||||
|  |                 let data = { | ||||
|  |                     "text": "Uptime Kuma Rocket.chat testing successful.", | ||||
|  |                     "channel": notification.rocketchannel, | ||||
|  |                     "username": notification.rocketusername, | ||||
|  |                     "icon_emoji": notification.rocketiconemo, | ||||
|  |                 } | ||||
|  |                 await axios.post(notification.rocketwebhookURL, data) | ||||
|  |                 return okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             const time = heartbeatJSON["time"]; | ||||
|  |             let data = { | ||||
|  |                 "text": "Uptime Kuma Alert", | ||||
|  |                 "channel": notification.rocketchannel, | ||||
|  |                 "username": notification.rocketusername, | ||||
|  |                 "icon_emoji": notification.rocketiconemo, | ||||
|  |                 "attachments": [ | ||||
|  |                     { | ||||
|  |                         "title": "Uptime Kuma Alert *Time (UTC)*\n" + time, | ||||
|  |                         "title_link": notification.rocketbutton, | ||||
|  |                         "text": "*Message*\n" + msg, | ||||
|  |                         "color": "#32cd32" | ||||
|  |                     } | ||||
|  |                 ] | ||||
|  |             } | ||||
|  |             await axios.post(notification.rocketwebhookURL, data) | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = RocketChat; | ||||
| @ -0,0 +1,27 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Signal extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "signal"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             let data = { | ||||
|  |                 "message": msg, | ||||
|  |                 "number": notification.signalNumber, | ||||
|  |                 "recipients": notification.signalRecipients.replace(/\s/g, "").split(","), | ||||
|  |             }; | ||||
|  |             let config = {}; | ||||
|  | 
 | ||||
|  |             await axios.post(notification.signalURL, data, config) | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Signal; | ||||
| @ -0,0 +1,70 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Slack extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "slack"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  |         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 okMsg; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             const time = heartbeatJSON["time"]; | ||||
|  |             let data = { | ||||
|  |                 "text": "Uptime Kuma Alert", | ||||
|  |                 "channel": notification.slackchannel, | ||||
|  |                 "username": notification.slackusername, | ||||
|  |                 "icon_emoji": notification.slackiconemo, | ||||
|  |                 "blocks": [{ | ||||
|  |                     "type": "header", | ||||
|  |                     "text": { | ||||
|  |                         "type": "plain_text", | ||||
|  |                         "text": "Uptime Kuma Alert", | ||||
|  |                     }, | ||||
|  |                 }, | ||||
|  |                 { | ||||
|  |                     "type": "section", | ||||
|  |                     "fields": [{ | ||||
|  |                         "type": "mrkdwn", | ||||
|  |                         "text": "*Message*\n" + msg, | ||||
|  |                     }, | ||||
|  |                     { | ||||
|  |                         "type": "mrkdwn", | ||||
|  |                         "text": "*Time (UTC)*\n" + time, | ||||
|  |                     }], | ||||
|  |                 }, | ||||
|  |                 { | ||||
|  |                     "type": "actions", | ||||
|  |                     "elements": [ | ||||
|  |                         { | ||||
|  |                             "type": "button", | ||||
|  |                             "text": { | ||||
|  |                                 "type": "plain_text", | ||||
|  |                                 "text": "Visit Uptime Kuma", | ||||
|  |                             }, | ||||
|  |                             "value": "Uptime-Kuma", | ||||
|  |                             "url": notification.slackbutton || "https://github.com/louislam/uptime-kuma", | ||||
|  |                         }, | ||||
|  |                     ], | ||||
|  |                 }], | ||||
|  |             } | ||||
|  |             await axios.post(notification.slackwebhookURL, data) | ||||
|  |             return okMsg; | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Slack; | ||||
| @ -0,0 +1,43 @@ | |||||
|  | const nodemailer = require("nodemailer"); | ||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | 
 | ||||
|  | class SMTP extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "smtp"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  | 
 | ||||
|  |         const config = { | ||||
|  |             host: notification.smtpHost, | ||||
|  |             port: notification.smtpPort, | ||||
|  |             secure: notification.smtpSecure, | ||||
|  |         }; | ||||
|  | 
 | ||||
|  |         // Should fix the issue in https://github.com/louislam/uptime-kuma/issues/26#issuecomment-896373904
 | ||||
|  |         if (notification.smtpUsername || notification.smtpPassword) { | ||||
|  |             config.auth = { | ||||
|  |                 user: notification.smtpUsername, | ||||
|  |                 pass: notification.smtpPassword, | ||||
|  |             }; | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         let transporter = nodemailer.createTransport(config); | ||||
|  | 
 | ||||
|  |         let bodyTextContent = msg; | ||||
|  |         if (heartbeatJSON) { | ||||
|  |             bodyTextContent = `${msg}\nTime (UTC): ${heartbeatJSON["time"]}`; | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         // send mail with defined transport object
 | ||||
|  |         await transporter.sendMail({ | ||||
|  |             from: `"Uptime Kuma" <${notification.smtpFrom}>`, | ||||
|  |             to: notification.smtpTo, | ||||
|  |             subject: msg, | ||||
|  |             text: bodyTextContent, | ||||
|  |         }); | ||||
|  | 
 | ||||
|  |         return "Sent Successfully."; | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = SMTP; | ||||
| @ -0,0 +1,27 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | 
 | ||||
|  | class Telegram extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "telegram"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, { | ||||
|  |                 params: { | ||||
|  |                     chat_id: notification.telegramChatID, | ||||
|  |                     text: msg, | ||||
|  |                 }, | ||||
|  |             }) | ||||
|  |             return okMsg; | ||||
|  | 
 | ||||
|  |         } catch (error) { | ||||
|  |             let msg = (error.response.data.description) ? error.response.data.description : "Error without description" | ||||
|  |             throw new Error(msg) | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Telegram; | ||||
| @ -0,0 +1,44 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const axios = require("axios"); | ||||
|  | const FormData = require("form-data"); | ||||
|  | 
 | ||||
|  | class Webhook extends NotificationProvider { | ||||
|  | 
 | ||||
|  |     name = "webhook"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully. "; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             let data = { | ||||
|  |                 heartbeat: heartbeatJSON, | ||||
|  |                 monitor: monitorJSON, | ||||
|  |                 msg, | ||||
|  |             }; | ||||
|  |             let finalData; | ||||
|  |             let config = {}; | ||||
|  | 
 | ||||
|  |             if (notification.webhookContentType === "form-data") { | ||||
|  |                 finalData = new FormData(); | ||||
|  |                 finalData.append("data", JSON.stringify(data)); | ||||
|  | 
 | ||||
|  |                 config = { | ||||
|  |                     headers: finalData.getHeaders(), | ||||
|  |                 } | ||||
|  | 
 | ||||
|  |             } else { | ||||
|  |                 finalData = data; | ||||
|  |             } | ||||
|  | 
 | ||||
|  |             await axios.post(notification.webhookURL, finalData, config) | ||||
|  |             return okMsg; | ||||
|  | 
 | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error) | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     } | ||||
|  | 
 | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = Webhook; | ||||
					Loading…
					
					
				
		Reference in new issue