committed by
							
								 GitHub
								GitHub
							
						
					
				
				 7 changed files with 237 additions and 1 deletions
			
			
		| @ -0,0 +1,108 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | const { default: axios } = require("axios"); | ||||
|  | const Crypto = require("crypto"); | ||||
|  | const qs = require("qs"); | ||||
|  | 
 | ||||
|  | class AliyunSMS extends NotificationProvider { | ||||
|  |     name = "AliyunSMS"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully."; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             if (heartbeatJSON != null) { | ||||
|  |                 let msgBody = JSON.stringify({ | ||||
|  |                     name: monitorJSON["name"], | ||||
|  |                     time: heartbeatJSON["time"], | ||||
|  |                     status: this.statusToString(heartbeatJSON["status"]), | ||||
|  |                     msg: heartbeatJSON["msg"], | ||||
|  |                 }); | ||||
|  |                 if (this.sendSms(notification, msgBody)) { | ||||
|  |                     return okMsg; | ||||
|  |                 } | ||||
|  |             } else { | ||||
|  |                 let msgBody = JSON.stringify({ | ||||
|  |                     name: "", | ||||
|  |                     time: "", | ||||
|  |                     status: "", | ||||
|  |                     msg: msg, | ||||
|  |                 }); | ||||
|  |                 if (this.sendSms(notification, msgBody)) { | ||||
|  |                     return okMsg; | ||||
|  |                 } | ||||
|  |             } | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error); | ||||
|  |         } | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     async sendSms(notification, msgbody) { | ||||
|  |         let params = { | ||||
|  |             PhoneNumbers: notification.phonenumber, | ||||
|  |             TemplateCode: notification.templateCode, | ||||
|  |             SignName: notification.signName, | ||||
|  |             TemplateParam: msgbody, | ||||
|  |             AccessKeyId: notification.accessKeyId, | ||||
|  |             Format: "JSON", | ||||
|  |             SignatureMethod: "HMAC-SHA1", | ||||
|  |             SignatureVersion: "1.0", | ||||
|  |             SignatureNonce: Math.random().toString(), | ||||
|  |             Timestamp: new Date().toISOString(), | ||||
|  |             Action: "SendSms", | ||||
|  |             Version: "2017-05-25", | ||||
|  |         }; | ||||
|  | 
 | ||||
|  |         params.Signature = this.sign(params, notification.secretAccessKey); | ||||
|  |         let config = { | ||||
|  |             method: "POST", | ||||
|  |             url: "http://dysmsapi.aliyuncs.com/", | ||||
|  |             headers: { | ||||
|  |                 "Content-Type": "application/x-www-form-urlencoded", | ||||
|  |             }, | ||||
|  |             data: qs.stringify(params), | ||||
|  |         }; | ||||
|  | 
 | ||||
|  |         let result = await axios(config); | ||||
|  |         if (result.data.Message == "OK") { | ||||
|  |             return true; | ||||
|  |         } | ||||
|  |         return false; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** Aliyun request sign */ | ||||
|  |     sign(param, AccessKeySecret) { | ||||
|  |         let param2 = {}; | ||||
|  |         let data = []; | ||||
|  | 
 | ||||
|  |         let oa = Object.keys(param).sort(); | ||||
|  | 
 | ||||
|  |         for (let i = 0; i < oa.length; i++) { | ||||
|  |             let key = oa[i]; | ||||
|  |             param2[key] = param[key]; | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         for (let key in param2) { | ||||
|  |             data.push(`${encodeURIComponent(key)}=${encodeURIComponent(param2[key])}`); | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         let StringToSign = `POST&${encodeURIComponent("/")}&${encodeURIComponent(data.join("&"))}`; | ||||
|  |         return Crypto | ||||
|  |             .createHmac("sha1", `${AccessKeySecret}&`) | ||||
|  |             .update(Buffer.from(StringToSign)) | ||||
|  |             .digest("base64"); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     statusToString(status) { | ||||
|  |         switch (status) { | ||||
|  |             case DOWN: | ||||
|  |                 return "DOWN"; | ||||
|  |             case UP: | ||||
|  |                 return "UP"; | ||||
|  |             default: | ||||
|  |                 return status; | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = AliyunSMS; | ||||
| @ -0,0 +1,79 @@ | |||||
|  | const NotificationProvider = require("./notification-provider"); | ||||
|  | const { DOWN, UP } = require("../../src/util"); | ||||
|  | const { default: axios } = require("axios"); | ||||
|  | const Crypto = require("crypto"); | ||||
|  | 
 | ||||
|  | class DingDing extends NotificationProvider { | ||||
|  |     name = "DingDing"; | ||||
|  | 
 | ||||
|  |     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|  |         let okMsg = "Sent Successfully."; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             if (heartbeatJSON != null) { | ||||
|  |                 let params = { | ||||
|  |                     msgtype: "markdown", | ||||
|  |                     markdown: { | ||||
|  |                         title: monitorJSON["name"], | ||||
|  |                         text: `## [${this.statusToString(heartbeatJSON["status"])}] \n > ${heartbeatJSON["msg"]}  \n > Time(UTC):${heartbeatJSON["time"]}`, | ||||
|  |                     } | ||||
|  |                 }; | ||||
|  |                 if (this.sendToDingDing(notification, params)) { | ||||
|  |                     return okMsg; | ||||
|  |                 } | ||||
|  |             } else { | ||||
|  |                 let params = { | ||||
|  |                     msgtype: "text", | ||||
|  |                     text: { | ||||
|  |                         content: msg | ||||
|  |                     } | ||||
|  |                 }; | ||||
|  |                 if (this.sendToDingDing(notification, params)) { | ||||
|  |                     return okMsg; | ||||
|  |                 } | ||||
|  |             } | ||||
|  |         } catch (error) { | ||||
|  |             this.throwGeneralAxiosError(error); | ||||
|  |         } | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     async sendToDingDing(notification, params) { | ||||
|  |         let timestamp = Date.now(); | ||||
|  | 
 | ||||
|  |         let config = { | ||||
|  |             method: "POST", | ||||
|  |             headers: { | ||||
|  |                 "Content-Type": "application/json", | ||||
|  |             }, | ||||
|  |             url: `${notification.webHookUrl}×tamp=${timestamp}&sign=${encodeURIComponent(this.sign(timestamp, notification.secretKey))}`, | ||||
|  |             data: JSON.stringify(params), | ||||
|  |         }; | ||||
|  | 
 | ||||
|  |         let result = await axios(config); | ||||
|  |         if (result.data.errmsg == "ok") { | ||||
|  |             return true; | ||||
|  |         } | ||||
|  |         return false; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** DingDing sign */ | ||||
|  |     sign(timestamp, secretKey) { | ||||
|  |         return Crypto | ||||
|  |             .createHmac("sha256", Buffer.from(secretKey, "utf8")) | ||||
|  |             .update(Buffer.from(`${timestamp}\n${secretKey}`, "utf8")) | ||||
|  |             .digest("base64"); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     statusToString(status) { | ||||
|  |         switch (status) { | ||||
|  |             case DOWN: | ||||
|  |                 return "DOWN"; | ||||
|  |             case UP: | ||||
|  |                 return "UP"; | ||||
|  |             default: | ||||
|  |                 return status; | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | module.exports = DingDing; | ||||
| @ -0,0 +1,25 @@ | |||||
|  | <template> | ||||
|  |     <div class="mb-3"> | ||||
|  |         <label for="accessKeyId" class="form-label">{{ $t("AccessKeyId") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="accessKeyId" v-model="$parent.notification.accessKeyId" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <label for="secretAccessKey" class="form-label">{{ $t("SecretAccessKey") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="secretAccessKey" v-model="$parent.notification.secretAccessKey" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <label for="phonenumber" class="form-label">{{ $t("Phonenumber") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="phonenumber" v-model="$parent.notification.phonenumber" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <label for="templateCode" class="form-label">{{ $t("TemplateCode") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="templateCode" v-model="$parent.notification.templateCode" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <label for="signName" class="form-label">{{ $t("SignName") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="signName" v-model="$parent.notification.signName" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <div class="form-text"> | ||||
|  |             <p>Sms template must contain parameters: <br> <code>${name} ${time} ${status} ${msg}</code></p> | ||||
|  |             <i18n-t tag="p" keypath="Read more:"> | ||||
|  |                 <a href="https://help.aliyun.com/document_detail/101414.html" target="_blank">https://help.aliyun.com/document_detail/101414.html</a> | ||||
|  |             </i18n-t> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </template> | ||||
| @ -0,0 +1,16 @@ | |||||
|  | <template> | ||||
|  |     <div class="mb-3"> | ||||
|  |         <label for="WebHookUrl" class="form-label">{{ $t("WebHookUrl") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="WebHookUrl" v-model="$parent.notification.webHookUrl" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <label for="secretKey" class="form-label">{{ $t("SecretKey") }}<span style="color: red;"><sup>*</sup></span></label> | ||||
|  |         <input id="secretKey" v-model="$parent.notification.secretKey" type="text" class="form-control" required> | ||||
|  | 
 | ||||
|  |         <div class="form-text"> | ||||
|  |             <p>For safety, must use secret key</p> | ||||
|  |             <i18n-t tag="p" keypath="Read more:"> | ||||
|  |                 <a href="https://developers.dingtalk.com/document/robots/custom-robot-access" target="_blank">https://developers.dingtalk.com/document/robots/custom-robot-access</a> | ||||
|  |             </i18n-t> | ||||
|  |         </div> | ||||
|  |     </div> | ||||
|  | </template> | ||||
					Loading…
					
					
				
		Reference in new issue