mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-03-03 16:05:56 +00:00
Merge branch 'master' into feature/updated-gamedig-implementation
This commit is contained in:
commit
77c6638d9d
12 changed files with 163 additions and 12 deletions
4
.github/workflows/stale-bot.yml
vendored
4
.github/workflows/stale-bot.yml
vendored
|
@ -9,7 +9,7 @@ jobs:
|
||||||
stale:
|
stale:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v8
|
- uses: actions/stale@v9
|
||||||
with:
|
with:
|
||||||
stale-issue-message: |-
|
stale-issue-message: |-
|
||||||
We are clearing up our old `help`-issues and your issue has been open for 60 days with no activity.
|
We are clearing up our old `help`-issues and your issue has been open for 60 days with no activity.
|
||||||
|
@ -21,7 +21,7 @@ jobs:
|
||||||
exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,feature-request'
|
exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,feature-request'
|
||||||
exempt-issue-assignees: 'louislam'
|
exempt-issue-assignees: 'louislam'
|
||||||
operations-per-run: 200
|
operations-per-run: 200
|
||||||
- uses: actions/stale@v8
|
- uses: actions/stale@v9
|
||||||
with:
|
with:
|
||||||
stale-issue-message: |-
|
stale-issue-message: |-
|
||||||
This issue was marked as `cannot-reproduce` by a maintainer.
|
This issue was marked as `cannot-reproduce` by a maintainer.
|
||||||
|
|
|
@ -127,7 +127,7 @@ Different guidelines exist for different types of pull requests (PRs):
|
||||||
- `server/monitor-types/MONITORING_TYPE.js` is the core of each monitor.
|
- `server/monitor-types/MONITORING_TYPE.js` is the core of each monitor.
|
||||||
the `async check(...)`-function should:
|
the `async check(...)`-function should:
|
||||||
- throw an error for each fault that is detected with an actionable error message
|
- throw an error for each fault that is detected with an actionable error message
|
||||||
- in the happy-path, you should set `heartbeat.msg` to a successfull message and set `heartbeat.status = UP`
|
- in the happy-path, you should set `heartbeat.msg` to a successful message and set `heartbeat.status = UP`
|
||||||
- `server/uptime-kuma-server.js` is where the monitoring backend needs to be registered.
|
- `server/uptime-kuma-server.js` is where the monitoring backend needs to be registered.
|
||||||
*If you have an idea how we can skip this step, we would love to hear about it ^^*
|
*If you have an idea how we can skip this step, we would love to hear about it ^^*
|
||||||
- `src/pages/EditMonitor.vue` is the shared frontend users interact with.
|
- `src/pages/EditMonitor.vue` is the shared frontend users interact with.
|
||||||
|
|
11
package-lock.json
generated
11
package-lock.json
generated
|
@ -48,6 +48,7 @@
|
||||||
"knex": "^2.4.2",
|
"knex": "^2.4.2",
|
||||||
"limiter": "~2.1.0",
|
"limiter": "~2.1.0",
|
||||||
"liquidjs": "^10.7.0",
|
"liquidjs": "^10.7.0",
|
||||||
|
"marked": "^14.0.0",
|
||||||
"mitt": "~3.0.1",
|
"mitt": "~3.0.1",
|
||||||
"mongodb": "~4.17.1",
|
"mongodb": "~4.17.1",
|
||||||
"mqtt": "~4.3.7",
|
"mqtt": "~4.3.7",
|
||||||
|
@ -113,7 +114,6 @@
|
||||||
"eslint-plugin-vue": "~8.7.1",
|
"eslint-plugin-vue": "~8.7.1",
|
||||||
"favico.js": "~0.3.10",
|
"favico.js": "~0.3.10",
|
||||||
"get-port-please": "^3.1.1",
|
"get-port-please": "^3.1.1",
|
||||||
"marked": "~4.2.5",
|
|
||||||
"node-ssh": "~13.1.0",
|
"node-ssh": "~13.1.0",
|
||||||
"postcss-html": "~1.5.0",
|
"postcss-html": "~1.5.0",
|
||||||
"postcss-rtlcss": "~3.7.2",
|
"postcss-rtlcss": "~3.7.2",
|
||||||
|
@ -10631,16 +10631,15 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/marked": {
|
"node_modules/marked": {
|
||||||
"version": "4.2.12",
|
"version": "14.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
|
"resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz",
|
||||||
"integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
|
"integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==",
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"marked": "bin/marked.js"
|
"marked": "bin/marked.js"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 12"
|
"node": ">= 18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mathml-tag-names": {
|
"node_modules/mathml-tag-names": {
|
||||||
|
|
|
@ -113,6 +113,7 @@
|
||||||
"knex": "^2.4.2",
|
"knex": "^2.4.2",
|
||||||
"limiter": "~2.1.0",
|
"limiter": "~2.1.0",
|
||||||
"liquidjs": "^10.7.0",
|
"liquidjs": "^10.7.0",
|
||||||
|
"marked": "^14.0.0",
|
||||||
"mitt": "~3.0.1",
|
"mitt": "~3.0.1",
|
||||||
"mongodb": "~4.17.1",
|
"mongodb": "~4.17.1",
|
||||||
"mqtt": "~4.3.7",
|
"mqtt": "~4.3.7",
|
||||||
|
@ -178,7 +179,6 @@
|
||||||
"eslint-plugin-vue": "~8.7.1",
|
"eslint-plugin-vue": "~8.7.1",
|
||||||
"favico.js": "~0.3.10",
|
"favico.js": "~0.3.10",
|
||||||
"get-port-please": "^3.1.1",
|
"get-port-please": "^3.1.1",
|
||||||
"marked": "~4.2.5",
|
|
||||||
"node-ssh": "~13.1.0",
|
"node-ssh": "~13.1.0",
|
||||||
"postcss-html": "~1.5.0",
|
"postcss-html": "~1.5.0",
|
||||||
"postcss-rtlcss": "~3.7.2",
|
"postcss-rtlcss": "~3.7.2",
|
||||||
|
|
|
@ -4,6 +4,7 @@ const cheerio = require("cheerio");
|
||||||
const { UptimeKumaServer } = require("../uptime-kuma-server");
|
const { UptimeKumaServer } = require("../uptime-kuma-server");
|
||||||
const jsesc = require("jsesc");
|
const jsesc = require("jsesc");
|
||||||
const googleAnalytics = require("../google-analytics");
|
const googleAnalytics = require("../google-analytics");
|
||||||
|
const { marked } = require("marked");
|
||||||
|
|
||||||
class StatusPage extends BeanModel {
|
class StatusPage extends BeanModel {
|
||||||
|
|
||||||
|
@ -46,7 +47,11 @@ class StatusPage extends BeanModel {
|
||||||
*/
|
*/
|
||||||
static async renderHTML(indexHTML, statusPage) {
|
static async renderHTML(indexHTML, statusPage) {
|
||||||
const $ = cheerio.load(indexHTML);
|
const $ = cheerio.load(indexHTML);
|
||||||
const description155 = statusPage.description?.substring(0, 155) ?? "";
|
|
||||||
|
const description155 = marked(statusPage.description ?? "")
|
||||||
|
.replace(/<[^>]+>/gm, "")
|
||||||
|
.trim()
|
||||||
|
.substring(0, 155);
|
||||||
|
|
||||||
$("title").text(statusPage.title);
|
$("title").text(statusPage.title);
|
||||||
$("meta[name=description]").attr("content", description155);
|
$("meta[name=description]").attr("content", description155);
|
||||||
|
|
47
server/notification-providers/onesender.js
Normal file
47
server/notification-providers/onesender.js
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
const NotificationProvider = require("./notification-provider");
|
||||||
|
const axios = require("axios");
|
||||||
|
|
||||||
|
class Onesender extends NotificationProvider {
|
||||||
|
name = "Onesender";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||||
|
const okMsg = "Sent Successfully.";
|
||||||
|
|
||||||
|
try {
|
||||||
|
let data = {
|
||||||
|
heartbeat: heartbeatJSON,
|
||||||
|
monitor: monitorJSON,
|
||||||
|
msg,
|
||||||
|
to: notification.onesenderReceiver,
|
||||||
|
type: "text",
|
||||||
|
recipient_type: "individual",
|
||||||
|
text: {
|
||||||
|
body: msg
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (notification.onesenderTypeReceiver === "private") {
|
||||||
|
data.to = notification.onesenderReceiver + "@s.whatsapp.net";
|
||||||
|
} else {
|
||||||
|
data.recipient_type = "group";
|
||||||
|
data.to = notification.onesenderReceiver + "@g.us";
|
||||||
|
}
|
||||||
|
let config = {
|
||||||
|
headers: {
|
||||||
|
"Authorization": "Bearer " + notification.onesenderToken,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
await axios.post(notification.onesenderURL, data, config);
|
||||||
|
return okMsg;
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
this.throwGeneralAxiosError(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Onesender;
|
|
@ -64,6 +64,7 @@ const SevenIO = require("./notification-providers/sevenio");
|
||||||
const Whapi = require("./notification-providers/whapi");
|
const Whapi = require("./notification-providers/whapi");
|
||||||
const GtxMessaging = require("./notification-providers/gtx-messaging");
|
const GtxMessaging = require("./notification-providers/gtx-messaging");
|
||||||
const Cellsynt = require("./notification-providers/cellsynt");
|
const Cellsynt = require("./notification-providers/cellsynt");
|
||||||
|
const Onesender = require("./notification-providers/onesender");
|
||||||
|
|
||||||
class Notification {
|
class Notification {
|
||||||
|
|
||||||
|
@ -111,6 +112,7 @@ class Notification {
|
||||||
new Ntfy(),
|
new Ntfy(),
|
||||||
new Octopush(),
|
new Octopush(),
|
||||||
new OneBot(),
|
new OneBot(),
|
||||||
|
new Onesender(),
|
||||||
new Opsgenie(),
|
new Opsgenie(),
|
||||||
new PagerDuty(),
|
new PagerDuty(),
|
||||||
new FlashDuty(),
|
new FlashDuty(),
|
||||||
|
|
|
@ -576,6 +576,12 @@ optgroup {
|
||||||
outline: none !important;
|
outline: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.prism-editor__container {
|
||||||
|
.important {
|
||||||
|
font-weight: var(--bs-body-font-weight) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
h5.settings-subheading::after {
|
h5.settings-subheading::after {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
|
|
|
@ -135,6 +135,7 @@ export default {
|
||||||
"ntfy": "Ntfy",
|
"ntfy": "Ntfy",
|
||||||
"octopush": "Octopush",
|
"octopush": "Octopush",
|
||||||
"OneBot": "OneBot",
|
"OneBot": "OneBot",
|
||||||
|
"Onesender": "Onesender",
|
||||||
"Opsgenie": "Opsgenie",
|
"Opsgenie": "Opsgenie",
|
||||||
"PagerDuty": "PagerDuty",
|
"PagerDuty": "PagerDuty",
|
||||||
"PagerTree": "PagerTree",
|
"PagerTree": "PagerTree",
|
||||||
|
|
81
src/components/notifications/Onesender.vue
Normal file
81
src/components/notifications/Onesender.vue
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<template>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="host-onesender" class="form-label">{{ $t("Host Onesender") }}</label>
|
||||||
|
<input
|
||||||
|
id="host-onesender"
|
||||||
|
v-model="$parent.notification.onesenderURL"
|
||||||
|
type="url"
|
||||||
|
placeholder="https://xxxxxxxxxxx.com/api/v1/messages"
|
||||||
|
pattern="https?://.+"
|
||||||
|
class="form-control"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="receiver-onesender" class="form-label">{{ $t("Token Onesender") }}</label>
|
||||||
|
<HiddenInput id="receiver-onesender" v-model="$parent.notification.onesenderToken" :required="true" autocomplete="false"></HiddenInput>
|
||||||
|
<i18n-t tag="div" keypath="wayToGetOnesenderUrlandToken" class="form-text">
|
||||||
|
<a href="https://onesender.net/" target="_blank">{{ $t("here") }}</a>
|
||||||
|
</i18n-t>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="webhook-request-body" class="form-label">{{ $t("Recipient Type") }}</label>
|
||||||
|
<select
|
||||||
|
id="webhook-request-body"
|
||||||
|
v-model="$parent.notification.onesenderTypeReceiver"
|
||||||
|
class="form-select"
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<option value="private">{{ $t("Private Number") }}</option>
|
||||||
|
<option value="group">{{ $t("Group ID") }}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div v-if="$parent.notification.onesenderTypeReceiver == 'private'" class="form-text">{{ $t("privateOnesenderDesc", ['"application/json"']) }}</div>
|
||||||
|
<div v-else class="form-text">{{ $t("groupOnesenderDesc") }}</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<input
|
||||||
|
id="type-receiver-onesender"
|
||||||
|
v-model="$parent.notification.onesenderReceiver"
|
||||||
|
type="text"
|
||||||
|
placeholder="628123456789 or 628123456789-34534"
|
||||||
|
class="form-control"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<input
|
||||||
|
id="type-receiver-onesender"
|
||||||
|
v-model="computedReceiverResult"
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
disabled
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import HiddenInput from "../HiddenInput.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
HiddenInput,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
computedReceiverResult() {
|
||||||
|
let receiver = this.$parent.notification.onesenderReceiver;
|
||||||
|
return this.$parent.notification.onesenderTypeReceiver === "private" ? receiver + "@s.whatsapp.net" : receiver + "@g.us";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
textarea {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -29,6 +29,7 @@ import Nostr from "./Nostr.vue";
|
||||||
import Ntfy from "./Ntfy.vue";
|
import Ntfy from "./Ntfy.vue";
|
||||||
import Octopush from "./Octopush.vue";
|
import Octopush from "./Octopush.vue";
|
||||||
import OneBot from "./OneBot.vue";
|
import OneBot from "./OneBot.vue";
|
||||||
|
import Onesender from "./Onesender.vue";
|
||||||
import Opsgenie from "./Opsgenie.vue";
|
import Opsgenie from "./Opsgenie.vue";
|
||||||
import PagerDuty from "./PagerDuty.vue";
|
import PagerDuty from "./PagerDuty.vue";
|
||||||
import FlashDuty from "./FlashDuty.vue";
|
import FlashDuty from "./FlashDuty.vue";
|
||||||
|
@ -98,6 +99,7 @@ const NotificationFormList = {
|
||||||
"ntfy": Ntfy,
|
"ntfy": Ntfy,
|
||||||
"octopush": Octopush,
|
"octopush": Octopush,
|
||||||
"OneBot": OneBot,
|
"OneBot": OneBot,
|
||||||
|
"Onesender": Onesender,
|
||||||
"Opsgenie": Opsgenie,
|
"Opsgenie": Opsgenie,
|
||||||
"PagerDuty": PagerDuty,
|
"PagerDuty": PagerDuty,
|
||||||
"FlashDuty": FlashDuty,
|
"FlashDuty": FlashDuty,
|
||||||
|
|
|
@ -962,5 +962,13 @@
|
||||||
"threemaSenderIdentityFormat": "8 characters, usually starts with *",
|
"threemaSenderIdentityFormat": "8 characters, usually starts with *",
|
||||||
"threemaApiAuthenticationSecret": "Gateway-ID Secret",
|
"threemaApiAuthenticationSecret": "Gateway-ID Secret",
|
||||||
"threemaBasicModeInfo": "Note: This integration uses Threema Gateway in basic mode (server-based encryption). Further details can be found {0}.",
|
"threemaBasicModeInfo": "Note: This integration uses Threema Gateway in basic mode (server-based encryption). Further details can be found {0}.",
|
||||||
"apiKeysDisabledMsg": "API keys are disabled because authentication is disabled."
|
"apiKeysDisabledMsg": "API keys are disabled because authentication is disabled.",
|
||||||
|
"Host Onesender": "Host Onesender",
|
||||||
|
"Token Onesender": "Token Onesender",
|
||||||
|
"Recipient Type": "Recipient Type",
|
||||||
|
"Private Number": "Private Number",
|
||||||
|
"privateOnesenderDesc": "Make sure the number phone is valid. To send message into private number phone, ex: 628123456789",
|
||||||
|
"groupOnesenderDesc": "Make sure the GroupID is valid. To send message into Group, ex: 628123456789-342345",
|
||||||
|
"Group ID": "Group ID",
|
||||||
|
"wayToGetOnesenderUrlandToken":"You can get the URL and Token by going to the Onesender website. More info {0}"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue