diff --git a/server/monitor-types/sip-options.js b/server/monitor-types/sip-options.js new file mode 100644 index 000000000..1ce720170 --- /dev/null +++ b/server/monitor-types/sip-options.js @@ -0,0 +1,70 @@ +const { MonitorType } = require("./monitor-type"); +const { UP } = require("../../src/util"); +const { execFile } = require("promisify-child-process"); + +class SIPMonitorType extends MonitorType { + name = "sip-options"; + supportsConditions = false; + + /** + * Run the monitoring check on the given monitor + * @param {Monitor} monitor Monitor to check + * @param {Heartbeat} heartbeat Monitor heartbeat to update + * @param {UptimeKumaServer} _server Uptime Kuma server + * @returns {Promise} + * @throws Will throw an error if the command execution encounters any error. + */ + async check(monitor, heartbeat, _server) { + let sipsakOutput = await this.runSipSak(monitor.hostname, monitor.port, 3000); + this.parseSipsakResponse(sipsakOutput, heartbeat); + } + + /** + * Runs Sipsak options ping + * @param {string} hostname SIP server address to send options. + * @param {number} port SIP server port + * @param {number} timeout timeout of options reply + * @returns {Promise} A Promise that resolves to the output of the Sipsak options ping + * @throws Will throw an error if the command execution encounters any error. + */ + async runSipSak(hostname, port, timeout) { + const { stdout, stderr } = await execFile( + "sipsak", + [ + "-s", `sip:${hostname}:${port}`, + "--from", `sip:sipsak@${hostname}`, + "-v", + ], + { timeout } + ); + + if (!stdout && stderr && stderr.toString()) { + throw new Error(`Error in output: ${stderr.toString()}`); + } + if (stdout && stdout.toString()) { + return stdout.toString(); + } else { + throw new Error("No output from sipsak"); + } + } + + /** + * @param {string} res response to be parsed + * @param {object} heartbeat heartbeat object to update + * @returns {void} returns nothing + */ + parseSipsakResponse(res, heartbeat) { + let lines = res.split("\n"); + for (let line of lines) { + if (line.includes("200 OK")) { + heartbeat.status = UP; + heartbeat.msg = line; + break; + } + } + } +} + +module.exports = { + SIPMonitorType, +}; diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index 6ffd6a170..f813f8e80 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -121,6 +121,7 @@ class UptimeKumaServer { UptimeKumaServer.monitorTypeList["grpc-keyword"] = new GrpcKeywordMonitorType(); UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType(); UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType(); + UptimeKumaServer.monitorTypeList["sip-options"] = new SIPMonitorType(); UptimeKumaServer.monitorTypeList["gamedig"] = new GameDigMonitorType(); UptimeKumaServer.monitorTypeList["port"] = new TCPMonitorType(); UptimeKumaServer.monitorTypeList["manual"] = new ManualMonitorType(); @@ -572,6 +573,7 @@ const { SNMPMonitorType } = require("./monitor-types/snmp"); const { GrpcKeywordMonitorType } = require("./monitor-types/grpc"); const { MongodbMonitorType } = require("./monitor-types/mongodb"); const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq"); +const { SIPMonitorType } = require("./monitor-types/sip-options"); const { GameDigMonitorType } = require("./monitor-types/gamedig"); const { TCPMonitorType } = require("./monitor-types/tcp.js"); const { ManualMonitorType } = require("./monitor-types/manual"); diff --git a/src/lang/en.json b/src/lang/en.json index 90943a842..b6687bc3c 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -431,6 +431,7 @@ "socket": "Socket", "tcp": "TCP / HTTP", "tailscalePingWarning": "In order to use the Tailscale Ping monitor, you need to install Uptime Kuma without Docker and also install Tailscale client on your server.", + "sipsakPingWarning": "In order to use the SIP Options Ping monitor, you need to install Uptime Kuma without Docker and also install Sipsak client on your server.", "Docker Container": "Docker Container", "Container Name / ID": "Container Name / ID", "Docker Host": "Docker Host", diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 29eeb67f8..e673d9415 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -102,6 +102,9 @@ + @@ -120,6 +123,10 @@ {{ $t("tailscalePingWarning") }} + +
@@ -318,8 +325,8 @@ - -
+ +
- -
+ +