mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-02-26 13:35:56 +00:00
Compare commits
17 commits
9aacb7a577
...
a7d2d3cb07
Author | SHA1 | Date | |
---|---|---|---|
|
a7d2d3cb07 | ||
|
03beef8006 | ||
|
5026f45871 | ||
|
0b21ed1acd | ||
|
8b92dcf34a | ||
|
a8c30f5ab8 | ||
|
f171e101fd | ||
|
e93418d920 | ||
|
98d8598052 | ||
|
1b5ea7d44e | ||
|
3dbc32b225 | ||
|
f33d09918d | ||
|
1630c01fd9 | ||
|
4c701593d4 | ||
|
2781ff566b | ||
|
80e7400185 | ||
|
3ac752246d |
5 changed files with 76 additions and 14 deletions
|
@ -4,19 +4,20 @@ const { R } = require("redbean-node");
|
|||
class Group extends BeanModel {
|
||||
|
||||
/**
|
||||
* Return an object that ready to parse to JSON for public Only show
|
||||
* necessary data to public
|
||||
* Return an object that ready to parse to JSON for public
|
||||
* Only show necessary data to public
|
||||
* @param {boolean} showTags Should the JSON include monitor tags
|
||||
* @param {boolean} certExpiry Should JSON include info about
|
||||
* certificate expiry?
|
||||
* @param {boolean} showStatus Should the JSON include the status
|
||||
* @returns {Promise<object>} Object ready to parse
|
||||
*/
|
||||
async toPublicJSON(showTags = false, certExpiry = false) {
|
||||
async toPublicJSON(showTags = false, certExpiry = false, showStatus = false) {
|
||||
let monitorBeanList = await this.getMonitorList();
|
||||
let monitorList = [];
|
||||
|
||||
for (let bean of monitorBeanList) {
|
||||
monitorList.push(await bean.toPublicJSON(showTags, certExpiry));
|
||||
monitorList.push(await bean.toPublicJSON(showTags, certExpiry, showStatus));
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
@ -36,15 +36,31 @@ const rootCertificates = rootCertificatesFingerprints();
|
|||
*/
|
||||
class Monitor extends BeanModel {
|
||||
|
||||
/**
|
||||
* Formats the status code to a human readable form
|
||||
* @param {number} status the internal status code of the monitor
|
||||
* @returns {string} a human readable string that corresponds to the status code
|
||||
*/
|
||||
statusToKey(status) {
|
||||
switch (status) {
|
||||
case 0: return "down";
|
||||
case 1: return "up";
|
||||
case 2: return "pending";
|
||||
case 4: return "maintenance";
|
||||
default: return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an object that ready to parse to JSON for public Only show
|
||||
* necessary data to public
|
||||
* @param {boolean} showTags Include tags in JSON
|
||||
* @param {boolean} certExpiry Include certificate expiry info in
|
||||
* JSON
|
||||
* @param {boolean} showStatus Should the JSON show the status
|
||||
* @returns {Promise<object>} Object ready to parse
|
||||
*/
|
||||
async toPublicJSON(showTags = false, certExpiry = false) {
|
||||
async toPublicJSON(showTags = false, certExpiry = false, showStatus = false) {
|
||||
let obj = {
|
||||
id: this.id,
|
||||
name: this.name,
|
||||
|
@ -66,6 +82,11 @@ class Monitor extends BeanModel {
|
|||
obj.validCert = validCert;
|
||||
}
|
||||
|
||||
if (showStatus) {
|
||||
const heartbeat = await Monitor.getPreviousHeartbeat(this.id);
|
||||
obj.status = this.statusToKey(heartbeat.status);
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
|
|
@ -257,12 +257,12 @@ class StatusPage extends BeanModel {
|
|||
|
||||
/**
|
||||
* Get all status page data in one call
|
||||
* @param {StatusPage} statusPage Status page to get data for
|
||||
* @returns {object} Status page data
|
||||
* @param {StatusPage} statusPage the status page to return the data for
|
||||
* @param {boolean} includeStatus whether each monitor should include the status of the monitor ("up" or "down")
|
||||
* @param {boolean} includeConfig whether the config for the status page should be included in the returned JSON
|
||||
* @returns {object} the status page data object
|
||||
*/
|
||||
static async getStatusPageData(statusPage) {
|
||||
const config = await statusPage.toPublicJSON();
|
||||
|
||||
static async getStatusPageData(statusPage, includeStatus = false, includeConfig = true) {
|
||||
// Incident
|
||||
let incident = await R.findOne("incident", " pin = 1 AND active = 1 AND status_page_id = ? ", [
|
||||
statusPage.id,
|
||||
|
@ -283,13 +283,20 @@ class StatusPage extends BeanModel {
|
|||
]);
|
||||
|
||||
for (let groupBean of list) {
|
||||
let monitorGroup = await groupBean.toPublicJSON(showTags, config?.showCertificateExpiry);
|
||||
let monitorGroup = await groupBean.toPublicJSON(showTags, false, includeStatus);
|
||||
publicGroupList.push(monitorGroup);
|
||||
}
|
||||
|
||||
let config = {};
|
||||
if (includeConfig) {
|
||||
config = {
|
||||
config: await statusPage.toPublicJSON()
|
||||
};
|
||||
}
|
||||
|
||||
// Response
|
||||
return {
|
||||
config,
|
||||
...config,
|
||||
incident,
|
||||
publicGroupList,
|
||||
maintenanceList,
|
||||
|
|
|
@ -485,7 +485,7 @@ function ApiCache() {
|
|||
}
|
||||
|
||||
if (typeof duration === "string") {
|
||||
let split = duration.match(/^([\d\.,]+)\s?(\w+)$/);
|
||||
let split = duration.match(/^([\d\.,]+)\s?([a-zA-Z]+)$/);
|
||||
|
||||
if (split.length === 3) {
|
||||
let len = parseFloat(split[1]);
|
||||
|
|
|
@ -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, sendHttpError } = require("../util-server");
|
||||
const { allowAllOrigin, allowDevAllOrigin, sendHttpError } = require("../util-server");
|
||||
const { R } = require("redbean-node");
|
||||
const { badgeConstants } = require("../../src/util");
|
||||
const { makeBadge } = require("badge-maker");
|
||||
|
@ -35,6 +35,39 @@ router.get("/status-page", cache("5 minutes"), async (request, response) => {
|
|||
await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
|
||||
});
|
||||
|
||||
// Status page config, incident, monitor list with status ("up" or "down")
|
||||
router.get("/api/status-page/:slug/summary", cache("5 minutes"), async (request, response) => {
|
||||
allowAllOrigin(response);
|
||||
let slug = request.params.slug;
|
||||
|
||||
try {
|
||||
// Get Status Page
|
||||
let statusPage = await R.findOne("status_page", " slug = ? ", [
|
||||
slug
|
||||
]);
|
||||
|
||||
if (!statusPage) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let statusPageData = await StatusPage.getStatusPageData(statusPage, true, false);
|
||||
|
||||
if (!statusPageData) {
|
||||
response.statusCode = 404;
|
||||
response.json({
|
||||
msg: "Not Found"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Response
|
||||
response.json(statusPageData);
|
||||
|
||||
} catch (error) {
|
||||
sendHttpError(response, error.message);
|
||||
}
|
||||
});
|
||||
|
||||
// Status page config, incident, monitor list
|
||||
router.get("/api/status-page/:slug", cache("5 minutes"), async (request, response) => {
|
||||
allowDevAllOrigin(response);
|
||||
|
|
Loading…
Add table
Reference in a new issue