mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-27 16:54:04 +00:00
Compare commits
6 commits
a6b1f5dddb
...
7078e32f12
Author | SHA1 | Date | |
---|---|---|---|
|
7078e32f12 | ||
|
94af1d98d7 | ||
|
16a41d53c1 | ||
|
a3376069d0 | ||
|
90b9173cfb | ||
|
50d6ea36a4 |
5 changed files with 71 additions and 5 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) {
|
||||
let notificationObject = bean.export();
|
||||
notificationObject.isDefault = (notificationObject.isDefault === 1);
|
||||
notificationObject.usePathAsName = (notificationObject.usePathAsName === 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -382,7 +382,8 @@ class Monitor extends BeanModel {
|
|||
|
||||
if (children.length > 0) {
|
||||
bean.status = UP;
|
||||
bean.msg = "All children up and running";
|
||||
bean.msg = "";
|
||||
let errorChildNames = [];
|
||||
for (const child of children) {
|
||||
if (!child.active) {
|
||||
// Ignore inactive childs
|
||||
|
@ -399,10 +400,22 @@ class Monitor extends BeanModel {
|
|||
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
|
||||
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";
|
||||
}
|
||||
|
||||
if (bean.status !== UP) {
|
||||
bean.msg = "Child inaccessible";
|
||||
bean.msg += "- " + childMonitor.name + ":\r\n" + lastBeat.msg.trim().replace(/^/gm, " ");
|
||||
errorChildNames.push(childMonitor.name);
|
||||
}
|
||||
}
|
||||
|
||||
if (bean.status === UP) {
|
||||
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 {
|
||||
// Set status pending if group is empty
|
||||
|
@ -1323,8 +1336,10 @@ class Monitor extends BeanModel {
|
|||
for (let notification of notificationList) {
|
||||
try {
|
||||
const heartbeatJSON = bean.toJSON();
|
||||
const monitorData = [{ id: monitor.id,
|
||||
active: monitor.active
|
||||
const monitorData = [{
|
||||
id: monitor.id,
|
||||
name: monitor.name,
|
||||
active: monitor.active,
|
||||
}];
|
||||
const preloadData = await Monitor.preparePreloadData(monitorData);
|
||||
// Prevent if the msg is undefined, notifications such as Discord cannot send out.
|
||||
|
@ -1601,6 +1616,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
|
||||
* @param {number} monitorID ID of monitor to get
|
||||
|
|
|
@ -178,6 +178,9 @@ class Notification {
|
|||
* @throws Error with fail msg
|
||||
*/
|
||||
static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
if (notification.usePathAsName && monitorJSON) {
|
||||
monitorJSON["name"] = monitorJSON["pathName"];
|
||||
}
|
||||
if (this.providerList[notification.type]) {
|
||||
return this.providerList[notification.type].send(notification, msg, monitorJSON, heartbeatJSON);
|
||||
} else {
|
||||
|
@ -213,6 +216,8 @@ class Notification {
|
|||
bean.user_id = userID;
|
||||
bean.config = JSON.stringify(notification);
|
||||
bean.is_default = notification.isDefault || false;
|
||||
bean.use_path_as_name = notification.usePathAsName;
|
||||
|
||||
await R.store(bean);
|
||||
|
||||
if (notification.applyExisting) {
|
||||
|
|
|
@ -41,6 +41,16 @@
|
|||
|
||||
<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">
|
||||
<input v-model="notification.applyExisting" class="form-check-input" type="checkbox">
|
||||
<label class="form-check-label">{{ $t("Apply on all existing monitors") }}</label>
|
||||
|
@ -95,6 +105,7 @@ export default {
|
|||
/** @type { null | keyof NotificationFormList } */
|
||||
type: null,
|
||||
isDefault: false,
|
||||
usePathAsName: false,
|
||||
// Do not set default value here, please scroll to show()
|
||||
}
|
||||
};
|
||||
|
@ -264,6 +275,7 @@ export default {
|
|||
name: "",
|
||||
type: "telegram",
|
||||
isDefault: false,
|
||||
usePathAsName: true,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue