mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-23 14:54:05 +00:00
Compare commits
7 commits
a6f4c99843
...
aaa3d7374c
Author | SHA1 | Date | |
---|---|---|---|
|
aaa3d7374c | ||
|
778363a948 | ||
|
94af1d98d7 | ||
|
16a41d53c1 | ||
|
a3376069d0 | ||
|
90b9173cfb | ||
|
50d6ea36a4 |
6 changed files with 72 additions and 6 deletions
|
@ -0,0 +1,12 @@
|
||||||
|
exports.up = function (knex) {
|
||||||
|
return knex.schema
|
||||||
|
.alterTable("notification", function (table) {
|
||||||
|
table.boolean("use_path_as_name").notNullable().defaultTo(true);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.down = function (knex) {
|
||||||
|
return knex.schema.alterTable("notification", function (table) {
|
||||||
|
table.dropColumn("use_path_as_name");
|
||||||
|
});
|
||||||
|
};
|
|
@ -26,7 +26,15 @@ async function sendNotificationList(socket) {
|
||||||
for (let bean of list) {
|
for (let bean of list) {
|
||||||
let notificationObject = bean.export();
|
let notificationObject = bean.export();
|
||||||
notificationObject.isDefault = (notificationObject.isDefault === 1);
|
notificationObject.isDefault = (notificationObject.isDefault === 1);
|
||||||
|
notificationObject.usePathAsName = (notificationObject.usePathAsName === 1);
|
||||||
notificationObject.active = (notificationObject.active === 1);
|
notificationObject.active = (notificationObject.active === 1);
|
||||||
|
|
||||||
|
const configObject = JSON.parse(notificationObject.config);
|
||||||
|
if ( !("usePathAsName" in configObject)) {
|
||||||
|
configObject.usePathAsName = notificationObject.usePathAsName;
|
||||||
|
notificationObject.config = JSON.stringify(configObject);
|
||||||
|
}
|
||||||
|
|
||||||
result.push(notificationObject);
|
result.push(notificationObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -385,7 +385,8 @@ class Monitor extends BeanModel {
|
||||||
|
|
||||||
if (children.length > 0) {
|
if (children.length > 0) {
|
||||||
bean.status = UP;
|
bean.status = UP;
|
||||||
bean.msg = "All children up and running";
|
bean.msg = "";
|
||||||
|
let errorChildNames = [];
|
||||||
for (const child of children) {
|
for (const child of children) {
|
||||||
if (!child.active) {
|
if (!child.active) {
|
||||||
// Ignore inactive childs
|
// Ignore inactive childs
|
||||||
|
@ -402,10 +403,22 @@ class Monitor extends BeanModel {
|
||||||
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
|
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
|
||||||
bean.status = lastBeat.status;
|
bean.status = lastBeat.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lastBeat && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
|
||||||
|
const childMonitor = await Monitor.getMonitor(lastBeat.monitor_id);
|
||||||
|
if (errorChildNames.length > 0) {
|
||||||
|
bean.msg += "\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
bean.msg += "- " + childMonitor.name + ":\r\n" + lastBeat.msg.trim().replace(/^/gm, " ");
|
||||||
|
errorChildNames.push(childMonitor.name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bean.status !== UP) {
|
if (bean.status === UP) {
|
||||||
bean.msg = "Child inaccessible";
|
bean.msg = "All children up and running";
|
||||||
|
} else if (bean.status === PENDING || bean.status === DOWN) {
|
||||||
|
bean.msg = "Some Children are having problems (" + errorChildNames.join(", ") + ")\r\n" + bean.msg;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Set status pending if group is empty
|
// Set status pending if group is empty
|
||||||
|
@ -1326,8 +1339,10 @@ class Monitor extends BeanModel {
|
||||||
for (let notification of notificationList) {
|
for (let notification of notificationList) {
|
||||||
try {
|
try {
|
||||||
const heartbeatJSON = bean.toJSON();
|
const heartbeatJSON = bean.toJSON();
|
||||||
const monitorData = [{ id: monitor.id,
|
const monitorData = [{
|
||||||
active: monitor.active
|
id: monitor.id,
|
||||||
|
name: monitor.name,
|
||||||
|
active: monitor.active,
|
||||||
}];
|
}];
|
||||||
const preloadData = await Monitor.preparePreloadData(monitorData);
|
const preloadData = await Monitor.preparePreloadData(monitorData);
|
||||||
// Prevent if the msg is undefined, notifications such as Discord cannot send out.
|
// Prevent if the msg is undefined, notifications such as Discord cannot send out.
|
||||||
|
@ -1606,6 +1621,20 @@ class Monitor extends BeanModel {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets Monitor with specific ID
|
||||||
|
* @param {number} monitorID ID of monitor to get
|
||||||
|
* @returns {Promise<LooseObject<any>>} Children
|
||||||
|
*/
|
||||||
|
static async getMonitor(monitorID) {
|
||||||
|
return await R.getRow(`
|
||||||
|
SELECT * FROM monitor
|
||||||
|
WHERE id = ?
|
||||||
|
`, [
|
||||||
|
monitorID,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets Parent of the monitor
|
* Gets Parent of the monitor
|
||||||
* @param {number} monitorID ID of monitor to get
|
* @param {number} monitorID ID of monitor to get
|
||||||
|
|
|
@ -178,6 +178,9 @@ class Notification {
|
||||||
* @throws Error with fail msg
|
* @throws Error with fail msg
|
||||||
*/
|
*/
|
||||||
static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||||
|
if (notification.usePathAsName && monitorJSON) {
|
||||||
|
monitorJSON["name"] = monitorJSON["pathName"];
|
||||||
|
}
|
||||||
if (this.providerList[notification.type]) {
|
if (this.providerList[notification.type]) {
|
||||||
return this.providerList[notification.type].send(notification, msg, monitorJSON, heartbeatJSON);
|
return this.providerList[notification.type].send(notification, msg, monitorJSON, heartbeatJSON);
|
||||||
} else {
|
} else {
|
||||||
|
@ -213,6 +216,8 @@ class Notification {
|
||||||
bean.user_id = userID;
|
bean.user_id = userID;
|
||||||
bean.config = JSON.stringify(notification);
|
bean.config = JSON.stringify(notification);
|
||||||
bean.is_default = notification.isDefault || false;
|
bean.is_default = notification.isDefault || false;
|
||||||
|
bean.use_path_as_name = notification.usePathAsName;
|
||||||
|
|
||||||
await R.store(bean);
|
await R.store(bean);
|
||||||
|
|
||||||
if (notification.applyExisting) {
|
if (notification.applyExisting) {
|
||||||
|
|
|
@ -41,6 +41,16 @@
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input v-model="notification.usePathAsName" class="form-check-input" type="checkbox">
|
||||||
|
<label class="form-check-label">Use Monitor Path as Name</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-text">
|
||||||
|
If your monitor is inside a group, the name will show the full path of the monitor. For example "Group A / Monitor 1".
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input v-model="notification.applyExisting" class="form-check-input" type="checkbox">
|
<input v-model="notification.applyExisting" class="form-check-input" type="checkbox">
|
||||||
<label class="form-check-label">{{ $t("Apply on all existing monitors") }}</label>
|
<label class="form-check-label">{{ $t("Apply on all existing monitors") }}</label>
|
||||||
|
@ -95,6 +105,7 @@ export default {
|
||||||
/** @type { null | keyof NotificationFormList } */
|
/** @type { null | keyof NotificationFormList } */
|
||||||
type: null,
|
type: null,
|
||||||
isDefault: false,
|
isDefault: false,
|
||||||
|
usePathAsName: false,
|
||||||
// Do not set default value here, please scroll to show()
|
// Do not set default value here, please scroll to show()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -264,6 +275,7 @@ export default {
|
||||||
name: "",
|
name: "",
|
||||||
type: "telegram",
|
type: "telegram",
|
||||||
isDefault: false,
|
isDefault: false,
|
||||||
|
usePathAsName: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1065,7 +1065,7 @@ import { hostNameRegexPattern } from "../util-frontend";
|
||||||
import HiddenInput from "../components/HiddenInput.vue";
|
import HiddenInput from "../components/HiddenInput.vue";
|
||||||
import EditMonitorConditions from "../components/EditMonitorConditions.vue";
|
import EditMonitorConditions from "../components/EditMonitorConditions.vue";
|
||||||
|
|
||||||
const toast = useToast;
|
const toast = useToast();
|
||||||
|
|
||||||
const pushTokenLength = 32;
|
const pushTokenLength = 32;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue