From b0259b559249c979698b9f59891399920bf81070 Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Thu, 13 Jan 2022 16:17:07 +0000
Subject: [PATCH 001/197] Added docker container monitor
---
db/patch-add-docker-columns.sql | 10 ++++++++++
server/database.js | 1 +
server/model/monitor.js | 23 +++++++++++++++++++++++
src/pages/EditMonitor.vue | 19 +++++++++++++++++++
4 files changed, 53 insertions(+)
create mode 100644 db/patch-add-docker-columns.sql
diff --git a/db/patch-add-docker-columns.sql b/db/patch-add-docker-columns.sql
new file mode 100644
index 000000000..fdde41705
--- /dev/null
+++ b/db/patch-add-docker-columns.sql
@@ -0,0 +1,10 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+ ADD docker_daemon VARCHAR(255);
+
+ALTER TABLE monitor
+ ADD docker_container VARCHAR(255);
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index afcace705..536acd198 100644
--- a/server/database.js
+++ b/server/database.js
@@ -53,6 +53,7 @@ class Database {
"patch-2fa-invalidate-used-token.sql": true,
"patch-notification_sent_history.sql": true,
"patch-monitor-basic-auth.sql": true,
+ "patch-add-docker-columns.sql": true
}
/**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index c4441d63e..5683352f5 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -77,6 +77,8 @@ class Monitor extends BeanModel {
dns_resolve_server: this.dns_resolve_server,
dns_last_result: this.dns_last_result,
pushToken: this.pushToken,
+ docker_container: this.docker_container,
+ docker_daemon: this.docker_daemon,
notificationIDList,
tags: tags,
};
@@ -347,6 +349,27 @@ class Monitor extends BeanModel {
throw new Error("Server not found on Steam");
}
+ } else if (this.type === "docker") {
+ debug(`[${this.name}] Prepare Options for axios`);
+
+ const options = {
+ url: `/containers/${this.docker_container}/json`,
+ headers: {
+ "Accept": "*/*",
+ "User-Agent": "Uptime-Kuma/" + version,
+ },
+ socketPath: this.docker_daemon,
+ httpsAgent: new https.Agent({
+ maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
+ rejectUnauthorized: ! this.getIgnoreTls(),
+ }),
+ };
+
+ debug(`[${this.name}] Axios Request`);
+ let res = await axios.request(options);
+ if (res.data.State.Running) {
+ bean.status = UP;
+ }
} else {
bean.msg = "Unknown Monitor Type";
bean.status = PENDING;
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4b6a920c8..8b02a75f9 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -32,6 +32,9 @@
+
@@ -115,6 +118,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -439,6 +456,8 @@ export default {
accepted_statuscodes: ["200-299"],
dns_resolve_type: "A",
dns_resolve_server: "1.1.1.1",
+ docker_container: "",
+ docker_daemon: "/var/run/docker.sock"
};
for (let i = 0; i < this.$root.notificationList.length; i++) {
From c5cc42272f0a72dbbf7c971173ad54fe6a524bf5 Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Thu, 13 Jan 2022 18:28:45 +0000
Subject: [PATCH 002/197] Fixing the editing of docker container & adding
english translation
---
server/model/monitor.js | 1 +
server/server.js | 2 ++
src/languages/en.js | 4 +++-
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 5683352f5..5e32a89d5 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -369,6 +369,7 @@ class Monitor extends BeanModel {
let res = await axios.request(options);
if (res.data.State.Running) {
bean.status = UP;
+ bean.msg = "";
}
} else {
bean.msg = "Unknown Monitor Type";
diff --git a/server/server.js b/server/server.js
index 868bbd5ef..7495cfb8a 100644
--- a/server/server.js
+++ b/server/server.js
@@ -588,6 +588,8 @@ exports.entryPage = "dashboard";
bean.dns_resolve_type = monitor.dns_resolve_type;
bean.dns_resolve_server = monitor.dns_resolve_server;
bean.pushToken = monitor.pushToken;
+ bean.docker_container = monitor.docker_container;
+ bean.docker_daemon = monitor.docker_daemon;
await R.store(bean);
diff --git a/src/languages/en.js b/src/languages/en.js
index 47513466c..1d56e1391 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -351,7 +351,7 @@ export default {
serwersmsAPIPassword: "API Password",
serwersmsPhoneNumber: "Phone number",
serwersmsSenderName: "SMS Sender Name (registered via customer portal)",
- "stackfield": "Stackfield",
+ stackfield: "Stackfield",
smtpDkimSettings: "DKIM Settings",
smtpDkimDesc: "Please refer to the Nodemailer DKIM {0} for usage.",
documentation: "documentation",
@@ -361,4 +361,6 @@ export default {
smtpDkimHashAlgo: "Hash Algorithm (Optional)",
smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
smtpDkimskipFields: "Header Keys not to sign (Optional)",
+ "Container Name / ID": "Container Name / ID",
+ "Docker Daemon": "Docker Daemon",
};
From 9619d31a05752d878de80d84679d0fec7fa2e117 Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Thu, 13 Jan 2022 18:33:01 +0000
Subject: [PATCH 003/197] Adding docker container ability to readme
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 7f88db5f4..f2434b2d1 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollec
## ⭐ Features
-* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server.
+* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server / Docker Containers.
* Fancy, Reactive, Fast UI/UX.
* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [70+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications).
* 20 second intervals.
From 4818bb67d60075b67435922bc3d00236e0bc23ac Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Fri, 14 Jan 2022 09:09:37 +0000
Subject: [PATCH 004/197] Added trailing comma, fixed spelling & translation
---
server/database.js | 2 +-
server/model/monitor.js | 2 +-
src/languages/en.js | 1 +
src/pages/EditMonitor.vue | 4 ++--
4 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/server/database.js b/server/database.js
index 536acd198..69551bacf 100644
--- a/server/database.js
+++ b/server/database.js
@@ -53,7 +53,7 @@ class Database {
"patch-2fa-invalidate-used-token.sql": true,
"patch-notification_sent_history.sql": true,
"patch-monitor-basic-auth.sql": true,
- "patch-add-docker-columns.sql": true
+ "patch-add-docker-columns.sql": true,
}
/**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 5e32a89d5..b75500ec2 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -350,7 +350,7 @@ class Monitor extends BeanModel {
}
} else if (this.type === "docker") {
- debug(`[${this.name}] Prepare Options for axios`);
+ debug(`[${this.name}] Prepare Options for Axios`);
const options = {
url: `/containers/${this.docker_container}/json`,
diff --git a/src/languages/en.js b/src/languages/en.js
index 1d56e1391..ae9fa5262 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -363,4 +363,5 @@ export default {
smtpDkimskipFields: "Header Keys not to sign (Optional)",
"Container Name / ID": "Container Name / ID",
"Docker Daemon": "Docker Daemon",
+ "Docker Container": "Docker Container",
};
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 8b02a75f9..86c35ef04 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -33,7 +33,7 @@
Steam Game Server
@@ -457,7 +457,7 @@ export default {
dns_resolve_type: "A",
dns_resolve_server: "1.1.1.1",
docker_container: "",
- docker_daemon: "/var/run/docker.sock"
+ docker_daemon: "/var/run/docker.sock",
};
for (let i = 0; i < this.$root.notificationList.length; i++) {
From 29df70949d453dc4675eda05d7f107669e1fb3e1 Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Sat, 22 Jan 2022 01:57:37 +0000
Subject: [PATCH 005/197] Add ability to connect to daemon via http / tcp for
windows compatibility
---
db/patch-add-docker-columns.sql | 3 +++
server/model/monitor.js | 8 +++++++-
server/server.js | 1 +
src/languages/en.js | 3 +++
src/pages/EditMonitor.vue | 15 +++++++++++++++
5 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/db/patch-add-docker-columns.sql b/db/patch-add-docker-columns.sql
index fdde41705..564756678 100644
--- a/db/patch-add-docker-columns.sql
+++ b/db/patch-add-docker-columns.sql
@@ -7,4 +7,7 @@ ALTER TABLE monitor
ALTER TABLE monitor
ADD docker_container VARCHAR(255);
+ALTER TABLE monitor
+ ADD docker_type VARCHAR(255);
+
COMMIT;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index b75500ec2..d8a4be238 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -79,6 +79,7 @@ class Monitor extends BeanModel {
pushToken: this.pushToken,
docker_container: this.docker_container,
docker_daemon: this.docker_daemon,
+ docker_type: this.docker_type,
notificationIDList,
tags: tags,
};
@@ -358,13 +359,18 @@ class Monitor extends BeanModel {
"Accept": "*/*",
"User-Agent": "Uptime-Kuma/" + version,
},
- socketPath: this.docker_daemon,
httpsAgent: new https.Agent({
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
rejectUnauthorized: ! this.getIgnoreTls(),
}),
};
+ if (this.docker_type === "socket") {
+ options.socketPath = this.docker_daemon;
+ } else if (this.docker_type === "tcp") {
+ options.baseURL = this.docker_daemon;
+ }
+
debug(`[${this.name}] Axios Request`);
let res = await axios.request(options);
if (res.data.State.Running) {
diff --git a/server/server.js b/server/server.js
index 7495cfb8a..ac68769da 100644
--- a/server/server.js
+++ b/server/server.js
@@ -590,6 +590,7 @@ exports.entryPage = "dashboard";
bean.pushToken = monitor.pushToken;
bean.docker_container = monitor.docker_container;
bean.docker_daemon = monitor.docker_daemon;
+ bean.docker_type = monitor.docker_type;
await R.store(bean);
diff --git a/src/languages/en.js b/src/languages/en.js
index ae9fa5262..ade50373d 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -364,4 +364,7 @@ export default {
"Container Name / ID": "Container Name / ID",
"Docker Daemon": "Docker Daemon",
"Docker Container": "Docker Container",
+ "Docker Type": "Connection Type",
+ docker_socket: "Socket",
+ docker_tcp: "TCP / HTTP",
};
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 86c35ef04..b80b9a269 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -125,6 +125,20 @@
+
+
+
+
+
+
+
@@ -458,6 +472,7 @@ export default {
dns_resolve_server: "1.1.1.1",
docker_container: "",
docker_daemon: "/var/run/docker.sock",
+ docker_type: "socket",
};
for (let i = 0; i < this.$root.notificationList.length; i++) {
From 1ac904d6d6260a34d08a29249fb7cc15236ee787 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Sun, 23 Jan 2022 15:22:57 +0100
Subject: [PATCH 006/197] Introduce resend interval if down
---
package-lock.json | 4 ++--
package.json | 8 ++++----
server/model/monitor.js | 17 +++++++++++++++++
server/server.js | 7 +++++++
src/pages/EditMonitor.vue | 8 ++++++++
5 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index fc21a63f9..5253c3af4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "uptime-kuma",
- "version": "1.11.3",
+ "version": "1.11.4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "uptime-kuma",
- "version": "1.11.3",
+ "version": "1.11.4",
"license": "MIT",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "~1.2.36",
diff --git a/package.json b/package.json
index 048a5e0a9..cd522a31b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "uptime-kuma",
- "version": "1.11.3",
+ "version": "1.11.4",
"license": "MIT",
"repository": {
"type": "git",
@@ -30,13 +30,13 @@
"build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
"build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
"build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
- "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.11.3-alpine --target release . --push",
- "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.11.3 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.11.3-debian --target release . --push",
+ "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.11.4-alpine --target release . --push",
+ "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.11.4 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.11.4-debian --target release . --push",
"build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
"build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
"build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
- "setup": "git checkout 1.11.3 && npm ci --production && npm run download-dist",
+ "setup": "git checkout 1.11.4 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js",
"update-version": "node extra/update-version.js",
"mark-as-nightly": "node extra/mark-as-nightly.js",
diff --git a/server/model/monitor.js b/server/model/monitor.js
index c4441d63e..eaba61ad3 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -68,6 +68,7 @@ class Monitor extends BeanModel {
type: this.type,
interval: this.interval,
retryInterval: this.retryInterval,
+ resendInterval: this.resendInterval,
keyword: this.keyword,
ignoreTls: this.getIgnoreTls(),
upsideDown: this.isUpsideDown(),
@@ -135,6 +136,7 @@ class Monitor extends BeanModel {
bean.monitor_id = this.id;
bean.time = R.isoDateTime(dayjs.utc());
bean.status = DOWN;
+ bean.lastNotifiedTime = previousBeat?.lastNotifiedTime || null; // after first update lastNotifiedTime will be undefined
if (this.isUpsideDown()) {
bean.status = flipStatus(bean.status);
@@ -390,12 +392,27 @@ class Monitor extends BeanModel {
debug(`[${this.name}] sendNotification`);
await Monitor.sendNotification(isFirstBeat, this, bean);
+ // Set last notified time to now
+ bean.lastNotifiedTime = dayjs().valueOf();
+
// Clear Status Page Cache
debug(`[${this.name}] apicache clear`);
apicache.clear();
} else {
bean.important = false;
+
+ if (bean.status === DOWN && this.resendInterval > 0) {
+ timeSinceLastNotified = dayjs().valueOf() - (bean.lastNotifiedTime || 0);
+ if (timeSinceLastNotified >= this.resendInterval) {
+ // Send notification again, because we are still DOWN
+ debug(`[${this.name}] sendNotification`);
+ await Monitor.sendNotification(isFirstBeat, this, bean);
+
+ // Set last notified time to now
+ bean.lastNotifiedTime = dayjs().valueOf();
+ }
+ }
}
if (bean.status === UP) {
diff --git a/server/server.js b/server/server.js
index 153cac4fd..5a9cf944a 100644
--- a/server/server.js
+++ b/server/server.js
@@ -588,6 +588,7 @@ exports.entryPage = "dashboard";
bean.basic_auth_pass = monitor.basic_auth_pass;
bean.interval = monitor.interval;
bean.retryInterval = monitor.retryInterval;
+ bean.resendInterval = monitor.resendInterval;
bean.hostname = monitor.hostname;
bean.maxretries = monitor.maxretries;
bean.port = monitor.port;
@@ -1082,6 +1083,7 @@ exports.entryPage = "dashboard";
let monitorListData = backupData.monitorList;
let version17x = compareVersions.compare(backupData.version, "1.7.0", ">=");
+ let version1114 = compareVersions.compare(backupData.version, "1.11.4", ">=");
// If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user"
if (importHandle == "overwrite") {
@@ -1131,6 +1133,7 @@ exports.entryPage = "dashboard";
// Define default values
let retryInterval = 0;
+ let resendInterval = 0;
/*
Only replace the default value with the backup file data for the specific version, where it appears the first time
@@ -1139,6 +1142,9 @@ exports.entryPage = "dashboard";
if (version17x) {
retryInterval = monitorListData[i].retryInterval;
}
+ if (version1114) {
+ resendInterval = monitorListData[i].resendInterval;
+ }
// --- End ---
@@ -1154,6 +1160,7 @@ exports.entryPage = "dashboard";
basic_auth_pass: monitorListData[i].basic_auth_pass,
interval: monitorListData[i].interval,
retryInterval: retryInterval,
+ resendInterval: resendInterval,
hostname: monitorListData[i].hostname,
maxretries: monitorListData[i].maxretries,
port: monitorListData[i].port,
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4b6a920c8..b95c10980 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -137,6 +137,14 @@
+
+
+
+
+
{{ $t("Advanced") }}
{{ $t("Advanced") }}
From f390a8caf1fea00348a3245b4c79d4315c125f3a Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Mon, 24 Jan 2022 21:59:25 +0100
Subject: [PATCH 013/197] Fix missing DB patch and use DATETIME as column
format
---
db/patch-heartbeat-add-last-notified-time.sql | 7 +++++++
server/database.js | 1 +
server/model/monitor.js | 10 +++++-----
3 files changed, 13 insertions(+), 5 deletions(-)
create mode 100644 db/patch-heartbeat-add-last-notified-time.sql
diff --git a/db/patch-heartbeat-add-last-notified-time.sql b/db/patch-heartbeat-add-last-notified-time.sql
new file mode 100644
index 000000000..af9c21c00
--- /dev/null
+++ b/db/patch-heartbeat-add-last-notified-time.sql
@@ -0,0 +1,7 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE heartbeat
+ ADD last_notified_time DATETIME default null;
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index ce4d50891..0aae8ffc9 100644
--- a/server/database.js
+++ b/server/database.js
@@ -54,6 +54,7 @@ class Database {
"patch-notification_sent_history.sql": true,
"patch-monitor-basic-auth.sql": true,
"patch-monitor-add-resend-interval.sql": true,
+ "patch-heartbeat-add-last-notified-time.sql": true,
}
/**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f48033557..85a0e9445 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -136,7 +136,7 @@ class Monitor extends BeanModel {
bean.monitor_id = this.id;
bean.time = R.isoDateTime(dayjs.utc());
bean.status = DOWN;
- bean.lastNotifiedTime = previousBeat?.lastNotifiedTime || null; // after first update lastNotifiedTime will be undefined
+ bean.lastNotifiedTime = previousBeat?.lastNotifiedTime;
if (this.isUpsideDown()) {
bean.status = flipStatus(bean.status);
@@ -393,7 +393,7 @@ class Monitor extends BeanModel {
await Monitor.sendNotification(isFirstBeat, this, bean);
// Set last notified time to now
- bean.lastNotifiedTime = dayjs().valueOf();
+ bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
// Clear Status Page Cache
debug(`[${this.name}] apicache clear`);
@@ -403,14 +403,14 @@ class Monitor extends BeanModel {
bean.important = false;
if (bean.status === DOWN && this.resendInterval > 0) {
- timeSinceLastNotified = (dayjs().valueOf() - (bean.lastNotifiedTime || 0)) / 60; // divide by 60 to convert from seconds to minutes
+ let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
if (timeSinceLastNotified >= this.resendInterval) {
// Send notification again, because we are still DOWN
- debug(`[${this.name}] sendNotification`);
+ debug(`[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
await Monitor.sendNotification(isFirstBeat, this, bean);
// Set last notified time to now
- bean.lastNotifiedTime = dayjs().valueOf();
+ bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
}
}
}
From 855b12f435ca87059c2797b8695418947fc9b73e Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Mon, 24 Jan 2022 22:20:38 +0100
Subject: [PATCH 014/197] Add text for resend disabled
---
src/languages/en.js | 1 +
src/pages/EditMonitor.vue | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/languages/en.js b/src/languages/en.js
index 33ad0a422..17a58543f 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -3,6 +3,7 @@ export default {
checkEverySecond: "Check every {0} seconds",
retryCheckEverySecond: "Retry every {0} seconds",
resendEveryMinute: "Resend every {0} minutes",
+ resendDisabled: "Resend disabled",
retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index a297c54b6..a7bc4f787 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -140,7 +140,8 @@
From d446a57d42613490c6bd5a6bec075b289ff3caef Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Mon, 24 Jan 2022 22:20:48 +0100
Subject: [PATCH 015/197] Add german translation
---
src/languages/de-DE.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 48cdd2e3b..9286a09bc 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -164,6 +164,8 @@ export default {
"Search...": "Suchen...",
"Heartbeat Retry Interval": "Heartbeat-Wiederholungsintervall",
retryCheckEverySecond: "Versuche alle {0} Sekunden",
+ resendEveryMinute: "Erneut versenden alle {0} Minuten",
+ resendDisabled: "Erneut versenden deaktiviert",
"Import Backup": "Backup importieren",
"Export Backup": "Backup exportieren",
"Avg. Ping": "Durchschn. Ping",
From d8013f31e8906aeb0188725353392581621cd121 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Sun, 27 Mar 2022 21:24:41 +0200
Subject: [PATCH 016/197] Update version after merging new master branch
---
server/server.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server/server.js b/server/server.js
index e10df8cc6..36b8590f8 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1087,7 +1087,7 @@ exports.entryPage = "dashboard";
let monitorListData = backupData.monitorList;
let version17x = compareVersions.compare(backupData.version, "1.7.0", ">=");
- let version1114 = compareVersions.compare(backupData.version, "1.11.4", ">=");
+ let version1132 = compareVersions.compare(backupData.version, "1.13.2", ">=");
// If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user"
if (importHandle == "overwrite") {
@@ -1147,7 +1147,7 @@ exports.entryPage = "dashboard";
retryInterval = monitorListData[i].retryInterval;
}
- if (version1114) {
+ if (version1132) {
resendInterval = monitorListData[i].resendInterval;
}
From 84a0b24448fc06f791bf4555fb2db8cd384c815b Mon Sep 17 00:00:00 2001
From: Moritz R
Date: Sun, 3 Apr 2022 17:15:21 +0200
Subject: [PATCH 017/197] Update server/model/monitor.js
As per recommendation of @Computroniks
Co-authored-by: Matthew Nickson
---
server/model/monitor.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index d8a4be238..c9b697d0c 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -377,6 +377,7 @@ class Monitor extends BeanModel {
bean.status = UP;
bean.msg = "";
}
+
} else {
bean.msg = "Unknown Monitor Type";
bean.status = PENDING;
From 60f8ab7285fc0b3c1dfca5c8857807ba270e9956 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 21 Apr 2022 12:09:59 +0200
Subject: [PATCH 018/197] Use new logging mechanism
---
server/model/monitor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index a7e0b82f4..0ac2e33e5 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -473,7 +473,7 @@ class Monitor extends BeanModel {
let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
if (timeSinceLastNotified >= this.resendInterval) {
// Send notification again, because we are still DOWN
- debug(`[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
+ log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
await Monitor.sendNotification(isFirstBeat, this, bean);
// Set last notified time to now
From 19933bbd99d7e11dba97e61183051dc876b9581e Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 21 Apr 2022 12:18:15 +0200
Subject: [PATCH 019/197] Improve backwards compatibility
---
server/server.js | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/server/server.js b/server/server.js
index d53fe6964..58c08f9d4 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1168,7 +1168,6 @@ try {
let monitorListData = backupData.monitorList;
let version17x = compareVersions.compare(backupData.version, "1.7.0", ">=");
- let version1132 = compareVersions.compare(backupData.version, "1.13.2", ">=");
// If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user"
if (importHandle == "overwrite") {
@@ -1237,7 +1236,6 @@ try {
// Define default values
let retryInterval = 0;
- let resendInterval = 0;
/*
Only replace the default value with the backup file data for the specific version, where it appears the first time
@@ -1247,10 +1245,6 @@ try {
retryInterval = monitorListData[i].retryInterval;
}
- if (version1132) {
- resendInterval = monitorListData[i].resendInterval;
- }
-
// --- End ---
let monitor = {
@@ -1265,7 +1259,7 @@ try {
basic_auth_pass: monitorListData[i].basic_auth_pass,
interval: monitorListData[i].interval,
retryInterval: retryInterval,
- resendInterval: resendInterval,
+ resendInterval: monitorListData[i].resendInterval || 0,
hostname: monitorListData[i].hostname,
maxretries: monitorListData[i].maxretries,
port: monitorListData[i].port,
From d6b591a513cb928c9173dab0b9042922a4b3df49 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 21 Apr 2022 17:45:58 +0200
Subject: [PATCH 020/197] Make comment more readable
Co-authored-by: Matthew Nickson
---
server/model/monitor.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 0ac2e33e5..1383153e9 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -470,7 +470,8 @@ class Monitor extends BeanModel {
bean.important = false;
if (bean.status === DOWN && this.resendInterval > 0) {
- let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
+ // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
+ let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
if (timeSinceLastNotified >= this.resendInterval) {
// Send notification again, because we are still DOWN
log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
From 052fde5a24daa70855082c4ed9ba362c3785e463 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 21 Apr 2022 17:56:38 +0200
Subject: [PATCH 021/197] Fix casing of text label
Co-authored-by: Matthew Nickson
---
src/pages/EditMonitor.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4338b4ea2..661a89c48 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -172,7 +172,7 @@
From c7ec9a07e248a730095e725c870f8396dfaa2296 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 21 Apr 2022 17:59:38 +0200
Subject: [PATCH 022/197] Add translation for text label
---
src/languages/de-DE.js | 1 +
src/languages/en.js | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index ae28bf5bc..5af4c8a12 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -163,6 +163,7 @@ export default {
Pink: "Pink",
"Search...": "Suchen...",
"Heartbeat Retry Interval": "Überprüfungsintervall",
+ "Notification resend interval if down": "Benachrichtigung erneut versenden wenn Inaktiv",
retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
resendEveryMinute: "Erneut versenden alle {0} Minuten",
resendDisabled: "Erneut versenden deaktiviert",
diff --git a/src/languages/en.js b/src/languages/en.js
index 7726d12f0..a3a375f3d 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -74,6 +74,7 @@ export default {
"Heartbeat Interval": "Heartbeat Interval",
Retries: "Retries",
"Heartbeat Retry Interval": "Heartbeat Retry Interval",
+ "Notification resend interval if down": "Notification resend interval if down",
Advanced: "Advanced",
"Upside Down Mode": "Upside Down Mode",
"Max. Redirects": "Max. Redirects",
From 7ed8ae9f7cc35e24c29bab087c5324d764bf67dc Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 21 Apr 2022 18:23:32 +0200
Subject: [PATCH 023/197] Fix trailing space warning
---
server/model/monitor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 1383153e9..84b211b8c 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -471,7 +471,7 @@ class Monitor extends BeanModel {
if (bean.status === DOWN && this.resendInterval > 0) {
// divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
- let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
+ let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
if (timeSinceLastNotified >= this.resendInterval) {
// Send notification again, because we are still DOWN
log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
From 98ee9caf2cdc54a2f5edb864906d620e84196317 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 5 May 2022 15:55:33 +0200
Subject: [PATCH 024/197] Add variable for currentTime
Co-authored-by: Adam Stachowicz
---
server/model/monitor.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 15181af67..f29f6de5e 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -492,11 +492,12 @@ class Monitor extends BeanModel {
let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
if (timeSinceLastNotified >= this.resendInterval) {
// Send notification again, because we are still DOWN
- log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
+ const currentTime = R.isoDateTime(dayjs.utc());
+ log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${currentTime}`);
await Monitor.sendNotification(isFirstBeat, this, bean);
// Set last notified time to now
- bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
+ bean.lastNotifiedTime = currentTime;
}
}
}
From 93050208bbe9eb1c5678bf609c18e47953fb8485 Mon Sep 17 00:00:00 2001
From: OidaTiftla
Date: Thu, 5 May 2022 16:01:10 +0200
Subject: [PATCH 025/197] Merge database changes into single patch file
---
db/patch-heartbeat-add-last-notified-time.sql | 7 -------
db/patch-monitor-add-resend-interval.sql | 3 +++
server/database.js | 1 -
3 files changed, 3 insertions(+), 8 deletions(-)
delete mode 100644 db/patch-heartbeat-add-last-notified-time.sql
diff --git a/db/patch-heartbeat-add-last-notified-time.sql b/db/patch-heartbeat-add-last-notified-time.sql
deleted file mode 100644
index af9c21c00..000000000
--- a/db/patch-heartbeat-add-last-notified-time.sql
+++ /dev/null
@@ -1,7 +0,0 @@
--- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
-BEGIN TRANSACTION;
-
-ALTER TABLE heartbeat
- ADD last_notified_time DATETIME default null;
-
-COMMIT;
diff --git a/db/patch-monitor-add-resend-interval.sql b/db/patch-monitor-add-resend-interval.sql
index e8bb08b8a..c31dd7a20 100644
--- a/db/patch-monitor-add-resend-interval.sql
+++ b/db/patch-monitor-add-resend-interval.sql
@@ -4,4 +4,7 @@ BEGIN TRANSACTION;
ALTER TABLE monitor
ADD resend_interval INTEGER default 0 not null;
+ALTER TABLE heartbeat
+ ADD last_notified_time DATETIME default null;
+
COMMIT;
diff --git a/server/database.js b/server/database.js
index 8e3b188b9..5dbfd676d 100644
--- a/server/database.js
+++ b/server/database.js
@@ -59,7 +59,6 @@ class Database {
"patch-status-page-footer-css.sql": true,
"patch-added-mqtt-monitor.sql": true,
"patch-monitor-add-resend-interval.sql": true,
- "patch-heartbeat-add-last-notified-time.sql": true,
};
/**
From 398ecb76667710731bc065f35b78706125fc8077 Mon Sep 17 00:00:00 2001
From: Sascha Kruse
Date: Thu, 12 May 2022 11:48:38 +0200
Subject: [PATCH 026/197] add radius check
---
db/patch-add-radius-monitor.sql | 18 ++++++++++++++++
package.json | 1 +
server/database.js | 1 +
server/model/monitor.js | 33 +++++++++++++++++++++++++++--
server/server.js | 5 +++++
server/util-server.js | 30 ++++++++++++++++++++++++++
src/languages/en.js | 6 ++++++
src/pages/EditMonitor.vue | 37 +++++++++++++++++++++++++++++++--
8 files changed, 127 insertions(+), 4 deletions(-)
create mode 100644 db/patch-add-radius-monitor.sql
diff --git a/db/patch-add-radius-monitor.sql b/db/patch-add-radius-monitor.sql
new file mode 100644
index 000000000..1fd5b44f4
--- /dev/null
+++ b/db/patch-add-radius-monitor.sql
@@ -0,0 +1,18 @@
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+ ADD radius_username VARCHAR(255);
+
+ALTER TABLE monitor
+ ADD radius_password VARCHAR(255);
+
+ALTER TABLE monitor
+ ADD radius_calling_station_id VARCHAR(50);
+
+ALTER TABLE monitor
+ ADD radius_called_station_id VARCHAR(50);
+
+ALTER TABLE monitor
+ ADD radius_secret VARCHAR(255);
+
+COMMIT
diff --git a/package.json b/package.json
index e9b7003bd..304a466e3 100644
--- a/package.json
+++ b/package.json
@@ -93,6 +93,7 @@
"limiter": "^2.1.0",
"mqtt": "^4.2.8",
"node-cloudflared-tunnel": "~1.0.9",
+ "node-radius-client": "^1.0.0",
"nodemailer": "~6.6.5",
"notp": "~2.0.3",
"password-hash": "~1.2.2",
diff --git a/server/database.js b/server/database.js
index b17e7f4ed..4ce509f3c 100644
--- a/server/database.js
+++ b/server/database.js
@@ -58,6 +58,7 @@ class Database {
"patch-monitor-expiry-notification.sql": true,
"patch-status-page-footer-css.sql": true,
"patch-added-mqtt-monitor.sql": true,
+ "patch-add-radius-monitor.sql": true,
};
/**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f2d16524b..0b8fade43 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -7,7 +7,7 @@ dayjs.extend(timezone);
const axios = require("axios");
const { Prometheus } = require("../prometheus");
const { log, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mqttAsync } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, radius, setting, mqttAsync } = require("../util-server");
const { R } = require("redbean-node");
const { BeanModel } = require("redbean-node/dist/bean-model");
const { Notification } = require("../notification");
@@ -87,7 +87,12 @@ class Monitor extends BeanModel {
mqttUsername: this.mqttUsername,
mqttPassword: this.mqttPassword,
mqttTopic: this.mqttTopic,
- mqttSuccessMessage: this.mqttSuccessMessage
+ mqttSuccessMessage: this.mqttSuccessMessage,
+ radiusUsername: this.radiusUsername,
+ radiusPassword: this.radiusPassword,
+ radiusCalledStationId: this.radiusCalledStationId,
+ radiusCallingStationId: this.radiusCallingStationId,
+ radiusSecret: this.radiusSecret
};
if (includeSensitiveData) {
@@ -435,6 +440,30 @@ class Monitor extends BeanModel {
interval: this.interval,
});
bean.status = UP;
+ } else if (this.type === "radius") {
+ let startTime = dayjs().valueOf();
+ try {
+ const resp = await radius(
+ this.hostname,
+ this.radiusUsername,
+ this.radiusPassword,
+ this.radiusCalledStationId,
+ this.radiusCallingStationId,
+ this.radiusSecret
+ );
+ if (resp.code) {
+ bean.msg = resp.code;
+ }
+ bean.status = UP;
+ } catch (error) {
+ bean.status = DOWN;
+ if (error.response?.code) {
+ bean.msg = error.response.code;
+ } else {
+ bean.msg = error.message;
+ }
+ }
+ bean.ping = dayjs().valueOf() - startTime;
} else {
bean.msg = "Unknown Monitor Type";
bean.status = PENDING;
diff --git a/server/server.js b/server/server.js
index 79cb21026..55b108168 100644
--- a/server/server.js
+++ b/server/server.js
@@ -674,6 +674,11 @@ try {
bean.mqttPassword = monitor.mqttPassword;
bean.mqttTopic = monitor.mqttTopic;
bean.mqttSuccessMessage = monitor.mqttSuccessMessage;
+ bean.radiusUsername = monitor.radiusUsername;
+ bean.radiusPassword = monitor.radiusPassword;
+ bean.radiusCalledStationId = monitor.radiusCalledStationId;
+ bean.radiusCallingStationId = monitor.radiusCallingStationId;
+ bean.radiusSecret = monitor.radiusSecret;
await R.store(bean);
diff --git a/server/util-server.js b/server/util-server.js
index 54974e148..5dd81e006 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -10,6 +10,12 @@ const chardet = require("chardet");
const mqtt = require("mqtt");
const chroma = require("chroma-js");
const { badgeConstants } = require("./config");
+const radiusClient = require("node-radius-client");
+const {
+ dictionaries: {
+ rfc2865: { file, attributes },
+ },
+} = require("node-radius-utils");
// From ping-lite
exports.WIN = /^win/.test(process.platform);
@@ -203,6 +209,30 @@ exports.dnsResolve = function (hostname, resolverServer, rrtype) {
});
};
+exports.radius = function (
+ hostname,
+ username,
+ password,
+ calledStationId,
+ callingStationId,
+ secret,
+) {
+ const client = new radiusClient({
+ host: hostname,
+ dictionaries: [ file ],
+ });
+
+ return client.accessRequest({
+ secret: secret,
+ attributes: [
+ [ attributes.USER_NAME, username ],
+ [ attributes.USER_PASSWORD, password ],
+ [ attributes.CALLING_STATION_ID, callingStationId ],
+ [ attributes.CALLED_STATION_ID, calledStationId ],
+ ],
+ });
+};
+
/**
* Retrieve value of setting based on key
* @param {string} key Key of setting to retrieve
diff --git a/src/languages/en.js b/src/languages/en.js
index ab73ce354..138264534 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -464,4 +464,10 @@ export default {
"Domain Names": "Domain Names",
signedInDisp: "Signed in as {0}",
signedInDispDisabled: "Auth Disabled.",
+ RadiusSecret: "Radius Secret",
+ RadiusSecretDescription: "Shared Secret between client and server",
+ RadiusCalledStationId: "Called Station Id",
+ RadiusCalledStationIdDescription: "Identifier of the called device",
+ RadiusCallingStationId: "Calling Station Id",
+ RadiusCallingStationIdDescription: "Identifier of the calling device",
};
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 43f345273..e2beaca10 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -35,6 +35,9 @@
+
@@ -70,8 +73,8 @@
-
-
+
+
@@ -148,6 +151,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ $t( "RadiusSecretDescription") }}
+
+
+
+
+
+
{{ $t( "RadiusCalledStationIdDescription") }}
+
+
+
+
+
+
{{ $t( "RadiusCallingStationIdDescription") }}
+
+
+
From 42d68edab07881e4d9ffe88349c8de2a0db85b1f Mon Sep 17 00:00:00 2001
From: Sascha Kruse
Date: Wed, 18 May 2022 15:55:36 +0200
Subject: [PATCH 027/197] (style) add trailing comma
Co-authored-by: Adam Stachowicz
---
server/model/monitor.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 0b8fade43..71b4255ca 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -92,7 +92,7 @@ class Monitor extends BeanModel {
radiusPassword: this.radiusPassword,
radiusCalledStationId: this.radiusCalledStationId,
radiusCallingStationId: this.radiusCallingStationId,
- radiusSecret: this.radiusSecret
+ radiusSecret: this.radiusSecret,
};
if (includeSensitiveData) {
From 32cfd411f87ed98bd3247a7751b2f4791fbd388e Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Thu, 19 May 2022 12:35:55 +0000
Subject: [PATCH 028/197] Fixed style & code errors
---
server/model/monitor.js | 4 ++--
src/pages/EditMonitor.vue | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/server/model/monitor.js b/server/model/monitor.js
index c7e2cd315..2bc40b5f2 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -429,7 +429,7 @@ class Monitor extends BeanModel {
throw new Error("Server not found on Steam");
}
} else if (this.type === "docker") {
- debug(`[${this.name}] Prepare Options for Axios`);
+ log.debug(`[${this.name}] Prepare Options for Axios`);
const options = {
url: `/containers/${this.docker_container}/json`,
@@ -449,7 +449,7 @@ class Monitor extends BeanModel {
options.baseURL = this.docker_daemon;
}
- debug(`[${this.name}] Axios Request`);
+ log.debug(`[${this.name}] Axios Request`);
let res = await axios.request(options);
if (res.data.State.Running) {
bean.status = UP;
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 56c9ac92d..1d1568838 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -120,7 +120,7 @@
-
+
From 54548e34edfa17fd5930901dd66c48ce6b28684a Mon Sep 17 00:00:00 2001
From: Wooferz <85282355+woooferz@users.noreply.github.com>
Date: Wed, 8 Jun 2022 20:05:10 +1000
Subject: [PATCH 029/197] Added label to status badge
---
server/routers/api-router.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 201efc41f..d71f903a0 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -136,6 +136,7 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
const state = overrideValue !== undefined ? overrideValue : heartbeat.status === 1;
+ badgeValues.label = label ? label : "";
badgeValues.color = state ? upColor : downColor;
badgeValues.message = label ?? state ? upLabel : downLabel;
}
From 817c941489efabe35ac08ed6a6e9158e424617fe Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 22:30:42 +0800
Subject: [PATCH 030/197] Add Bark Notification Parameters
---
server/notification-providers/bark.js | 15 +++-
src/components/notifications/Bark.vue | 106 ++++++++++++++++++++++++++
src/languages/bg-BG.js | 2 +
src/languages/de-DE.js | 2 +
src/languages/en.js | 2 +
src/languages/ko-KR.js | 2 +
src/languages/nl-NL.js | 2 +
src/languages/pl.js | 2 +
src/languages/th-TH.js | 2 +
src/languages/tr-TR.js | 2 +
src/languages/vi-VN.js | 2 +
src/languages/zh-CN.js | 2 +
src/languages/zh-TW.js | 2 +
13 files changed, 140 insertions(+), 3 deletions(-)
diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index 092511d87..a2c4966a2 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -12,9 +12,7 @@ const { default: axios } = require("axios");
// bark is an APN bridge that sends notifications to Apple devices.
-const barkNotificationGroup = "UptimeKuma";
const barkNotificationAvatar = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png";
-const barkNotificationSound = "telegraph";
const successMessage = "Successes!";
class Bark extends NotificationProvider {
@@ -53,10 +51,21 @@ class Bark extends NotificationProvider {
appendAdditionalParameters(postUrl) {
// grouping all our notifications
postUrl += "?group=" + barkNotificationGroup;
+ if (notification.barkGroup != null) {
+ postUrl += "&group=" + notification.barkGroup;
+ } else {
+ postUrl += "&group=" + "UptimeKuma";
+ // default group
+ }
// set icon to uptime kuma icon, 11kb should be fine
postUrl += "&icon=" + barkNotificationAvatar;
// picked a sound, this should follow system's mute status when arrival
- postUrl += "&sound=" + barkNotificationSound;
+ if (notification.barkSound != null) {
+ postUrl += "&sound=" + notification.barkSound;
+ } else {
+ postUrl += "&sound=" + "telegraph";
+ // default sound
+ }
return postUrl;
}
diff --git a/src/components/notifications/Bark.vue b/src/components/notifications/Bark.vue
index 014450dec..70e4322d3 100644
--- a/src/components/notifications/Bark.vue
+++ b/src/components/notifications/Bark.vue
@@ -12,4 +12,110 @@
>{{ $t("here") }}
+
+
+
+
+
+
+
+
+
diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 6297062ae..23b1b7264 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -389,6 +389,8 @@ export default {
SignName: "Знак име",
"Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
"Bark Endpoint": "Bark крайна точка",
+ "Bark Group": "Bark група",
+ "Bark Sound": "Bark Звънене",
WebHookUrl: "URL адрес на уеб кука",
SecretKey: "Таен ключ",
"For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index e679937cf..aeba230f8 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -389,6 +389,8 @@ export default {
SignName: "Signaturname",
"Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
"Bark Endpoint": "Bark Endpunkt",
+ "Bark Group": "Bark Gruppe",
+ "Bark Sound": "Bark Klingelton",
WebHookUrl: "Webhook URL",
SecretKey: "Geheimer Schlüssel",
"For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
diff --git a/src/languages/en.js b/src/languages/en.js
index aa6737dd8..4b8f782fe 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -406,6 +406,8 @@ export default {
SignName: "SignName",
"Sms template must contain parameters: ": "Sms template must contain parameters: ",
"Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
WebHookUrl: "WebHookUrl",
SecretKey: "SecretKey",
"For safety, must use secret key": "For safety, must use secret key",
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index da034167d..0ed7a6f2e 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -406,6 +406,8 @@ export default {
SignName: "SignName",
"Sms template must contain parameters: ": "Sms 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
"Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
WebHookUrl: "웹훅 URL",
SecretKey: "Secret Key",
"For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
index 96424a5f8..93bae56d8 100644
--- a/src/languages/nl-NL.js
+++ b/src/languages/nl-NL.js
@@ -397,6 +397,8 @@ export default {
SignName: "SignName",
"Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
"Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
WebHookUrl: "WebHookUrl",
SecretKey: "SecretKey",
"For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
diff --git a/src/languages/pl.js b/src/languages/pl.js
index ab2480d38..57a5cbe69 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -396,6 +396,8 @@ export default {
SignName: "Podpis",
"Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
"Bark Endpoint": "Punkt końcowy Bark",
+ "Bark Group": "grupa Bark",
+ "Bark Sound": "Dzwonek Bark",
WebHookUrl: "WebHookUrl",
SecretKey: "Tajny klucz",
"For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 70138ff46..1773de7ab 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -396,6 +396,8 @@ export default {
SignName: "ป้ายชื่อ",
"Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
"Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
WebHookUrl: "WebHookUrl",
SecretKey: "SecretKey",
"For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 4904bdb79..bce1f0fdf 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -397,6 +397,8 @@ export default {
SignName: "SignName",
"Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
"Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
WebHookUrl: "WebHookUrl",
SecretKey: "SecretKey",
"For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
index 9005c3939..9d8da69ad 100644
--- a/src/languages/vi-VN.js
+++ b/src/languages/vi-VN.js
@@ -396,6 +396,8 @@ export default {
SignName: "SignName",
"Sms template must contain parameters: ": "Sms template must contain parameters: ",
"Bark Endpoint": "Bark Endpoint",
+ "Bark Group": "Bark Group",
+ "Bark Sound": "Bark Sound",
WebHookUrl: "WebHookUrl",
SecretKey: "SecretKey",
"For safety, must use secret key": "Để an toàn, hãy dùng secret key",
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 428d56bb6..003fdd7a6 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -402,6 +402,8 @@ export default {
TemplateCode: "TemplateCode",
SignName: "SignName",
"Bark Endpoint": "Bark 接入点",
+ "Bark Group": "Bark 群组",
+ "Bark Sound": "Bark 铃声",
"Device Token": "Apple Device Token",
Platform: "平台",
iOS: "iOS",
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index ff849adb8..1118d1004 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -396,6 +396,8 @@ export default {
SignName: "SignName",
"Sms template must contain parameters: ": "Sms 範本必須包含參數:",
"Bark Endpoint": "Bark 端點",
+ "Bark Group": "Bark 群組",
+ "Bark Sound": "Bark 鈴聲",
WebHookUrl: "WebHookUrl",
SecretKey: "SecretKey",
"For safety, must use secret key": "為了安全起見,必須使用秘密金鑰",
From a41023ca2a05f1015021d30352b9e4f752778320 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 22:41:24 +0800
Subject: [PATCH 031/197] Update
---
server/notification-providers/bark.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index a2c4966a2..b9113a749 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -50,7 +50,6 @@ class Bark extends NotificationProvider {
*/
appendAdditionalParameters(postUrl) {
// grouping all our notifications
- postUrl += "?group=" + barkNotificationGroup;
if (notification.barkGroup != null) {
postUrl += "&group=" + notification.barkGroup;
} else {
From 404923b7c82cdc633c637f364f0f2ccbb878d346 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 22:49:04 +0800
Subject: [PATCH 032/197] bugfix
---
server/notification-providers/bark.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index b9113a749..f9215c8af 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -48,7 +48,7 @@ class Bark extends NotificationProvider {
* @param {string} postUrl URL to append parameters to
* @returns {string}
*/
- appendAdditionalParameters(postUrl) {
+ appendAdditionalParameters(notification, postUrl) {
// grouping all our notifications
if (notification.barkGroup != null) {
postUrl += "&group=" + notification.barkGroup;
From a23ab9d1de03e0825f6c1206c141fcec98a41a8d Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 23:18:32 +0800
Subject: [PATCH 033/197] Update
---
src/components/notifications/Bark.vue | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/components/notifications/Bark.vue b/src/components/notifications/Bark.vue
index 70e4322d3..34d35db1f 100644
--- a/src/components/notifications/Bark.vue
+++ b/src/components/notifications/Bark.vue
@@ -18,7 +18,6 @@
-
From e1f766756f067f043bfc6a43c3f24e2c9c19f76a Mon Sep 17 00:00:00 2001
From: "sur.la.route"
Date: Wed, 15 Jun 2022 20:14:26 -0500
Subject: [PATCH 045/197] Removed blank line
Co-authored-by: Matthew Nickson
---
server/util-server.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/server/util-server.js b/server/util-server.js
index dc403cbd9..89777bcef 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -263,7 +263,6 @@ exports.mssqlQuery = function (connectionString, query) {
* @returns {Promise<(string[]|Object[]|Object)>}
*/
exports.postgresQuery = function (connectionString, query) {
-
return new Promise((resolve, reject) => {
const config = postgresConParse(connectionString);
From 47e82ed83ad980b16374ecd1010ccf4b4f9ae9bd Mon Sep 17 00:00:00 2001
From: "sur.la.route"
Date: Wed, 15 Jun 2022 20:14:36 -0500
Subject: [PATCH 046/197] Removed blank line
Co-authored-by: Matthew Nickson
---
server/util-server.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/server/util-server.js b/server/util-server.js
index 89777bcef..0ac13c689 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -264,7 +264,6 @@ exports.mssqlQuery = function (connectionString, query) {
*/
exports.postgresQuery = function (connectionString, query) {
return new Promise((resolve, reject) => {
-
const config = postgresConParse(connectionString);
if (config.password === "") {
From c4e2d67d17319cc438be7174aaea3f7f6f560077 Mon Sep 17 00:00:00 2001
From: Robert
Date: Fri, 17 Jun 2022 10:11:53 +0300
Subject: [PATCH 047/197] fix: hide mobile header when not logged in
---
src/layouts/Layout.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index aea58bf1b..57519f557 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -77,7 +77,7 @@
-
+
+ {{ $t("HTTP Headers") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -113,6 +154,12 @@ export default {
settings() {
return this.$parent.$parent.$parent.settings;
},
+ saveSettings() {
+ return this.$parent.$parent.$parent.saveSettings;
+ },
+ settingsLoaded() {
+ return this.$parent.$parent.$parent.settingsLoaded;
+ },
},
watch: {
diff --git a/src/languages/en.js b/src/languages/en.js
index 9aeedd9de..3c3cdff41 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -453,6 +453,10 @@ export default {
"Message:": "Message:",
"Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+ "HTTP Headers": "HTTP Headers",
+ "Trust Proxy": "Trust Proxy",
+ "Trust 'X-Forwarded-*' headers": "Trust 'X-Forwarded-*' headers",
+ "Don't trust 'X-Forwarded-*' headers": "Don't trust 'X-Forwarded-*' headers",
"Other Software": "Other Software",
"For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
"Please read": "Please read",
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 03eb09e92..e10137898 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -153,6 +153,10 @@ export default {
this.settings.tlsExpiryNotifyDays = [ 7, 14, 21 ];
}
+ if (this.settings.trustProxy === undefined) {
+ this.settings.trustProxy = false;
+ }
+
this.settingsLoaded = true;
});
},
From 3fa5dfc87340ffec34d830a4e906f399845e33d6 Mon Sep 17 00:00:00 2001
From: Chongyi Zheng
Date: Tue, 12 Jul 2022 22:59:23 -0400
Subject: [PATCH 057/197] Use x-forwarded-host only when trustProxy is true
---
server/server.js | 14 +++++++++++---
server/uptime-kuma-server.js | 2 --
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/server/server.js b/server/server.js
index 2d3f37eeb..0c08da078 100644
--- a/server/server.js
+++ b/server/server.js
@@ -164,12 +164,20 @@ let needSetup = false;
// Entry Page
app.get("/", async (request, response) => {
- log.debug("entry", `Request Domain: ${request.hostname}`);
+ let hostname = request.hostname;
+ if (await setting("trustProxy")) {
+ const proxy = request.headers["x-forwarded-host"];
+ if (proxy) {
+ hostname = proxy;
+ }
+ }
+
+ log.debug("entry", `Request Domain: ${hostname}`);
- if (request.hostname in StatusPage.domainMappingList) {
+ if (hostname in StatusPage.domainMappingList) {
log.debug("entry", "This is a status page domain");
- let slug = StatusPage.domainMappingList[request.hostname];
+ let slug = StatusPage.domainMappingList[hostname];
await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
} else if (exports.entryPage && exports.entryPage.startsWith("statusPage-")) {
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 991c7ba26..34031b237 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -49,8 +49,6 @@ class UptimeKumaServer {
log.info("server", "Creating express and socket.io instance");
this.app = express();
- this.app.enable("trust proxy");
-
if (sslKey && sslCert) {
log.info("server", "Server Type: HTTPS");
this.httpServer = https.createServer({
From 25d711e6834d88c10d21099e53ab333f758b8fc0 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 18 Jul 2022 22:06:25 +0800
Subject: [PATCH 058/197] Fix jsdoc data type
---
server/util-server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/util-server.js b/server/util-server.js
index f6a0e396c..deacb3a9a 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -384,7 +384,7 @@ exports.checkCertificate = function (res) {
/**
* Check if the provided status code is within the accepted ranges
- * @param {string} status The status code to check
+ * @param {number} status The status code to check
* @param {string[]} acceptedCodes An array of accepted status codes
* @returns {boolean} True if status code within range, false otherwise
* @throws {Error} Will throw an error if the provided status code is not a valid range string or code string
From 2073f0c28476bb46fb953ecefb9622273e8819d9 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 18 Jul 2022 22:33:35 +0800
Subject: [PATCH 059/197] Bind cacheable-lookup to custom http agent
---
server/cacheable-dns-http-agent.js | 50 ++++++++++++++++++++++++++++++
server/model/monitor.js | 6 +++-
server/uptime-kuma-server.js | 6 ++--
3 files changed, 57 insertions(+), 5 deletions(-)
create mode 100644 server/cacheable-dns-http-agent.js
diff --git a/server/cacheable-dns-http-agent.js b/server/cacheable-dns-http-agent.js
new file mode 100644
index 000000000..0eb7a6ee2
--- /dev/null
+++ b/server/cacheable-dns-http-agent.js
@@ -0,0 +1,50 @@
+const https = require("https");
+const http = require("http");
+const CacheableLookup = require("cacheable-lookup");
+
+class CacheableDnsHttpAgent {
+
+ static cacheable = new CacheableLookup();
+
+ static httpAgentList = {};
+ static httpsAgentList = {};
+
+ /**
+ * Register cacheable to global agents
+ */
+ static registerGlobalAgent() {
+ this.cacheable.install(http.globalAgent);
+ this.cacheable.install(https.globalAgent);
+ }
+
+ /**
+ * @var {https.AgentOptions} agentOptions
+ * @return {https.Agent}
+ */
+ static getHttpsAgent(agentOptions) {
+ let key = JSON.stringify(agentOptions);
+ if (!(key in this.httpsAgentList)) {
+ this.httpsAgentList[key] = new https.Agent(agentOptions);
+ this.cacheable.install(this.httpsAgentList[key]);
+ }
+ return this.httpsAgentList[key];
+ }
+
+ /**
+ * @var {http.AgentOptions} agentOptions
+ * @return {https.Agents}
+ */
+ static getHttpAgent(agentOptions) {
+ let key = JSON.stringify(agentOptions);
+ if (!(key in this.httpAgentList)) {
+ this.httpAgentList[key] = new http.Agent(agentOptions);
+ this.cacheable.install(this.httpAgentList[key]);
+ }
+ return this.httpAgentList[key];
+ }
+
+}
+
+module.exports = {
+ CacheableDnsHttpAgent,
+};
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 5c97785f9..bcb5a8b72 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -16,6 +16,7 @@ const { demoMode } = require("../config");
const version = require("../../package.json").version;
const apicache = require("../modules/apicache");
const { UptimeKumaServer } = require("../uptime-kuma-server");
+const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
/**
* status:
@@ -434,10 +435,13 @@ class Monitor extends BeanModel {
"Accept": "*/*",
"User-Agent": "Uptime-Kuma/" + version,
},
- httpsAgent: new https.Agent({
+ httpsAgent: CacheableDnsHttpAgent.getHttpsAgent({
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
rejectUnauthorized: !this.getIgnoreTls(),
}),
+ httpAgent: CacheableDnsHttpAgent.getHttpAgent({
+ maxCachedSessions: 0,
+ }),
maxRedirects: this.maxredirects,
validateStatus: (status) => {
return checkStatusCode(status, this.getAcceptedStatuscodes());
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 6f7be7ba2..e93e2b787 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -7,7 +7,7 @@ const { R } = require("redbean-node");
const { log } = require("../src/util");
const Database = require("./database");
const util = require("util");
-const CacheableLookup = require("cacheable-lookup");
+const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
/**
* `module.exports` (alias: `server`) should be inside this class, in order to avoid circular dependency issue.
@@ -72,9 +72,7 @@ class UptimeKumaServer {
}
}
- const cacheable = new CacheableLookup();
- cacheable.install(http.globalAgent);
- cacheable.install(https.globalAgent);
+ CacheableDnsHttpAgent.registerGlobalAgent();
this.io = new Server(this.httpServer);
}
From 65d71e5db0653361c55e191313e491269f6b61af Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 18 Jul 2022 23:14:16 +0800
Subject: [PATCH 060/197] Fix mssqlQuery keep adding error listener, which
causes memory leak. Also it is not necessary since the error catched in the
promise .catch(..).
---
server/util-server.js | 4 ----
1 file changed, 4 deletions(-)
diff --git a/server/util-server.js b/server/util-server.js
index deacb3a9a..ec68c2f3d 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -238,10 +238,6 @@ exports.dnsResolve = function (hostname, resolverServer, resolverPort, rrtype) {
*/
exports.mssqlQuery = function (connectionString, query) {
return new Promise((resolve, reject) => {
- mssql.on("error", err => {
- reject(err);
- });
-
mssql.connect(connectionString).then(pool => {
return pool.request()
.query(query);
From 9cd060c6c3fba9912bced3643a268d84b24f42f1 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 18 Jul 2022 23:27:05 +0800
Subject: [PATCH 061/197] socks-proxy-agent 6.2.X is a breaking change, freeze
to 6.1.1.
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 8693135ae..93c249f4a 100644
--- a/package.json
+++ b/package.json
@@ -99,7 +99,7 @@
"redbean-node": "0.1.4",
"socket.io": "~4.4.1",
"socket.io-client": "~4.4.1",
- "socks-proxy-agent": "^6.1.1",
+ "socks-proxy-agent": "6.1.1",
"tar": "^6.1.11",
"tcp-ping": "~0.1.1",
"thirty-two": "~1.0.2"
From 8f7b7e74c955eea2d4107d1658f94530101aede9 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 18 Jul 2022 23:28:19 +0800
Subject: [PATCH 062/197] socks-proxy-agent 6.2.X is a breaking change, freeze
to 6.1.1.
---
package-lock.json | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b0e55246a..e64f9fa71 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47,7 +47,7 @@
"redbean-node": "0.1.4",
"socket.io": "~4.4.1",
"socket.io-client": "~4.4.1",
- "socks-proxy-agent": "^6.1.1",
+ "socks-proxy-agent": "6.1.1",
"tar": "^6.1.11",
"tcp-ping": "~0.1.1",
"thirty-two": "~1.0.2"
@@ -14306,13 +14306,13 @@
}
},
"node_modules/socks-proxy-agent": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
- "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz",
+ "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==",
"dependencies": {
"agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
+ "debug": "^4.3.1",
+ "socks": "^2.6.1"
},
"engines": {
"node": ">= 10"
@@ -27095,13 +27095,13 @@
}
},
"socks-proxy-agent": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
- "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz",
+ "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==",
"requires": {
"agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
+ "debug": "^4.3.1",
+ "socks": "^2.6.1"
}
},
"sortablejs": {
From 17ed051401f3889e8be041084301f05517a33526 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Mon, 18 Jul 2022 23:32:45 +0800
Subject: [PATCH 063/197] Add CacheableDnsHttpAgent.install()
---
package.json | 2 +-
server/cacheable-dns-http-agent.js | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 93c249f4a..7a18dbdfd 100644
--- a/package.json
+++ b/package.json
@@ -68,7 +68,7 @@
"badge-maker": "^3.3.1",
"bcryptjs": "~2.4.3",
"bree": "~7.1.5",
- "cacheable-lookup": "^6.0.4",
+ "cacheable-lookup": "~6.0.4",
"chardet": "^1.3.0",
"check-password-strength": "^2.0.5",
"cheerio": "^1.0.0-rc.10",
diff --git a/server/cacheable-dns-http-agent.js b/server/cacheable-dns-http-agent.js
index 0eb7a6ee2..56e8430eb 100644
--- a/server/cacheable-dns-http-agent.js
+++ b/server/cacheable-dns-http-agent.js
@@ -17,6 +17,10 @@ class CacheableDnsHttpAgent {
this.cacheable.install(https.globalAgent);
}
+ static install(agent) {
+ this.cacheable.install(agent);
+ }
+
/**
* @var {https.AgentOptions} agentOptions
* @return {https.Agent}
From 31c388a6e3edeb10c2d35e305d643fde359e7806 Mon Sep 17 00:00:00 2001
From: tamasmagyar <20069588+tamasmagyar@users.noreply.github.com>
Date: Thu, 16 Jun 2022 08:06:34 +0200
Subject: [PATCH 064/197] added cypress framework and tests for setup page
---
.gitignore | 3 +++
cypress.config.ts | 14 ++++++++++++++
cypress/e2e/setup.cy.ts | 24 ++++++++++++++++++++++++
cypress/fixtures/example.json | 5 +++++
cypress/plugins/index.js | 0
cypress/support/actors/actor.ts | 8 ++++++++
cypress/support/commands.ts | 0
cypress/support/const/user-data.ts | 4 ++++
cypress/support/e2e.ts | 1 +
cypress/support/pages/dasboard-page.ts | 3 +++
cypress/support/pages/setup-page.ts | 7 +++++++
cypress/support/tasks/setup-task.ts | 15 +++++++++++++++
package.json | 5 ++++-
src/pages/Setup.vue | 10 +++++-----
tsconfig.json | 8 +++++---
15 files changed, 98 insertions(+), 9 deletions(-)
create mode 100644 cypress.config.ts
create mode 100644 cypress/e2e/setup.cy.ts
create mode 100644 cypress/fixtures/example.json
create mode 100644 cypress/plugins/index.js
create mode 100644 cypress/support/actors/actor.ts
create mode 100644 cypress/support/commands.ts
create mode 100644 cypress/support/const/user-data.ts
create mode 100644 cypress/support/e2e.ts
create mode 100644 cypress/support/pages/dasboard-page.ts
create mode 100644 cypress/support/pages/setup-page.ts
create mode 100644 cypress/support/tasks/setup-task.ts
diff --git a/.gitignore b/.gitignore
index cd654d903..8eb05867b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,6 @@ dist-ssr
/out
/tmp
.env
+
+cypress/videos
+cypress/screenshots
diff --git a/cypress.config.ts b/cypress.config.ts
new file mode 100644
index 000000000..ceeebca3c
--- /dev/null
+++ b/cypress.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from "cypress";
+
+export default defineConfig({
+ e2e: {
+ baseUrl: "http://localhost:3000",
+ defaultCommandTimeout: 10000,
+ pageLoadTimeout: 60000,
+ viewportWidth: 1920,
+ viewportHeight: 1080,
+ },
+ env: {
+ baseUrl: "http://localhost:3000",
+ },
+});
diff --git a/cypress/e2e/setup.cy.ts b/cypress/e2e/setup.cy.ts
new file mode 100644
index 000000000..94e18edef
--- /dev/null
+++ b/cypress/e2e/setup.cy.ts
@@ -0,0 +1,24 @@
+import { actor } from "../support/actors/actor";
+import { DEFAULT_USER_DATA } from "../support/const/user-data";
+import { DashboardPage } from "../support/pages/dasboard-page";
+import { SetupPage } from "../support/pages/setup-page";
+
+describe("user can create a new account on setup page", () => {
+ before(() => {
+ cy.visit("/setup");
+ });
+
+ it("user can create new account", () => {
+ cy.url().should("be.equal", SetupPage.url);
+ actor.setupTask.fillAndSubmitSetupForm(
+ DEFAULT_USER_DATA.username,
+ DEFAULT_USER_DATA.password,
+ DEFAULT_USER_DATA.password
+ );
+
+ cy.url().should("be.equal", DashboardPage.url);
+ cy.get('[role="alert"]')
+ .should("be.visible")
+ .and("contain.text", "Added Successfully.");
+ });
+});
diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json
new file mode 100644
index 000000000..02e425437
--- /dev/null
+++ b/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+ "name": "Using fixtures to represent data",
+ "email": "hello@cypress.io",
+ "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/cypress/support/actors/actor.ts b/cypress/support/actors/actor.ts
new file mode 100644
index 000000000..680c26ce7
--- /dev/null
+++ b/cypress/support/actors/actor.ts
@@ -0,0 +1,8 @@
+import { SetupTask } from "../tasks/setup-task";
+
+class Actor {
+ setupTask: SetupTask = new SetupTask();
+}
+
+const actor = new Actor();
+export { actor };
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
new file mode 100644
index 000000000..e69de29bb
diff --git a/cypress/support/const/user-data.ts b/cypress/support/const/user-data.ts
new file mode 100644
index 000000000..ee2264ddd
--- /dev/null
+++ b/cypress/support/const/user-data.ts
@@ -0,0 +1,4 @@
+export const DEFAULT_USER_DATA = {
+ username: "testuser",
+ password: "testuser123",
+};
diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts
new file mode 100644
index 000000000..f887c29ae
--- /dev/null
+++ b/cypress/support/e2e.ts
@@ -0,0 +1 @@
+import "./commands";
diff --git a/cypress/support/pages/dasboard-page.ts b/cypress/support/pages/dasboard-page.ts
new file mode 100644
index 000000000..48660dc1d
--- /dev/null
+++ b/cypress/support/pages/dasboard-page.ts
@@ -0,0 +1,3 @@
+export const DashboardPage = {
+ url: Cypress.env("baseUrl") + "/dashboard",
+};
diff --git a/cypress/support/pages/setup-page.ts b/cypress/support/pages/setup-page.ts
new file mode 100644
index 000000000..8c1b9cfa3
--- /dev/null
+++ b/cypress/support/pages/setup-page.ts
@@ -0,0 +1,7 @@
+export const SetupPage = {
+ url: Cypress.env("baseUrl") + "/setup",
+ usernameInput: '[data-cy="username-input"]',
+ passWordInput: '[data-cy="password-input"]',
+ passwordRepeatInput: '[data-cy="password-repeat-input"]',
+ submitSetupForm: '[data-cy="submit-setup-form"]',
+};
diff --git a/cypress/support/tasks/setup-task.ts b/cypress/support/tasks/setup-task.ts
new file mode 100644
index 000000000..866e3ca5c
--- /dev/null
+++ b/cypress/support/tasks/setup-task.ts
@@ -0,0 +1,15 @@
+import { SetupPage } from "../pages/setup-page";
+
+export class SetupTask {
+ fillAndSubmitSetupForm(
+ username: string,
+ password: string,
+ passwordRepeat: string
+ ) {
+ cy.get(SetupPage.usernameInput).type(username);
+ cy.get(SetupPage.passWordInput).type(password);
+ cy.get(SetupPage.passwordRepeatInput).type(passwordRepeat);
+
+ cy.get(SetupPage.submitSetupForm).click();
+ }
+}
diff --git a/package.json b/package.json
index 7a18dbdfd..508722f43 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,8 @@
"release-final": "node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
"release-beta": "node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
"git-remove-tag": "git tag -d",
- "build-dist-and-restart": "npm run build && npm run start-server-dev"
+ "build-dist-and-restart": "npm run build && npm run start-server-dev",
+ "cy:run": "npx cypress run --browser chrome --headless"
},
"dependencies": {
"@louislam/sqlite3": "~15.0.6",
@@ -125,6 +126,8 @@
"concurrently": "^7.1.0",
"core-js": "~3.18.3",
"cross-env": "~7.0.3",
+ "cypress": "^10.1.0",
+ "delay": "^5.0.0",
"dns2": "~2.0.1",
"eslint": "~8.14.0",
"eslint-plugin-vue": "~8.7.1",
diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue
index 08347b8e1..cba7f8fce 100644
--- a/src/pages/Setup.vue
+++ b/src/pages/Setup.vue
@@ -1,5 +1,5 @@
-
@@ -456,6 +457,7 @@ import VueMultiselect from "vue-multiselect";
import { useToast } from "vue-toastification";
import CopyableInput from "../components/CopyableInput.vue";
import NotificationDialog from "../components/NotificationDialog.vue";
+import DockerHostDialog from "../components/DockerHostDialog.vue";
import ProxyDialog from "../components/ProxyDialog.vue";
import TagsManager from "../components/TagsManager.vue";
import { genSecret, isDev } from "../util.ts";
@@ -467,6 +469,7 @@ export default {
ProxyDialog,
CopyableInput,
NotificationDialog,
+ DockerHostDialog,
TagsManager,
VueMultiselect,
},
@@ -625,8 +628,7 @@ export default {
dns_resolve_type: "A",
dns_resolve_server: "1.1.1.1",
docker_container: "",
- docker_daemon: "/var/run/docker.sock",
- docker_type: "socket",
+ docker_host: null,
proxyId: null,
mqttUsername: "",
mqttPassword: "",
@@ -740,6 +742,12 @@ export default {
addedProxy(id) {
this.monitor.proxyId = id;
},
+
+ // Added a Docker Host Event
+ // Enable it if the Docker Host is added in EditMonitor.vue
+ addedDockerHost(id) {
+ this.monitor.docker_host = id;
+ }
},
};
From e356d5f62391fbcbaa523c291e2219372128ed7c Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Fri, 22 Jul 2022 15:57:40 +0000
Subject: [PATCH 073/197] Fixing linting & adding documentation
---
server/client.js | 5 +++++
server/docker.js | 20 ++++++++++++++++++-
server/model/docker_host.js | 4 ++--
server/model/monitor.js | 10 +++++-----
.../socket-handlers/docker-socket-handler.js | 14 ++++++++-----
src/components/DockerHostDialog.vue | 2 +-
src/mixins/socket.js | 2 +-
7 files changed, 42 insertions(+), 15 deletions(-)
diff --git a/server/client.js b/server/client.js
index 614038427..bda776427 100644
--- a/server/client.js
+++ b/server/client.js
@@ -122,6 +122,11 @@ async function sendInfo(socket) {
});
}
+/**
+ * Send list of docker hosts to client
+ * @param {Socket} socket Socket.io socket instance
+ * @returns {Promise}
+ */
async function sendDockerHostList(socket) {
const timeLogger = new TimeLogger();
diff --git a/server/docker.js b/server/docker.js
index a13236aa9..57e793ab4 100644
--- a/server/docker.js
+++ b/server/docker.js
@@ -4,6 +4,13 @@ const version = require("../package.json").version;
const https = require("https");
class DockerHost {
+ /**
+ * Save a docker host
+ * @param {Object} dockerHost Docker host to save
+ * @param {?number} dockerHostID ID of the docker host to update
+ * @param {number} userID ID of the user who adds the docker host
+ * @returns {Promise}
+ */
static async save(dockerHost, dockerHostID, userID) {
let bean;
@@ -28,6 +35,12 @@ class DockerHost {
return bean;
}
+ /**
+ * Delete a Docker host
+ * @param {number} dockerHostID ID of the Docker host to delete
+ * @param {number} userID ID of the user who created the Docker host
+ * @returns {Promise}
+ */
static async delete(dockerHostID, userID) {
let bean = await R.findOne("docker_host", " id = ? AND user_id = ? ", [ dockerHostID, userID ]);
@@ -38,6 +51,11 @@ class DockerHost {
await R.trash(bean);
}
+ /**
+ * Fetches the amount of containers on the Docker host
+ * @param {Object} dockerHost Docker host to check for
+ * @returns {number} Total amount of containers on the host
+ */
static async getAmountContainer(dockerHost) {
const options = {
url: "/containers/json?all=true",
@@ -64,4 +82,4 @@ class DockerHost {
module.exports = {
DockerHost,
-}
\ No newline at end of file
+};
diff --git a/server/model/docker_host.js b/server/model/docker_host.js
index 26f3035a5..229a9a52d 100644
--- a/server/model/docker_host.js
+++ b/server/model/docker_host.js
@@ -12,8 +12,8 @@ class DockerHost extends BeanModel {
daemon: this._dockerDaemon,
type: this._dockerType,
name: this._name,
- }
+ };
}
}
-module.exports = DockerHost;
\ No newline at end of file
+module.exports = DockerHost;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 373796e96..babff8761 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -470,7 +470,7 @@ class Monitor extends BeanModel {
} else if (this.type === "docker") {
log.debug(`[${this.name}] Prepare Options for Axios`);
- const docker_host = await R.load("docker_host", this.docker_host);
+ const dockerHost = await R.load("docker_host", this.docker_host);
const options = {
url: `/containers/${this.docker_container}/json`,
@@ -484,10 +484,10 @@ class Monitor extends BeanModel {
}),
};
- if (docker_host._dockerType === "socket") {
- options.socketPath = docker_host._dockerDaemon;
- } else if (docker_host._dockerType === "tcp") {
- options.baseURL = docker_host._dockerDaemon;
+ if (dockerHost._dockerType === "socket") {
+ options.socketPath = dockerHost._dockerDaemon;
+ } else if (dockerHost._dockerType === "tcp") {
+ options.baseURL = dockerHost._dockerDaemon;
}
log.debug(`[${this.name}] Axios Request`);
diff --git a/server/socket-handlers/docker-socket-handler.js b/server/socket-handlers/docker-socket-handler.js
index eddcd7b84..7f3646bb1 100644
--- a/server/socket-handlers/docker-socket-handler.js
+++ b/server/socket-handlers/docker-socket-handler.js
@@ -2,6 +2,10 @@ const { sendDockerHostList } = require("../client");
const { checkLogin } = require("../util-server");
const { DockerHost } = require("../docker");
+/**
+ * Handlers for docker hosts
+ * @param {Socket} socket Socket.io instance
+ */
module.exports.dockerSocketHandler = (socket) => {
socket.on("addDockerHost", async (dockerHost, dockerHostID, callback) => {
try {
@@ -20,7 +24,7 @@ module.exports.dockerSocketHandler = (socket) => {
callback({
ok: false,
msg: e.message,
- })
+ });
}
});
@@ -40,7 +44,7 @@ module.exports.dockerSocketHandler = (socket) => {
callback({
ok: false,
msg: e.message,
- })
+ });
}
});
@@ -61,7 +65,7 @@ module.exports.dockerSocketHandler = (socket) => {
callback({
ok: false,
msg: e.message,
- })
+ });
}
- })
-}
\ No newline at end of file
+ });
+};
diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
index e52c4ecf3..d7cf2de0d 100644
--- a/src/components/DockerHostDialog.vue
+++ b/src/components/DockerHostDialog.vue
@@ -66,7 +66,7 @@ export default {
model: null,
processing: false,
id: null,
- connectionTypes: ["socket", "tcp"],
+ connectionTypes: [ "socket", "tcp" ],
dockerHost: {
name: "",
dockerDaemon: "",
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index f6de82c2b..e2096b372 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -144,7 +144,7 @@ export default {
socket.on("dockerHostList", (data) => {
this.dockerHostList = data;
- })
+ });
socket.on("heartbeat", (data) => {
if (! (data.monitorID in this.heartbeatList)) {
From f1bcecb0c64c9197592f007faf8cdd755755d2c0 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Sun, 24 Jul 2022 14:08:03 +0800
Subject: [PATCH 074/197] Merge package-lock.json
---
package-lock.json | 216 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 216 insertions(+)
diff --git a/package-lock.json b/package-lock.json
index d76f5a948..778e6bc38 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -42,6 +42,8 @@
"nodemailer": "~6.6.5",
"notp": "~2.0.3",
"password-hash": "~1.2.2",
+ "pg": "^8.7.3",
+ "pg-connection-string": "^2.5.0",
"prom-client": "~13.2.0",
"prometheus-api-metrics": "~3.2.1",
"redbean-node": "0.1.4",
@@ -4789,6 +4791,14 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
+ "node_modules/buffer-writer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+ "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/bulk-write-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
@@ -12488,6 +12498,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/packet-reader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+ "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -12636,11 +12651,88 @@
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
"optional": true
},
+ "node_modules/pg": {
+ "version": "8.7.3",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
+ "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+ "dependencies": {
+ "buffer-writer": "2.0.0",
+ "packet-reader": "1.0.0",
+ "pg-connection-string": "^2.5.0",
+ "pg-pool": "^3.5.1",
+ "pg-protocol": "^1.5.0",
+ "pg-types": "^2.1.0",
+ "pgpass": "1.x"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "pg-native": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "pg-native": {
+ "optional": true
+ }
+ }
+ },
"node_modules/pg-connection-string": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
"integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
},
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-pool": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
+ "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
+ "peerDependencies": {
+ "pg": ">=8.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
+ "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "dependencies": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "dependencies": {
+ "split2": "^4.1.0"
+ }
+ },
+ "node_modules/pgpass/node_modules/split2": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
+ "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -12896,6 +12988,41 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-bytea": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+ "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -20016,6 +20143,11 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
+ "buffer-writer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+ "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
+ },
"bulk-write-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
@@ -25736,6 +25868,11 @@
"p-timeout": "^3.0.0"
}
},
+ "packet-reader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+ "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+ },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -25845,11 +25982,67 @@
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
"optional": true
},
+ "pg": {
+ "version": "8.7.3",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
+ "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+ "requires": {
+ "buffer-writer": "2.0.0",
+ "packet-reader": "1.0.0",
+ "pg-connection-string": "^2.5.0",
+ "pg-pool": "^3.5.1",
+ "pg-protocol": "^1.5.0",
+ "pg-types": "^2.1.0",
+ "pgpass": "1.x"
+ }
+ },
"pg-connection-string": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
"integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
},
+ "pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
+ },
+ "pg-pool": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
+ "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ=="
+ },
+ "pg-protocol": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
+ "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+ },
+ "pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "requires": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ }
+ },
+ "pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "requires": {
+ "split2": "^4.1.0"
+ },
+ "dependencies": {
+ "split2": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
+ "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="
+ }
+ }
+ },
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -26018,6 +26211,29 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
+ },
+ "postgres-bytea": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+ "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="
+ },
+ "postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
+ },
+ "postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "requires": {
+ "xtend": "^4.0.0"
+ }
+ },
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
From fb3b407577b5b2c9e9b8e6a45d53a6b32caf8d7b Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Sun, 24 Jul 2022 12:34:43 +0000
Subject: [PATCH 075/197] Added a settings page & localization
---
server/docker.js | 3 ++
src/components/settings/Docker.vue | 50 ++++++++++++++++++++++++++++++
src/languages/en.js | 20 +++++++-----
src/pages/EditMonitor.vue | 2 +-
src/pages/Settings.vue | 3 ++
src/router.js | 5 +++
6 files changed, 74 insertions(+), 9 deletions(-)
create mode 100644 src/components/settings/Docker.vue
diff --git a/server/docker.js b/server/docker.js
index 57e793ab4..ed9e08545 100644
--- a/server/docker.js
+++ b/server/docker.js
@@ -48,6 +48,9 @@ class DockerHost {
throw new Error("docker host not found");
}
+ // Delete removed proxy from monitors if exists
+ await R.exec("UPDATE monitor SET docker_host = null WHERE docker_host = ?", [ dockerHostID ]);
+
await R.trash(bean);
}
diff --git a/src/components/settings/Docker.vue b/src/components/settings/Docker.vue
new file mode 100644
index 000000000..7b99bb8b7
--- /dev/null
+++ b/src/components/settings/Docker.vue
@@ -0,0 +1,50 @@
+
+
+
+
+ {{ $t("Not available, please setup.") }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/languages/en.js b/src/languages/en.js
index 37392a4fc..c7e4b377d 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -372,12 +372,6 @@ export default {
smtpDkimHashAlgo: "Hash Algorithm (Optional)",
smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
smtpDkimskipFields: "Header Keys not to sign (Optional)",
- "Container Name / ID": "Container Name / ID",
- "Docker Daemon": "Docker Daemon",
- "Docker Container": "Docker Container",
- "Docker Type": "Connection Type",
- docker_socket: "Socket",
- docker_tcp: "TCP / HTTP",
wayToGetPagerDutyKey: "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
"Integration Key": "Integration Key",
"Integration URL": "Integration URL",
@@ -487,7 +481,7 @@ export default {
"Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
"Octopush API Version": "Octopush API Version",
"Legacy Octopush-DM": "Legacy Octopush-DM",
- "endpoint": "endpoint",
+ endpoint: "endpoint",
octopushAPIKey: "\"API key\" from HTTP API credentials in control panel",
octopushLogin: "\"Login\" from HTTP API credentials in control panel",
promosmsLogin: "API Login Name",
@@ -531,7 +525,17 @@ export default {
"Coming Soon": "Coming Soon",
wayToGetClickSendSMSToken: "You can get API Username and API Key from {0} .",
"Connection String": "Connection String",
- "Query": "Query",
+ Query: "Query",
settingsCertificateExpiry: "TLS Certificate Expiry",
certificationExpiryDescription: "HTTPS Monitors trigger notification when TLS certificate expires in:",
+ "Setup Docker Host": "Setup Docker Host",
+ "Connection Type": "Connection Type",
+ "Docker Daemon": "Docker Daemon",
+ deleteDockerHostMsg: "Are you sure want to delete this docker host for all monitors?",
+ socket: "Socket",
+ tcp: "TCP / HTTP",
+ "Docker Container": "Docker Container",
+ "Container Name / ID": "Container Name / ID",
+ "Docker Host": "Docker Host",
+ "Docker Hosts": "Docker Hosts"
};
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 5ff318bf8..c93fa97d1 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -156,7 +156,7 @@
{{ $t("Not available, please setup.") }}
-
+