[]>}
*/
async getTags() {
- return await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [ this.id ]);
+ return await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ? ORDER BY tag.name", [ this.id ]);
}
/**
@@ -203,7 +203,7 @@ class Monitor extends BeanModel {
let previousBeat = null;
let retries = 0;
- let prometheus = new Prometheus(this);
+ this.prometheus = new Prometheus(this);
const beat = async () => {
@@ -755,7 +755,7 @@ class Monitor extends BeanModel {
await R.store(bean);
log.debug("monitor", `[${this.name}] prometheus.update`);
- prometheus.update(bean, tlsInfo);
+ this.prometheus.update(bean, tlsInfo);
previousBeat = bean;
@@ -840,15 +840,15 @@ class Monitor extends BeanModel {
clearTimeout(this.heartbeatInterval);
this.isStop = true;
- this.prometheus().remove();
+ this.prometheus.remove();
}
/**
- * Get a new prometheus instance
- * @returns {Prometheus}
+ * Get prometheus instance
+ * @returns {Prometheus|undefined}
*/
- prometheus() {
- return new Prometheus(this);
+ getPrometheus() {
+ return this.prometheus;
}
/**
diff --git a/server/model/status_page.js b/server/model/status_page.js
index d7185a2e0..84af99e88 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -60,8 +60,11 @@ class StatusPage extends BeanModel {
}
// OG Meta Tags
- head.append(``);
- head.append(``);
+ let ogTitle = $("").attr("content", statusPage.title);
+ head.append(ogTitle);
+
+ let ogDescription = $("").attr("content", description155);
+ head.append(ogDescription);
// Preload data
// Add jsesc, fix https://github.com/louislam/uptime-kuma/issues/2186
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 665163aee..2d5f96617 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -1,5 +1,5 @@
let express = require("express");
-const { allowDevAllOrigin, allowAllOrigin, percentageToColor, filterAndJoin, send403 } = require("../util-server");
+const { allowDevAllOrigin, allowAllOrigin, percentageToColor, filterAndJoin, sendHttpError } = require("../util-server");
const { R } = require("redbean-node");
const apicache = require("../modules/apicache");
const Monitor = require("../model/monitor");
@@ -175,7 +175,7 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
response.type("image/svg+xml");
response.send(svg);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -242,7 +242,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
response.type("image/svg+xml");
response.send(svg);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -303,7 +303,7 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
response.type("image/svg+xml");
response.send(svg);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -373,7 +373,7 @@ router.get("/api/badge/:id/avg-response/:duration?", cache("5 minutes"), async (
response.type("image/svg+xml");
response.send(svg);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -464,7 +464,7 @@ router.get("/api/badge/:id/cert-exp", cache("5 minutes"), async (request, respon
response.type("image/svg+xml");
response.send(svg);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -536,7 +536,7 @@ router.get("/api/badge/:id/response", cache("5 minutes"), async (request, respon
response.type("image/svg+xml");
response.send(svg);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
diff --git a/server/routers/status-page-router.js b/server/routers/status-page-router.js
index de075db8d..28cf5f4c9 100644
--- a/server/routers/status-page-router.js
+++ b/server/routers/status-page-router.js
@@ -2,7 +2,7 @@ let express = require("express");
const apicache = require("../modules/apicache");
const { UptimeKumaServer } = require("../uptime-kuma-server");
const StatusPage = require("../model/status_page");
-const { allowDevAllOrigin, send403 } = require("../util-server");
+const { allowDevAllOrigin, sendHttpError } = require("../util-server");
const { R } = require("redbean-node");
const Monitor = require("../model/monitor");
@@ -44,10 +44,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
let statusPageData = await StatusPage.getStatusPageData(statusPage);
if (!statusPageData) {
- response.statusCode = 404;
- response.json({
- msg: "Not Found"
- });
+ sendHttpError(response, "Not Found");
return;
}
@@ -55,7 +52,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
response.json(statusPageData);
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -103,7 +100,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
});
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
@@ -119,10 +116,7 @@ router.get("/api/status-page/:slug/manifest.json", cache("1440 minutes"), async
]);
if (!statusPage) {
- response.statusCode = 404;
- response.json({
- msg: "Not Found"
- });
+ sendHttpError(response, "Not Found");
return;
}
@@ -141,7 +135,7 @@ router.get("/api/status-page/:slug/manifest.json", cache("1440 minutes"), async
});
} catch (error) {
- send403(response, error.message);
+ sendHttpError(response, error.message);
}
});
diff --git a/server/server.js b/server/server.js
index 1073f3bef..18598171e 100644
--- a/server/server.js
+++ b/server/server.js
@@ -677,9 +677,6 @@ let needSetup = false;
throw new Error("Permission denied.");
}
- // Reset Prometheus labels
- server.monitorList[monitor.id]?.prometheus()?.remove();
-
bean.name = monitor.name;
bean.type = monitor.type;
bean.url = monitor.url;
diff --git a/server/util-server.js b/server/util-server.js
index a2f1aa466..129e15265 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -292,14 +292,23 @@ exports.postgresQuery = function (connectionString, query) {
client.end();
} else {
// Connected here
- client.query(query, (err, res) => {
- if (err) {
- reject(err);
- } else {
- resolve(res);
+ try {
+ // No query provided by user, use SELECT 1
+ if (!query || (typeof query === "string" && query.trim() === "")) {
+ query = "SELECT 1";
}
- client.end();
- });
+
+ client.query(query, (err, res) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(res);
+ }
+ client.end();
+ });
+ } catch (e) {
+ reject(e);
+ }
}
});
@@ -323,7 +332,7 @@ exports.mysqlQuery = function (connectionString, query) {
reject(err);
})
.finally(() => {
- connection.end();
+ connection.destroy();
});
});
};
@@ -730,15 +739,27 @@ exports.filterAndJoin = (parts, connector = "") => {
};
/**
- * Send a 403 response
+ * Send an Error response
* @param {Object} res Express response object
* @param {string} [msg=""] Message to send
*/
-module.exports.send403 = (res, msg = "") => {
- res.status(403).json({
- "status": "fail",
- "msg": msg,
- });
+module.exports.sendHttpError = (res, msg = "") => {
+ if (msg.includes("SQLITE_BUSY") || msg.includes("SQLITE_LOCKED")) {
+ res.status(503).json({
+ "status": "fail",
+ "msg": msg,
+ });
+ } else if (msg.toLowerCase().includes("not found")) {
+ res.status(404).json({
+ "status": "fail",
+ "msg": msg,
+ });
+ } else {
+ res.status(403).json({
+ "status": "fail",
+ "msg": msg,
+ });
+ }
};
function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 0ca95c222..c3851b568 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -13,7 +13,10 @@
@@ -67,7 +70,7 @@
-