diff --git a/server/monitor-types/sip-options.js b/server/monitor-types/sip-options.js new file mode 100644 index 000000000..fc0bbff7e --- /dev/null +++ b/server/monitor-types/sip-options.js @@ -0,0 +1,61 @@ +const { MonitorType } = require("./monitor-type"); +const { UP, log } = require("../../src/util"); +const { exec } = 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} + */ + async check(monitor, heartbeat, _server) { + try { + let sipsakOutput = await this.runSipSak(monitor.hostname, monitor.port, 3000); + this.parseSipsakResponse(sipsakOutput, heartbeat); + } catch (err) { + throw new Error(`Error checking Sipsak: ${err} ${err.message} ${err.stack}`); + } + } + + /** + * Runs Sipsak options ping + * @param {string} hostname SIP server address to send options. + * @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 exec(`sipsak -s sip:${hostname}:${port} --from sip:sipsak@${hostname} -v`,{timeout:timeout}); + if (stderr){ + console.error(`Error in stderr: ${stderr.toString()}`); + } + 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"); + } + } + + 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 062f098d7..63102ea04 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -116,6 +116,7 @@ class UptimeKumaServer { UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType(); UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType(); UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType(); + UptimeKumaServer.monitorTypeList["sip-options"] = new SIPMonitorType(); // Allow all CORS origins (polling) in development let cors = undefined; @@ -554,4 +555,5 @@ const { MqttMonitorType } = require("./monitor-types/mqtt"); const { SNMPMonitorType } = require("./monitor-types/snmp"); const { MongodbMonitorType } = require("./monitor-types/mongodb"); const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq"); -const Monitor = require("./model/monitor"); +const Monitor = require("./model/monitor");const { SIPMonitorType } = require("./monitor-types/sip-options"); + diff --git a/src/lang/en.json b/src/lang/en.json index e215f1031..911bacfbf 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -405,6 +405,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 a83f91cab..b8334458f 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -88,9 +88,12 @@ + + @@ -106,6 +109,10 @@ {{ $t("tailscalePingWarning") }} + +
@@ -281,8 +288,8 @@ - -
+ +
- -
+ +