You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.6 KiB
96 lines
3.6 KiB
// This notification provider is only compatible with Teltonika RMS >= 7.14.0 devices.
|
|
// See: https://community.teltonika.lt/t/implementation-of-read-only-system-files-and-mobile-and-i-o-post-get-service-removal-with-rutos-7-14/12470
|
|
// API reference https://developers.teltonika-networks.com/reference/rut241/7.19.4/v1.11.1/messages
|
|
|
|
const NotificationProvider = require("./notification-provider");
|
|
const axios = require("axios");
|
|
const https = require("https");
|
|
|
|
class Teltonika extends NotificationProvider {
|
|
name = "Teltonika";
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
|
const okMsg = "Sent Successfully.";
|
|
|
|
// baseUrl is passed via the configuration screen.
|
|
// Must be limited to _just_ the full origin, so: proto://host:port.
|
|
// Everything else should be stripped. Best way to validate is to use URL().
|
|
|
|
let passedUrl = "";
|
|
try {
|
|
passedUrl = new URL(notification.teltonikaUrl);
|
|
} catch (error) {
|
|
throw Error("Invalid URL: " + notification.teltonikaUrl);
|
|
}
|
|
|
|
const baseUrl = passedUrl.origin;
|
|
const loginUrl = baseUrl + "/api/login";
|
|
const smsUrl = baseUrl + "/api/messages/actions/send";
|
|
|
|
// Teltonika SMS gateway supports a max of 160 chars for its messages.
|
|
const cleanMsg = msg.substring(0, 159);
|
|
|
|
// Starting communications with the API from here on out.
|
|
try {
|
|
let axiosConfig = {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"cache-control": "no-cache",
|
|
Accept: "application/json",
|
|
},
|
|
};
|
|
|
|
// In many cases, Teltonika routers will be setup using a self-signed
|
|
// certificate. Here we give them an option to disable certificate
|
|
// validation. It's not desirable, but sometimes the only option.
|
|
if (notification.teltonikaUnsafeTls) {
|
|
axiosConfig.httpsAgent = new https.Agent({
|
|
rejectUnauthorized: false, // Danger! Disables SSL verification
|
|
});
|
|
}
|
|
|
|
axiosConfig = this.getAxiosConfigWithProxy(axiosConfig);
|
|
|
|
// Logging in, to get an access token.
|
|
// API reference https://developers.teltonika-networks.com/reference/rut241/7.19.4/v1.11.1/authentication
|
|
// Teltonika's API access tokens expire in 5 minutes, so we always get a new one.
|
|
let loginData = {
|
|
username: notification.teltonikaUsername,
|
|
password: notification.teltonikaPassword,
|
|
};
|
|
|
|
let loginResp = await axios.post(loginUrl, loginData, axiosConfig);
|
|
|
|
if (loginResp.data.success !== true) {
|
|
throw Error("Login failed: " + loginResp.data.errors.error);
|
|
}
|
|
|
|
// Sending the SMS.
|
|
let smsData = {
|
|
data: {
|
|
modem: notification.teltonikaModem,
|
|
number: notification.teltonikaPhoneNumber,
|
|
message: cleanMsg,
|
|
},
|
|
};
|
|
|
|
axiosConfig.headers.Authorization = "Bearer " + loginResp.data.data.token;
|
|
|
|
let smsResp = await axios.post(smsUrl, smsData, axiosConfig);
|
|
|
|
if (smsResp.data.success !== true) {
|
|
throw Error("Api returned: ", smsResp.data.errors.error);
|
|
}
|
|
|
|
return okMsg;
|
|
} catch (error) {
|
|
this.throwGeneralAxiosError(error);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = Teltonika;
|