diff --git a/db/knex_migrations/2025-06-11-0000-add-manual-monitor.js b/db/knex_migrations/2025-06-11-0000-add-manual-monitor.js new file mode 100644 index 000000000..16d307eb5 --- /dev/null +++ b/db/knex_migrations/2025-06-11-0000-add-manual-monitor.js @@ -0,0 +1,12 @@ +exports.up = function (knex) { + return knex.schema + .alterTable("monitor", function (table) { + table.string("manual_status").defaultTo(null); + }); +}; + +exports.down = function (knex) { + return knex.schema.alterTable("monitor", function (table) { + table.dropColumn("manual_status"); + }); +}; diff --git a/server/monitor-types/manual.js b/server/monitor-types/manual.js new file mode 100644 index 000000000..e587b7409 --- /dev/null +++ b/server/monitor-types/manual.js @@ -0,0 +1,36 @@ +const { MonitorType } = require("./monitor-type"); +const { UP, DOWN, PENDING } = require("../../src/util"); + +class ManualMonitorType extends MonitorType { + name = "Manual"; + type = "manual"; + description = "A monitor that allows manual control of the status"; + supportsConditions = false; + conditionVariables = []; + + /** + * @inheritdoc + */ + async check(monitor, heartbeat) { + if (monitor.manual_status !== null) { + heartbeat.status = monitor.manual_status; + switch (monitor.manual_status) { + case UP: + heartbeat.msg = "Up"; + break; + case DOWN: + heartbeat.msg = "Down"; + break; + default: + heartbeat.msg = "Pending"; + } + } else { + heartbeat.status = PENDING; + heartbeat.msg = "Manual monitoring - No status set"; + } + } +} + +module.exports = { + ManualMonitorType +}; diff --git a/server/server.js b/server/server.js index 77ba695d1..e328ff470 100644 --- a/server/server.js +++ b/server/server.js @@ -876,6 +876,7 @@ let needSetup = false; bean.rabbitmqUsername = monitor.rabbitmqUsername; bean.rabbitmqPassword = monitor.rabbitmqPassword; bean.conditions = JSON.stringify(monitor.conditions); + bean.manual_status = monitor.manual_status; // ping advanced options bean.ping_numeric = monitor.ping_numeric; diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index 1f75b72cc..a04e6bd49 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -118,6 +118,7 @@ class UptimeKumaServer { UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType(); UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType(); UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType(); + UptimeKumaServer.monitorTypeList["manual"] = new ManualMonitorType(); // Allow all CORS origins (polling) in development let cors = undefined; @@ -558,4 +559,5 @@ const { GroupMonitorType } = require("./monitor-types/group"); const { SNMPMonitorType } = require("./monitor-types/snmp"); const { MongodbMonitorType } = require("./monitor-types/mongodb"); const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq"); +const { ManualMonitorType } = require("./monitor-types/manual"); const Monitor = require("./model/monitor"); diff --git a/src/lang/en.json b/src/lang/en.json index e11e9e81e..a979edcc2 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1122,5 +1122,6 @@ "Add Another Tag": "Add Another Tag", "Staged Tags for Batch Add": "Staged Tags for Batch Add", "Clear Form": "Clear Form", - "pause": "Pause" + "pause": "Pause", + "Manual": "Manual" } diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 691414843..0d628895d 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -55,6 +55,9 @@ + @@ -115,6 +118,18 @@ + +
+
+ + +
+
+