From b0259b559249c979698b9f59891399920bf81070 Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Thu, 13 Jan 2022 16:17:07 +0000
Subject: [PATCH 001/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] (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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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/133] 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 055/133] 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;
+ }
+ }
- if (request.hostname in StatusPage.domainMappingList) {
+ log.debug("entry", `Request Domain: ${hostname}`);
+
+ 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 c412c66aebb04fab95a075dc13e9114edc045025 Mon Sep 17 00:00:00 2001
From: Mario Garrido
Date: Fri, 22 Jul 2022 06:29:41 +0100
Subject: [PATCH 056/133] Add pt-PT language file
---
src/languages/pt-PT.js | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/languages/pt-PT.js
diff --git a/src/languages/pt-PT.js b/src/languages/pt-PT.js
new file mode 100644
index 000000000..e69de29bb
From 77340cf0d296456d770c0244b4ec27f5c18348b7 Mon Sep 17 00:00:00 2001
From: Mario Garrido
Date: Fri, 22 Jul 2022 15:16:23 +0100
Subject: [PATCH 057/133] feat: adicionar pt-PT
---
src/languages/pt-PT.js | 203 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 203 insertions(+)
diff --git a/src/languages/pt-PT.js b/src/languages/pt-PT.js
index e69de29bb..ac4525694 100644
--- a/src/languages/pt-PT.js
+++ b/src/languages/pt-PT.js
@@ -0,0 +1,203 @@
+export default {
+ languageName: "Português (Portugal)",
+ checkEverySecond: "Verificar a cada {0} segundos.",
+ retryCheckEverySecond: "Tentar novamente a cada {0} segundos.",
+ retriesDescription: "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
+ ignoreTLSError: "Ignorar erros TLS/SSL para sites HTTPS",
+ upsideDownModeDescription: "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
+ maxRedirectDescription: "Número máximo de redirecionamentos a seguir. Define como 0 para desativar redirecionamentos.",
+ acceptedStatusCodesDescription: "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
+ passwordNotMatchMsg: "A senha repetida não corresponde.",
+ notificationDescription: "Atribuir uma notificação ao (s) monitor (es) para que funcione.",
+ keywordDescription: "Pesquisa a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas",
+ pauseDashboardHome: "Pausa",
+ deleteMonitorMsg: "Tens a certeza de que queres excluir este monitor?",
+ deleteNotificationMsg: "Tems a certeza de que queres excluir esta notificação para todos os monitores?",
+ resolverserverDescription: "A Cloudflare é o servidor padrão, podes alterar o servidor resolvedor a qualquer momento.",
+ rrtypeDescription: "Seleciona o RR-Type que queres monitorar",
+ pauseMonitorMsg: "Tens a certeza que queres fazer uma pausa?",
+ enableDefaultNotificationDescription: "Para cada novo monitor, esta notificação estará activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
+ clearEventsMsg: "Tens a certeza que queres excluir todos os eventos deste monitor?",
+ clearHeartbeatsMsg: "Tens a certeza de que queres excluir todos os heartbeats deste monitor?",
+ confirmClearStatisticsMsg: "Tens a certeza que queres excluir TODAS as estatísticas?",
+ importHandleDescription: "Escolha 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
+ confirmImportMsg: "Tens a certeza que queres importar o backup? Certifique-se que selecionou a opção de importação correta.",
+ twoFAVerifyLabel: "Insire o teu token para verificar se 2FA está a funcionar",
+ tokenValidSettingsMsg: "O token é válido! Agora podes salvar as configurações 2FA.",
+ confirmEnableTwoFAMsg: "Tens a certeza de que queres habilitar 2FA?",
+ confirmDisableTwoFAMsg: "Tens a certeza de que queres desativar 2FA?",
+ Settings: "Configurações",
+ Dashboard: "Dashboard",
+ "New Update": "Nova Atualização",
+ Language: "Linguagem",
+ Appearance: "Aparência",
+ Theme: "Tema",
+ General: "Geral",
+ Version: "Versão",
+ "Check Update On GitHub": "Verificar atualização no Github",
+ List: "Lista",
+ Add: "Adicionar",
+ "Add New Monitor": "Adicionar novo monitor",
+ "Quick Stats": "Estatísticas rápidas",
+ Up: "On",
+ Down: "Off",
+ Pending: "Pendente",
+ Unknown: "Desconhecido",
+ Pause: "Pausa",
+ Name: "Nome",
+ Status: "Status",
+ DateTime: "Data hora",
+ Message: "Mensagem",
+ "No important events": "Nenhum evento importante",
+ Resume: "Resumo",
+ Edit: "Editar",
+ Delete: "Apagar",
+ Current: "Atual",
+ Uptime: "Tempo de atividade",
+ "Cert Exp.": "Cert Exp.",
+ day: "dia | dias",
+ "-day": "-dia",
+ hour: "hora",
+ "-hour": "-hora",
+ Response: "Resposta",
+ Ping: "Ping",
+ "Monitor Type": "Tipo de Monitor",
+ Keyword: "Palavra-Chave",
+ "Friendly Name": "Nome Amigável",
+ URL: "URL",
+ Hostname: "Hostname",
+ Port: "Porta",
+ "Heartbeat Interval": "Intervalo de Heartbeat",
+ Retries: "Novas tentativas",
+ "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
+ Advanced: "Avançado",
+ "Upside Down Mode": "Modo de cabeça para baixo",
+ "Max. Redirects": "Redirecionamento Máx.",
+ "Accepted Status Codes": "Status Code Aceitáveis",
+ Save: "Guardar",
+ Notifications: "Notificações",
+ "Not available, please setup.": "Não disponível, por favor configure.",
+ "Setup Notification": "Configurar Notificação",
+ Light: "Claro",
+ Dark: "Escuro",
+ Auto: "Auto",
+ "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
+ Normal: "Normal",
+ Bottom: "Inferior",
+ None: "Nenhum",
+ Timezone: "Fuso horário",
+ "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
+ "Allow indexing": "Permitir Indexação",
+ "Discourage search engines from indexing site": "Desencorar que motores de busca indexem o site",
+ "Change Password": "Mudar senha",
+ "Current Password": "Senha atual",
+ "New Password": "Nova Senha",
+ "Repeat New Password": "Repetir Nova Senha",
+ "Update Password": "Atualizar Senha",
+ "Disable Auth": "Desativar Autenticação",
+ "Enable Auth": "Ativar Autenticação",
+ "disableauth.message1": "Tens a certeza que queres desativar a autenticação?",
+ "disableauth.message2": "Isso é para alguém que tem autenticação de terceiros em frente ao 'UpTime Kuma' como o Cloudflare Access.",
+ "Please use this option carefully!": "Por favor, utilize isso com cautela.",
+ Logout: "Deslogar",
+ Leave: "Sair",
+ "I understand, please disable": "Eu entendo, por favor desative.",
+ Confirm: "Confirmar",
+ Yes: "Sim",
+ No: "Não",
+ Username: "Usuário",
+ Password: "Senha",
+ "Remember me": "Lembre-me",
+ Login: "Autenticar",
+ "No Monitors, please": "Nenhum monitor, por favor",
+ "add one": "adicionar um",
+ "Notification Type": "Tipo de Notificação",
+ Email: "Email",
+ Test: "Testar",
+ "Certificate Info": "Info. do Certificado ",
+ "Resolver Server": "Resolver Servidor",
+ "Resource Record Type": "Tipo de registro de aplicação",
+ "Last Result": "Último resultado",
+ "Create your admin account": "Crie sua conta de admin",
+ "Repeat Password": "Repita a senha",
+ "Import Backup": "Importar Backup",
+ "Export Backup": "Exportar Backup",
+ Export: "Exportar",
+ Import: "Importar",
+ respTime: "Tempo de Resp. (ms)",
+ notAvailableShort: "N/A",
+ "Default enabled": "Padrão habilitado",
+ "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
+ Create: "Criar",
+ "Clear Data": "Limpar Dados",
+ Events: "Eventos",
+ Heartbeats: "Heartbeats",
+ "Auto Get": "Obter Automático",
+ backupDescription: "Podes fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
+ backupDescription2: "OBS: Os dados do histórico e do evento não estão incluídos.",
+ backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantenha-o com cuidado.",
+ alertNoFile: "Selecione um arquivo para importar.",
+ alertWrongFileType: "Selecione um arquivo JSON.",
+ "Clear all statistics": "Limpar todas as estatísticas",
+ "Skip existing": "Saltar existente",
+ Overwrite: "Sobrescrever",
+ Options: "Opções",
+ "Keep both": "Manter os dois",
+ "Verify Token": "Verificar Token",
+ "Setup 2FA": "Configurar 2FA",
+ "Enable 2FA": "Ativar 2FA",
+ "Disable 2FA": "Desativar 2FA",
+ "2FA Settings": "Configurações do 2FA ",
+ "Two Factor Authentication": "Autenticação e Dois Fatores",
+ Active: "Ativo",
+ Inactive: "Inativo",
+ Token: "Token",
+ "Show URI": "Mostrar URI",
+ Tags: "Tag",
+ "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
+ "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
+ "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
+ color: "cor",
+ "value (optional)": "valor (opcional)",
+ Gray: "Cinza",
+ Red: "Vermelho",
+ Orange: "Laranja",
+ Green: "Verde",
+ Blue: "Azul",
+ Indigo: "Índigo",
+ Purple: "Roxo",
+ Pink: "Rosa",
+ "Search...": "Pesquisa...",
+ "Avg. Ping": "Ping Médio.",
+ "Avg. Response": "Resposta Média. ",
+ "Status Page": "Página de Status",
+ "Status Pages": "Página de Status",
+ "Entry Page": "Página de entrada",
+ statusPageNothing: "Nada aqui, por favor, adicione um grupo ou monitor.",
+ "No Services": "Nenhum Serviço",
+ "All Systems Operational": "Todos os Serviços Operacionais",
+ "Partially Degraded Service": "Serviço parcialmente degradados",
+ "Degraded Service": "Serviço Degradado",
+ "Add Group": "Adicionar Grupo",
+ "Add a monitor": "Adicionar um monitor",
+ "Edit Status Page": "Editar Página de Status",
+ "Go to Dashboard": "Ir para o dashboard",
+ telegram: "Telegram",
+ webhook: "Webhook",
+ smtp: "Email (SMTP)",
+ discord: "Discord",
+ teams: "Microsoft Teams",
+ signal: "Signal",
+ gotify: "Gotify",
+ slack: "Slack",
+ "rocket.chat": "Rocket.chat",
+ pushover: "Pushover",
+ pushy: "Pushy",
+ octopush: "Octopush",
+ promosms: "PromoSMS",
+ lunasea: "LunaSea",
+ apprise: "Apprise (Support 50+ Notification services)",
+ pushbullet: "Pushbullet",
+ line: "Line Messenger",
+ mattermost: "Mattermost",
+};
From 2ccf1fe41b5fa4aa4235f626a6ce6673bfad7076 Mon Sep 17 00:00:00 2001
From: Mario Garrido
Date: Fri, 22 Jul 2022 15:42:38 +0100
Subject: [PATCH 058/133] fix: small changes in semantics
---
src/languages/pt-PT.js | 54 +++++++++++++++++++++---------------------
1 file changed, 27 insertions(+), 27 deletions(-)
diff --git a/src/languages/pt-PT.js b/src/languages/pt-PT.js
index ac4525694..21e68d268 100644
--- a/src/languages/pt-PT.js
+++ b/src/languages/pt-PT.js
@@ -6,24 +6,24 @@ export default {
ignoreTLSError: "Ignorar erros TLS/SSL para sites HTTPS",
upsideDownModeDescription: "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
maxRedirectDescription: "Número máximo de redirecionamentos a seguir. Define como 0 para desativar redirecionamentos.",
- acceptedStatusCodesDescription: "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
+ acceptedStatusCodesDescription: "Seleciona os códigos de status que são considerados uma resposta bem-sucedida.",
passwordNotMatchMsg: "A senha repetida não corresponde.",
notificationDescription: "Atribuir uma notificação ao (s) monitor (es) para que funcione.",
- keywordDescription: "Pesquisa a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas",
+ keywordDescription: "Pesquisa a palavra-chave em HTML simples ou resposta JSON e diferencia maiúsculas de minúsculas",
pauseDashboardHome: "Pausa",
deleteMonitorMsg: "Tens a certeza de que queres excluir este monitor?",
- deleteNotificationMsg: "Tems a certeza de que queres excluir esta notificação para todos os monitores?",
- resolverserverDescription: "A Cloudflare é o servidor padrão, podes alterar o servidor resolvedor a qualquer momento.",
- rrtypeDescription: "Seleciona o RR-Type que queres monitorar",
+ deleteNotificationMsg: "Tens a certeza de que queres excluir esta notificação para todos os monitores?",
+ resolverserverDescription: "A Cloudflare é o servidor padrão, podes alterar o servidor 'resolvedor' a qualquer momento.",
+ rrtypeDescription: "Seleciona o RR-Type que queres monitorizar",
pauseMonitorMsg: "Tens a certeza que queres fazer uma pausa?",
- enableDefaultNotificationDescription: "Para cada novo monitor, esta notificação estará activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
+ enableDefaultNotificationDescription: "Para cada monitor novo esta notificação vai estar activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
clearEventsMsg: "Tens a certeza que queres excluir todos os eventos deste monitor?",
clearHeartbeatsMsg: "Tens a certeza de que queres excluir todos os heartbeats deste monitor?",
confirmClearStatisticsMsg: "Tens a certeza que queres excluir TODAS as estatísticas?",
- importHandleDescription: "Escolha 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
- confirmImportMsg: "Tens a certeza que queres importar o backup? Certifique-se que selecionou a opção de importação correta.",
- twoFAVerifyLabel: "Insire o teu token para verificar se 2FA está a funcionar",
- tokenValidSettingsMsg: "O token é válido! Agora podes salvar as configurações 2FA.",
+ importHandleDescription: "Escolhe 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
+ confirmImportMsg: "Tens a certeza que queres importar o backup? Certifica-te que selecionaste a opção de importação correta.",
+ twoFAVerifyLabel: "Insire o teu token para verificares se o 2FA está a funcionar",
+ tokenValidSettingsMsg: "O token é válido! Agora podes salvar as configurações do 2FA.",
confirmEnableTwoFAMsg: "Tens a certeza de que queres habilitar 2FA?",
confirmDisableTwoFAMsg: "Tens a certeza de que queres desativar 2FA?",
Settings: "Configurações",
@@ -67,16 +67,16 @@ export default {
URL: "URL",
Hostname: "Hostname",
Port: "Porta",
- "Heartbeat Interval": "Intervalo de Heartbeat",
+ "Heartbeat Interval": "Intervalo de Heartbeats",
Retries: "Novas tentativas",
- "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
+ "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeats",
Advanced: "Avançado",
"Upside Down Mode": "Modo de cabeça para baixo",
"Max. Redirects": "Redirecionamento Máx.",
"Accepted Status Codes": "Status Code Aceitáveis",
Save: "Guardar",
Notifications: "Notificações",
- "Not available, please setup.": "Não disponível, por favor configure.",
+ "Not available, please setup.": "Não disponível, por favor configura.",
"Setup Notification": "Configurar Notificação",
Light: "Claro",
Dark: "Escuro",
@@ -88,7 +88,7 @@ export default {
Timezone: "Fuso horário",
"Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
"Allow indexing": "Permitir Indexação",
- "Discourage search engines from indexing site": "Desencorar que motores de busca indexem o site",
+ "Discourage search engines from indexing site": "Desencorajar que motores de busca indexem o site",
"Change Password": "Mudar senha",
"Current Password": "Senha atual",
"New Password": "Nova Senha",
@@ -98,16 +98,16 @@ export default {
"Enable Auth": "Ativar Autenticação",
"disableauth.message1": "Tens a certeza que queres desativar a autenticação?",
"disableauth.message2": "Isso é para alguém que tem autenticação de terceiros em frente ao 'UpTime Kuma' como o Cloudflare Access.",
- "Please use this option carefully!": "Por favor, utilize isso com cautela.",
- Logout: "Deslogar",
+ "Please use this option carefully!": "Por favor, utiliza esta opção com cuidado.",
+ Logout: "Logout",
Leave: "Sair",
- "I understand, please disable": "Eu entendo, por favor desative.",
+ "I understand, please disable": "Eu entendo, por favor desativa.",
Confirm: "Confirmar",
Yes: "Sim",
No: "Não",
- Username: "Usuário",
+ Username: "Utilizador",
Password: "Senha",
- "Remember me": "Lembre-me",
+ "Remember me": "Lembra-me",
Login: "Autenticar",
"No Monitors, please": "Nenhum monitor, por favor",
"add one": "adicionar um",
@@ -118,8 +118,8 @@ export default {
"Resolver Server": "Resolver Servidor",
"Resource Record Type": "Tipo de registro de aplicação",
"Last Result": "Último resultado",
- "Create your admin account": "Crie sua conta de admin",
- "Repeat Password": "Repita a senha",
+ "Create your admin account": "Cria a tua conta de admin",
+ "Repeat Password": "Repete a senha",
"Import Backup": "Importar Backup",
"Export Backup": "Exportar Backup",
Export: "Exportar",
@@ -133,11 +133,11 @@ export default {
Events: "Eventos",
Heartbeats: "Heartbeats",
"Auto Get": "Obter Automático",
- backupDescription: "Podes fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
+ backupDescription: "Podes fazer backup de todos os monitores e todas as notificações num arquivo JSON.",
backupDescription2: "OBS: Os dados do histórico e do evento não estão incluídos.",
- backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantenha-o com cuidado.",
- alertNoFile: "Selecione um arquivo para importar.",
- alertWrongFileType: "Selecione um arquivo JSON.",
+ backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantem-no com cuidado.",
+ alertNoFile: "Seleciona um arquivo para importar.",
+ alertWrongFileType: "Seleciona um arquivo JSON.",
"Clear all statistics": "Limpar todas as estatísticas",
"Skip existing": "Saltar existente",
Overwrite: "Sobrescrever",
@@ -148,7 +148,7 @@ export default {
"Enable 2FA": "Ativar 2FA",
"Disable 2FA": "Desativar 2FA",
"2FA Settings": "Configurações do 2FA ",
- "Two Factor Authentication": "Autenticação e Dois Fatores",
+ "Two Factor Authentication": "Autenticação de Dois Fatores",
Active: "Ativo",
Inactive: "Inativo",
Token: "Token",
@@ -173,7 +173,7 @@ export default {
"Status Page": "Página de Status",
"Status Pages": "Página de Status",
"Entry Page": "Página de entrada",
- statusPageNothing: "Nada aqui, por favor, adicione um grupo ou monitor.",
+ statusPageNothing: "Nada aqui, por favor, adiciona um grupo ou monitor.",
"No Services": "Nenhum Serviço",
"All Systems Operational": "Todos os Serviços Operacionais",
"Partially Degraded Service": "Serviço parcialmente degradados",
From 239611a016a85712305100818d4c7b88a14664a9 Mon Sep 17 00:00:00 2001
From: Louis Lam
Date: Fri, 22 Jul 2022 23:27:02 +0800
Subject: [PATCH 059/133] Do not set sendUrl if sendUrl is undefined
---
package-lock.json | 2 +-
server/socket-handlers/status-page-socket-handler.js | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index e64f9fa71..d76f5a948 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,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/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index 80017e7d2..16d6ee73b 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -202,7 +202,11 @@ module.exports.statusPageSocketHandler = (socket) => {
relationBean.weight = monitorOrder++;
relationBean.group_id = groupBean.id;
relationBean.monitor_id = monitor.id;
- relationBean.send_url = monitor.sendUrl;
+
+ if (monitor.sendUrl !== undefined) {
+ relationBean.send_url = monitor.sendUrl;
+ }
+
await R.store(relationBean);
}
From 0d098b0958048ccf9503049a4436b9a4f758e4d8 Mon Sep 17 00:00:00 2001
From: c0derMo
Date: Fri, 22 Jul 2022 15:47:04 +0000
Subject: [PATCH 060/133] Docker Hosts are now a table & have their own dialog
---
db/patch-add-docker-columns.sql | 13 +-
server/client.js | 20 +++
server/docker.js | 67 ++++++++
server/model/docker_host.js | 19 +++
server/model/monitor.js | 13 +-
server/server.js | 8 +-
.../socket-handlers/docker-socket-handler.js | 67 ++++++++
src/components/DockerHostDialog.vue | 160 ++++++++++++++++++
src/mixins/socket.js | 5 +
src/pages/EditMonitor.vue | 44 +++--
10 files changed, 385 insertions(+), 31 deletions(-)
create mode 100644 server/docker.js
create mode 100644 server/model/docker_host.js
create mode 100644 server/socket-handlers/docker-socket-handler.js
create mode 100644 src/components/DockerHostDialog.vue
diff --git a/db/patch-add-docker-columns.sql b/db/patch-add-docker-columns.sql
index 564756678..4cea448d7 100644
--- a/db/patch-add-docker-columns.sql
+++ b/db/patch-add-docker-columns.sql
@@ -1,13 +1,18 @@
-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
BEGIN TRANSACTION;
+CREATE TABLE docker_host (
+ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ user_id INT NOT NULL,
+ docker_daemon VARCHAR(255),
+ docker_type VARCHAR(255),
+ name VARCHAR(255)
+);
+
ALTER TABLE monitor
- ADD docker_daemon VARCHAR(255);
+ ADD docker_host INTEGER REFERENCES docker_host(id);
ALTER TABLE monitor
ADD docker_container VARCHAR(255);
-ALTER TABLE monitor
- ADD docker_type VARCHAR(255);
-
COMMIT;
diff --git a/server/client.js b/server/client.js
index f6f133d19..614038427 100644
--- a/server/client.js
+++ b/server/client.js
@@ -122,10 +122,30 @@ async function sendInfo(socket) {
});
}
+async function sendDockerHostList(socket) {
+ const timeLogger = new TimeLogger();
+
+ let result = [];
+ let list = await R.find("docker_host", " user_id = ? ", [
+ socket.userID,
+ ]);
+
+ for (let bean of list) {
+ result.push(bean.export());
+ }
+
+ io.to(socket.userID).emit("dockerHostList", result);
+
+ timeLogger.print("Send Docker Host List");
+
+ return list;
+}
+
module.exports = {
sendNotificationList,
sendImportantHeartbeatList,
sendHeartbeatList,
sendProxyList,
sendInfo,
+ sendDockerHostList
};
diff --git a/server/docker.js b/server/docker.js
new file mode 100644
index 000000000..a13236aa9
--- /dev/null
+++ b/server/docker.js
@@ -0,0 +1,67 @@
+const axios = require("axios");
+const { R } = require("redbean-node");
+const version = require("../package.json").version;
+const https = require("https");
+
+class DockerHost {
+ static async save(dockerHost, dockerHostID, userID) {
+ let bean;
+
+ if (dockerHostID) {
+ bean = await R.findOne("docker_host", " id = ? AND user_id = ? ", [ dockerHostID, userID ]);
+
+ if (!bean) {
+ throw new Error("docker host not found");
+ }
+
+ } else {
+ bean = R.dispense("docker_host");
+ }
+
+ bean.user_id = userID;
+ bean.docker_daemon = dockerHost.docker_daemon;
+ bean.docker_type = dockerHost.docker_type;
+ bean.name = dockerHost.name;
+
+ await R.store(bean);
+
+ return bean;
+ }
+
+ static async delete(dockerHostID, userID) {
+ let bean = await R.findOne("docker_host", " id = ? AND user_id = ? ", [ dockerHostID, userID ]);
+
+ if (!bean) {
+ throw new Error("docker host not found");
+ }
+
+ await R.trash(bean);
+ }
+
+ static async getAmountContainer(dockerHost) {
+ const options = {
+ url: "/containers/json?all=true",
+ headers: {
+ "Accept": "*/*",
+ "User-Agent": "Uptime-Kuma/" + version
+ },
+ httpsAgent: new https.Agent({
+ maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
+ rejectUnauthorized: false,
+ }),
+ };
+
+ if (dockerHost.docker_type === "socket") {
+ options.socketPath = dockerHost.docker_daemon;
+ } else if (dockerHost.docker_type === "tcp") {
+ options.baseURL = dockerHost.docker_daemon;
+ }
+
+ let res = await axios.request(options);
+ return res.data.length;
+ }
+}
+
+module.exports = {
+ DockerHost,
+}
\ No newline at end of file
diff --git a/server/model/docker_host.js b/server/model/docker_host.js
new file mode 100644
index 000000000..26f3035a5
--- /dev/null
+++ b/server/model/docker_host.js
@@ -0,0 +1,19 @@
+const { BeanModel } = require("redbean-node/dist/bean-model");
+
+class DockerHost extends BeanModel {
+ /**
+ * Returns an object that ready to parse to JSON
+ * @returns {Object}
+ */
+ toJSON() {
+ return {
+ id: this._id,
+ userId: this._user_id,
+ daemon: this._dockerDaemon,
+ type: this._dockerType,
+ name: this._name,
+ }
+ }
+}
+
+module.exports = DockerHost;
\ No newline at end of file
diff --git a/server/model/monitor.js b/server/model/monitor.js
index eff167c6c..373796e96 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -89,8 +89,7 @@ class Monitor extends BeanModel {
dns_last_result: this.dns_last_result,
pushToken: this.pushToken,
docker_container: this.docker_container,
- docker_daemon: this.docker_daemon,
- docker_type: this.docker_type,
+ docker_host: this.docker_host,
proxyId: this.proxy_id,
notificationIDList,
tags: tags,
@@ -471,6 +470,8 @@ 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 options = {
url: `/containers/${this.docker_container}/json`,
headers: {
@@ -483,10 +484,10 @@ class Monitor extends BeanModel {
}),
};
- if (this.docker_type === "socket") {
- options.socketPath = this.docker_daemon;
- } else if (this.docker_type === "tcp") {
- options.baseURL = this.docker_daemon;
+ if (docker_host._dockerType === "socket") {
+ options.socketPath = docker_host._dockerDaemon;
+ } else if (docker_host._dockerType === "tcp") {
+ options.baseURL = docker_host._dockerDaemon;
}
log.debug(`[${this.name}] Axios Request`);
diff --git a/server/server.js b/server/server.js
index 71a9a7b5d..1e5661482 100644
--- a/server/server.js
+++ b/server/server.js
@@ -118,13 +118,14 @@ if (config.demoMode) {
}
// Must be after io instantiation
-const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo, sendProxyList } = require("./client");
+const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo, sendProxyList, sendDockerHostList } = require("./client");
const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
const databaseSocketHandler = require("./socket-handlers/database-socket-handler");
const TwoFA = require("./2fa");
const StatusPage = require("./model/status_page");
const { cloudflaredSocketHandler, autoStart: cloudflaredAutoStart, stop: cloudflaredStop } = require("./socket-handlers/cloudflared-socket-handler");
const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler");
+const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
app.use(express.json());
@@ -665,8 +666,7 @@ let needSetup = false;
bean.dns_resolve_server = monitor.dns_resolve_server;
bean.pushToken = monitor.pushToken;
bean.docker_container = monitor.docker_container;
- bean.docker_daemon = monitor.docker_daemon;
- bean.docker_type = monitor.docker_type;
+ bean.docker_host = monitor.docker_host;
bean.proxyId = Number.isInteger(monitor.proxyId) ? monitor.proxyId : null;
bean.mqttUsername = monitor.mqttUsername;
bean.mqttPassword = monitor.mqttPassword;
@@ -1425,6 +1425,7 @@ let needSetup = false;
cloudflaredSocketHandler(socket);
databaseSocketHandler(socket);
proxySocketHandler(socket);
+ dockerSocketHandler(socket);
log.debug("server", "added all socket handlers");
@@ -1525,6 +1526,7 @@ async function afterLogin(socket, user) {
let monitorList = await server.sendMonitorList(socket);
sendNotificationList(socket);
sendProxyList(socket);
+ sendDockerHostList(socket);
await sleep(500);
diff --git a/server/socket-handlers/docker-socket-handler.js b/server/socket-handlers/docker-socket-handler.js
new file mode 100644
index 000000000..eddcd7b84
--- /dev/null
+++ b/server/socket-handlers/docker-socket-handler.js
@@ -0,0 +1,67 @@
+const { sendDockerHostList } = require("../client");
+const { checkLogin } = require("../util-server");
+const { DockerHost } = require("../docker");
+
+module.exports.dockerSocketHandler = (socket) => {
+ socket.on("addDockerHost", async (dockerHost, dockerHostID, callback) => {
+ try {
+ checkLogin(socket);
+
+ let dockerHostBean = await DockerHost.save(dockerHost, dockerHostID, socket.userID);
+ await sendDockerHostList(socket);
+
+ callback({
+ ok: true,
+ msg: "Saved",
+ id: dockerHostBean.id,
+ });
+
+ } catch (e) {
+ callback({
+ ok: false,
+ msg: e.message,
+ })
+ }
+ });
+
+ socket.on("deleteDockerHost", async (dockerHostID, callback) => {
+ try {
+ checkLogin(socket);
+
+ await DockerHost.delete(dockerHostID, socket.userID);
+ await sendDockerHostList(socket);
+
+ callback({
+ ok: true,
+ msg: "Deleted",
+ });
+
+ } catch (e) {
+ callback({
+ ok: false,
+ msg: e.message,
+ })
+ }
+ });
+
+ socket.on("testDockerHost", async (dockerHost, callback) => {
+ try {
+ checkLogin(socket);
+
+ let amount = await DockerHost.getAmountContainer(dockerHost);
+
+ callback({
+ ok: true,
+ msg: "Amount of containers: " + amount,
+ });
+
+ } catch (e) {
+ console.error(e);
+
+ callback({
+ ok: false,
+ msg: e.message,
+ })
+ }
+ })
+}
\ No newline at end of file
diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
new file mode 100644
index 000000000..e52c4ecf3
--- /dev/null
+++ b/src/components/DockerHostDialog.vue
@@ -0,0 +1,160 @@
+
+
+
+
+ {{ $t("deleteDockerHostMsg") }}
+
+
+
+
+
+
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index c54b573f3..f6de82c2b 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -39,6 +39,7 @@ export default {
uptimeList: { },
tlsInfoList: {},
notificationList: [],
+ dockerHostList: [],
statusPageListLoaded: false,
statusPageList: [],
proxyList: [],
@@ -141,6 +142,10 @@ export default {
});
});
+ socket.on("dockerHostList", (data) => {
+ this.dockerHostList = data;
+ })
+
socket.on("heartbeat", (data) => {
if (! (data.monitorID in this.heartbeatList)) {
this.heartbeatList[data.monitorID] = [];
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 600324590..5ff318bf8 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -148,25 +148,25 @@
-
+
-
-
-
+ {{ $t("Docker Host") }}
+
+ {{ $t("Not available, please setup.") }}
+
-
-
-
-
-
+
+
+
@@ -446,6 +446,7 @@
+
@@ -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 061/133] 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 062/133] 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 063/133] 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.") }}
-
+