mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-24 07:14:04 +00:00
Merge remote-tracking branch 'louislam/master' into feature/add-support-for-method-body-and-headers
This commit is contained in:
commit
ec4b7e4064
29 changed files with 701 additions and 223 deletions
5
.github/workflows/auto-test.yml
vendored
5
.github/workflows/auto-test.yml
vendored
|
@ -10,11 +10,12 @@ on:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
auto-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||||
node-version: [14.x, 15.x, 16.x]
|
node-version: [14.x, 15.x, 16.x]
|
||||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||||
|
|
||||||
|
|
10
README.md
10
README.md
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
It is a self-hosted monitoring tool like "Uptime Robot".
|
It is a self-hosted monitoring tool like "Uptime Robot".
|
||||||
|
|
||||||
<img src="https://louislam.net/uptimekuma/1.jpg" width="512" alt="" />
|
<img src="https://uptime.kuma.pet/img/dark.jpg" width="700" alt="" />
|
||||||
|
|
||||||
## 🥔 Live Demo
|
## 🥔 Live Demo
|
||||||
|
|
||||||
|
@ -86,9 +86,13 @@ https://github.com/louislam/uptime-kuma/projects/1
|
||||||
|
|
||||||
## 🖼 More Screenshots
|
## 🖼 More Screenshots
|
||||||
|
|
||||||
Dark Mode:
|
Light Mode:
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/1336778/128710166-908f8d88-9256-43f3-9c49-bfc2c56011d2.png" width="400" alt="" />
|
<img src="https://uptime.kuma.pet/img/light.jpg" width="512" alt="" />
|
||||||
|
|
||||||
|
Status Page:
|
||||||
|
|
||||||
|
<img src="https://user-images.githubusercontent.com/1336778/133384019-962e1120-6c3a-481f-9d07-d7df765e9ba4.png" width="512" alt="" />
|
||||||
|
|
||||||
Settings Page:
|
Settings Page:
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@ currently being supported with security updates.
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ------------------ |
|
||||||
| 1.x.x | :white_check_mark: |
|
| 1.7.X | :white_check_mark: |
|
||||||
|
| < 1.7 | ❌ |
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
Please report security issues to uptime@kuma.pet.
|
Please report security issues to uptime@kuma.pet.
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
FROM louislam/uptime-kuma:base-debian AS build
|
FROM louislam/uptime-kuma:base-debian AS build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN npm install --legacy-peer-deps && \
|
RUN npm install --legacy-peer-deps && \
|
||||||
npm run build && \
|
npm run build && \
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
FROM louislam/uptime-kuma:base-alpine AS build
|
FROM louislam/uptime-kuma:base-alpine AS build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN npm install --legacy-peer-deps && \
|
RUN npm install --legacy-peer-deps && \
|
||||||
npm run build && \
|
npm run build && \
|
||||||
|
|
438
package-lock.json
generated
438
package-lock.json
generated
|
@ -59,7 +59,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "~7.15.7",
|
"@babel/eslint-parser": "~7.15.7",
|
||||||
"@types/bootstrap": "~5.1.6",
|
"@types/bootstrap": "~5.1.6",
|
||||||
"@vitejs/plugin-legacy": "~1.5.3",
|
"@vitejs/plugin-legacy": "~1.6.1",
|
||||||
"@vitejs/plugin-vue": "~1.9.2",
|
"@vitejs/plugin-vue": "~1.9.2",
|
||||||
"@vue/compiler-sfc": "~3.2.19",
|
"@vue/compiler-sfc": "~3.2.19",
|
||||||
"core-js": "~3.18.1",
|
"core-js": "~3.18.1",
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
"stylelint": "~13.13.1",
|
"stylelint": "~13.13.1",
|
||||||
"stylelint-config-standard": "~22.0.0",
|
"stylelint-config-standard": "~22.0.0",
|
||||||
"typescript": "~4.4.3",
|
"typescript": "~4.4.3",
|
||||||
"vite": "~2.5.10"
|
"vite": "~2.6.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "14.*"
|
"node": "14.*"
|
||||||
|
@ -1685,16 +1685,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitejs/plugin-legacy": {
|
"node_modules/@vitejs/plugin-legacy": {
|
||||||
"version": "1.5.3",
|
"version": "1.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.3.tgz",
|
"resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.6.1.tgz",
|
||||||
"integrity": "sha512-/b2x6dU+BbdW7C7KWxh9kMrVzv1JlUi1ucPQpSzWUUUVJjihbG+GRlpqcvfQ0p/TnAKl2d/VecbTLByVJJHORg==",
|
"integrity": "sha512-isBi2ti+AlCZUpfA1P6L8gseltBy/qi6Rsi92aDzeL2elpwXgN4Hv/xLS2UUSSj9F0mFmxXCYPWlBPaJnlYamQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/standalone": "^7.14.9",
|
"@babel/standalone": "^7.15.7",
|
||||||
"core-js": "^3.16.0",
|
"core-js": "^3.18.1",
|
||||||
"magic-string": "^0.25.7",
|
"magic-string": "^0.25.7",
|
||||||
"regenerator-runtime": "^0.13.9",
|
"regenerator-runtime": "^0.13.9",
|
||||||
"systemjs": "^6.10.2"
|
"systemjs": "^6.10.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12.0.0"
|
"node": ">=12.0.0"
|
||||||
|
@ -3512,15 +3512,241 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/esbuild": {
|
"node_modules/esbuild": {
|
||||||
"version": "0.12.29",
|
"version": "0.13.4",
|
||||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz",
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.4.tgz",
|
||||||
"integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==",
|
"integrity": "sha512-wMA5eUwpavTBiNl+It6j8OQuKVh69l6z4DKDLzoTIqC+gChnPpcmqdA8WNHptUHRnfyML+mKEQPlW7Mybj8gHg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"esbuild": "bin/esbuild"
|
"esbuild": "bin/esbuild"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"esbuild-android-arm64": "0.13.4",
|
||||||
|
"esbuild-darwin-64": "0.13.4",
|
||||||
|
"esbuild-darwin-arm64": "0.13.4",
|
||||||
|
"esbuild-freebsd-64": "0.13.4",
|
||||||
|
"esbuild-freebsd-arm64": "0.13.4",
|
||||||
|
"esbuild-linux-32": "0.13.4",
|
||||||
|
"esbuild-linux-64": "0.13.4",
|
||||||
|
"esbuild-linux-arm": "0.13.4",
|
||||||
|
"esbuild-linux-arm64": "0.13.4",
|
||||||
|
"esbuild-linux-mips64le": "0.13.4",
|
||||||
|
"esbuild-linux-ppc64le": "0.13.4",
|
||||||
|
"esbuild-openbsd-64": "0.13.4",
|
||||||
|
"esbuild-sunos-64": "0.13.4",
|
||||||
|
"esbuild-windows-32": "0.13.4",
|
||||||
|
"esbuild-windows-64": "0.13.4",
|
||||||
|
"esbuild-windows-arm64": "0.13.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/esbuild-android-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-elDJt+jNyoHFId0/dKsuVYUPke3EcquIyUwzJCH17a3ERglN3A9aMBI5zbz+xNZ+FbaDNdpn0RaJHCFLbZX+fA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"android"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-darwin-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-zJQGyHRAdZUXlRzbN7W+7ykmEiGC+bq3Gc4GxKYjjWTgDRSEly98ym+vRNkDjXwXYD3gGzSwvH35+MiHAtWvLA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-darwin-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-r8oYvAtqSGq8HNTZCAx4TdLE7jZiGhX9ooGi5AQAey37MA6XNaP8ZNlw9OCpcgpx3ryU2WctXwIqPzkHO7a8dg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-freebsd-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-u9DRGkn09EN8+lCh6z7FKle7awi17PJRBuAKdRNgSo5ZrH/3m+mYaJK2PR2URHMpAfXiwJX341z231tSdVe3Yw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-freebsd-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-q3B2k68Uf6gfjATjcK16DqxvjqRQkHL8aPoOfj4op+lSqegdXvBacB1d8jw8PxbWJ8JHpdTLdAVUYU80kotQXA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-32": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-UUYJPHSiKAO8KoN3Ls/iZtgDLZvK5HarES96aolDPWZnq9FLx4dIHM/x2z4Rxv9IYqQ/DxlPoE2Co1UPBIYYeA==",
|
||||||
|
"cpu": [
|
||||||
|
"ia32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-+RnohAKiiUW4UHLGRkNR1AnENW1gCuDWuygEtd4jxTNPIoeC7lbXGor7rtgjj9AdUzFgOEvAXyNNX01kJ8NueQ==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-arm": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-BH5gKve4jglS7UPSsfwHSX79I5agC/lm4eKoRUEyo8lwQs89frQSRp2Xup+6SFQnxt3md5EsKcd2Dbkqeb3gPA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-+A188cAdd6QuSRxMIwRrWLjgphQA0LDAQ/ECVlrPVJwnx+1i64NjDZivoqPYLOTkSPIKntiWwMhhf0U5/RrPHQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-mips64le": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-0xkwtPaUkG5xMTFGaQPe1AadSe5QAiQuD4Gix1O9k5Xo/U8xGIkw9UFUTvfEUeu71vFb6ZgsIacfP1NLoFjWNw==",
|
||||||
|
"cpu": [
|
||||||
|
"mips64el"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-linux-ppc64le": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-E1+oJPP7A+j23GPo3CEpBhGwG1bni4B8IbTA3/3rvzjURwUMZdcN3Fhrz24rnjzdLSHmULtOE4VsbT42h1Om4Q==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-openbsd-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-xEkI1o5HYxDzbv9jSox0EsDxpwraG09SRiKKv0W8pH6O3bt+zPSlnoK7+I7Q69tkvONkpIq5n2o+c55uq0X7cw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"openbsd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-sunos-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-bjXUMcODMnB6hQicLBBmmnBl7OMDyVpFahKvHGXJfDChIi5udiIRKCmFUFIRn+AUAKVlfrofRKdyPC7kBsbvGQ==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"sunos"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-windows-32": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-z4CH07pfyVY0XF98TCsGmLxKCl0kyvshKDbdpTekW9f2d+dJqn5mmoUyWhpSVJ0SfYWJg86FoD9nMbbaMVyGdg==",
|
||||||
|
"cpu": [
|
||||||
|
"ia32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-windows-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-uVL11vORRPjocGLYam67rwFLd0LvkrHEs+JG+1oJN4UD9MQmNGZPa4gBHo6hDpF+kqRJ9kXgQSeDqUyRy0tj/Q==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/esbuild-windows-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-vA6GLvptgftRcDcWngD5cMlL4f4LbL8JjU2UMT9yJ0MT5ra6hdZNFWnOeOoEtY4GtJ6OjZ0i+81sTqhAB0fMkg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
]
|
||||||
|
},
|
||||||
"node_modules/escalade": {
|
"node_modules/escalade": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
||||||
|
@ -10066,15 +10292,15 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "2.5.10",
|
"version": "2.6.4",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.5.10.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-2.6.4.tgz",
|
||||||
"integrity": "sha512-0ObiHTi5AHyXdJcvZ67HMsDgVpjT5RehvVKv6+Q0jFZ7zDI28PF5zK9mYz2avxdA+4iJMdwCz6wnGNnn4WX5Gg==",
|
"integrity": "sha512-zNGZgjKGprdLKJ1g1taAvNt51JbGAdrAUU9hpLzgtlks+cXBxTZUsEAGEtLbF3UvlYOVAPXS8r9E9gxYAv6z+A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.12.17",
|
"esbuild": "^0.13.2",
|
||||||
"postcss": "^8.3.6",
|
"postcss": "^8.3.8",
|
||||||
"resolve": "^1.20.0",
|
"resolve": "^1.20.0",
|
||||||
"rollup": "^2.38.5"
|
"rollup": "^2.57.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"vite": "bin/vite.js"
|
"vite": "bin/vite.js"
|
||||||
|
@ -10084,6 +10310,22 @@
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"less": "*",
|
||||||
|
"sass": "*",
|
||||||
|
"stylus": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"less": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"sass": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"stylus": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vue": {
|
"node_modules/vue": {
|
||||||
|
@ -11951,16 +12193,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@vitejs/plugin-legacy": {
|
"@vitejs/plugin-legacy": {
|
||||||
"version": "1.5.3",
|
"version": "1.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.3.tgz",
|
"resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.6.1.tgz",
|
||||||
"integrity": "sha512-/b2x6dU+BbdW7C7KWxh9kMrVzv1JlUi1ucPQpSzWUUUVJjihbG+GRlpqcvfQ0p/TnAKl2d/VecbTLByVJJHORg==",
|
"integrity": "sha512-isBi2ti+AlCZUpfA1P6L8gseltBy/qi6Rsi92aDzeL2elpwXgN4Hv/xLS2UUSSj9F0mFmxXCYPWlBPaJnlYamQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/standalone": "^7.14.9",
|
"@babel/standalone": "^7.15.7",
|
||||||
"core-js": "^3.16.0",
|
"core-js": "^3.18.1",
|
||||||
"magic-string": "^0.25.7",
|
"magic-string": "^0.25.7",
|
||||||
"regenerator-runtime": "^0.13.9",
|
"regenerator-runtime": "^0.13.9",
|
||||||
"systemjs": "^6.10.2"
|
"systemjs": "^6.10.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@vitejs/plugin-vue": {
|
"@vitejs/plugin-vue": {
|
||||||
|
@ -13373,10 +13615,140 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"esbuild": {
|
"esbuild": {
|
||||||
"version": "0.12.29",
|
"version": "0.13.4",
|
||||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz",
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.4.tgz",
|
||||||
"integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==",
|
"integrity": "sha512-wMA5eUwpavTBiNl+It6j8OQuKVh69l6z4DKDLzoTIqC+gChnPpcmqdA8WNHptUHRnfyML+mKEQPlW7Mybj8gHg==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"esbuild-android-arm64": "0.13.4",
|
||||||
|
"esbuild-darwin-64": "0.13.4",
|
||||||
|
"esbuild-darwin-arm64": "0.13.4",
|
||||||
|
"esbuild-freebsd-64": "0.13.4",
|
||||||
|
"esbuild-freebsd-arm64": "0.13.4",
|
||||||
|
"esbuild-linux-32": "0.13.4",
|
||||||
|
"esbuild-linux-64": "0.13.4",
|
||||||
|
"esbuild-linux-arm": "0.13.4",
|
||||||
|
"esbuild-linux-arm64": "0.13.4",
|
||||||
|
"esbuild-linux-mips64le": "0.13.4",
|
||||||
|
"esbuild-linux-ppc64le": "0.13.4",
|
||||||
|
"esbuild-openbsd-64": "0.13.4",
|
||||||
|
"esbuild-sunos-64": "0.13.4",
|
||||||
|
"esbuild-windows-32": "0.13.4",
|
||||||
|
"esbuild-windows-64": "0.13.4",
|
||||||
|
"esbuild-windows-arm64": "0.13.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esbuild-android-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-elDJt+jNyoHFId0/dKsuVYUPke3EcquIyUwzJCH17a3ERglN3A9aMBI5zbz+xNZ+FbaDNdpn0RaJHCFLbZX+fA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-darwin-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-zJQGyHRAdZUXlRzbN7W+7ykmEiGC+bq3Gc4GxKYjjWTgDRSEly98ym+vRNkDjXwXYD3gGzSwvH35+MiHAtWvLA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-darwin-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-r8oYvAtqSGq8HNTZCAx4TdLE7jZiGhX9ooGi5AQAey37MA6XNaP8ZNlw9OCpcgpx3ryU2WctXwIqPzkHO7a8dg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-freebsd-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-u9DRGkn09EN8+lCh6z7FKle7awi17PJRBuAKdRNgSo5ZrH/3m+mYaJK2PR2URHMpAfXiwJX341z231tSdVe3Yw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-freebsd-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-q3B2k68Uf6gfjATjcK16DqxvjqRQkHL8aPoOfj4op+lSqegdXvBacB1d8jw8PxbWJ8JHpdTLdAVUYU80kotQXA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-32": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-UUYJPHSiKAO8KoN3Ls/iZtgDLZvK5HarES96aolDPWZnq9FLx4dIHM/x2z4Rxv9IYqQ/DxlPoE2Co1UPBIYYeA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-+RnohAKiiUW4UHLGRkNR1AnENW1gCuDWuygEtd4jxTNPIoeC7lbXGor7rtgjj9AdUzFgOEvAXyNNX01kJ8NueQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-arm": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-BH5gKve4jglS7UPSsfwHSX79I5agC/lm4eKoRUEyo8lwQs89frQSRp2Xup+6SFQnxt3md5EsKcd2Dbkqeb3gPA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-+A188cAdd6QuSRxMIwRrWLjgphQA0LDAQ/ECVlrPVJwnx+1i64NjDZivoqPYLOTkSPIKntiWwMhhf0U5/RrPHQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-mips64le": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-0xkwtPaUkG5xMTFGaQPe1AadSe5QAiQuD4Gix1O9k5Xo/U8xGIkw9UFUTvfEUeu71vFb6ZgsIacfP1NLoFjWNw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-linux-ppc64le": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-E1+oJPP7A+j23GPo3CEpBhGwG1bni4B8IbTA3/3rvzjURwUMZdcN3Fhrz24rnjzdLSHmULtOE4VsbT42h1Om4Q==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-openbsd-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-xEkI1o5HYxDzbv9jSox0EsDxpwraG09SRiKKv0W8pH6O3bt+zPSlnoK7+I7Q69tkvONkpIq5n2o+c55uq0X7cw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-sunos-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-bjXUMcODMnB6hQicLBBmmnBl7OMDyVpFahKvHGXJfDChIi5udiIRKCmFUFIRn+AUAKVlfrofRKdyPC7kBsbvGQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-32": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-z4CH07pfyVY0XF98TCsGmLxKCl0kyvshKDbdpTekW9f2d+dJqn5mmoUyWhpSVJ0SfYWJg86FoD9nMbbaMVyGdg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-uVL11vORRPjocGLYam67rwFLd0LvkrHEs+JG+1oJN4UD9MQmNGZPa4gBHo6hDpF+kqRJ9kXgQSeDqUyRy0tj/Q==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"esbuild-windows-arm64": {
|
||||||
|
"version": "0.13.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.4.tgz",
|
||||||
|
"integrity": "sha512-vA6GLvptgftRcDcWngD5cMlL4f4LbL8JjU2UMT9yJ0MT5ra6hdZNFWnOeOoEtY4GtJ6OjZ0i+81sTqhAB0fMkg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"escalade": {
|
"escalade": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
|
@ -18379,16 +18751,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"vite": {
|
"vite": {
|
||||||
"version": "2.5.10",
|
"version": "2.6.4",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.5.10.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-2.6.4.tgz",
|
||||||
"integrity": "sha512-0ObiHTi5AHyXdJcvZ67HMsDgVpjT5RehvVKv6+Q0jFZ7zDI28PF5zK9mYz2avxdA+4iJMdwCz6wnGNnn4WX5Gg==",
|
"integrity": "sha512-zNGZgjKGprdLKJ1g1taAvNt51JbGAdrAUU9hpLzgtlks+cXBxTZUsEAGEtLbF3UvlYOVAPXS8r9E9gxYAv6z+A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"esbuild": "^0.12.17",
|
"esbuild": "^0.13.2",
|
||||||
"fsevents": "~2.3.2",
|
"fsevents": "~2.3.2",
|
||||||
"postcss": "^8.3.6",
|
"postcss": "^8.3.8",
|
||||||
"resolve": "^1.20.0",
|
"resolve": "^1.20.0",
|
||||||
"rollup": "^2.38.5"
|
"rollup": "^2.57.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"vue": {
|
"vue": {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
"start-server-dev": "cross-env NODE_ENV=development node server/server.js",
|
"start-server-dev": "cross-env NODE_ENV=development node server/server.js",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
|
"test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
|
||||||
|
"test-with-build": "npm run build && npm test",
|
||||||
"jest": "node test/prepare-jest.js && jest",
|
"jest": "node test/prepare-jest.js && jest",
|
||||||
"tsc": "tsc",
|
"tsc": "tsc",
|
||||||
"vite-preview-dist": "vite preview --host",
|
"vite-preview-dist": "vite preview --host",
|
||||||
|
@ -98,7 +99,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "~7.15.7",
|
"@babel/eslint-parser": "~7.15.7",
|
||||||
"@types/bootstrap": "~5.1.6",
|
"@types/bootstrap": "~5.1.6",
|
||||||
"@vitejs/plugin-legacy": "~1.5.3",
|
"@vitejs/plugin-legacy": "~1.6.1",
|
||||||
"@vitejs/plugin-vue": "~1.9.2",
|
"@vitejs/plugin-vue": "~1.9.2",
|
||||||
"@vue/compiler-sfc": "~3.2.19",
|
"@vue/compiler-sfc": "~3.2.19",
|
||||||
"core-js": "~3.18.1",
|
"core-js": "~3.18.1",
|
||||||
|
@ -113,7 +114,7 @@
|
||||||
"stylelint": "~13.13.1",
|
"stylelint": "~13.13.1",
|
||||||
"stylelint-config-standard": "~22.0.0",
|
"stylelint-config-standard": "~22.0.0",
|
||||||
"typescript": "~4.4.3",
|
"typescript": "~4.4.3",
|
||||||
"vite": "~2.5.10"
|
"vite": "~2.6.4"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"verbose": true,
|
"verbose": true,
|
||||||
|
|
|
@ -199,7 +199,9 @@ class Monitor extends BeanModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (process.env.TIMELOGGER === "1") {
|
||||||
debug("Cert Info Query Time: " + (dayjs().valueOf() - certInfoStartTime) + "ms");
|
debug("Cert Info Query Time: " + (dayjs().valueOf() - certInfoStartTime) + "ms");
|
||||||
|
}
|
||||||
|
|
||||||
if (this.type === "http") {
|
if (this.type === "http") {
|
||||||
bean.status = UP;
|
bean.status = UP;
|
||||||
|
@ -563,6 +565,7 @@ class Monitor extends BeanModel {
|
||||||
const uptime = await this.calcUptime(duration, monitorID);
|
const uptime = await this.calcUptime(duration, monitorID);
|
||||||
io.to(userID).emit("uptime", monitorID, duration, uptime);
|
io.to(userID).emit("uptime", monitorID, duration, uptime);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Monitor;
|
module.exports = Monitor;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
const NotificationProvider = require("./notification-provider");
|
const NotificationProvider = require("./notification-provider");
|
||||||
const axios = require("axios");
|
const axios = require("axios");
|
||||||
|
const Slack = require("./slack");
|
||||||
|
const { setting } = require("../util-server");
|
||||||
|
const { getMonitorRelativeURL, UP, DOWN } = require("../../src/util");
|
||||||
|
|
||||||
class RocketChat extends NotificationProvider {
|
class RocketChat extends NotificationProvider {
|
||||||
|
|
||||||
|
@ -10,16 +13,17 @@ class RocketChat extends NotificationProvider {
|
||||||
try {
|
try {
|
||||||
if (heartbeatJSON == null) {
|
if (heartbeatJSON == null) {
|
||||||
let data = {
|
let data = {
|
||||||
"text": "Uptime Kuma Rocket.chat testing successful.",
|
"text": msg,
|
||||||
"channel": notification.rocketchannel,
|
"channel": notification.rocketchannel,
|
||||||
"username": notification.rocketusername,
|
"username": notification.rocketusername,
|
||||||
"icon_emoji": notification.rocketiconemo,
|
"icon_emoji": notification.rocketiconemo,
|
||||||
}
|
};
|
||||||
await axios.post(notification.rocketwebhookURL, data)
|
await axios.post(notification.rocketwebhookURL, data);
|
||||||
return okMsg;
|
return okMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
const time = heartbeatJSON["time"];
|
const time = heartbeatJSON["time"];
|
||||||
|
|
||||||
let data = {
|
let data = {
|
||||||
"text": "Uptime Kuma Alert",
|
"text": "Uptime Kuma Alert",
|
||||||
"channel": notification.rocketchannel,
|
"channel": notification.rocketchannel,
|
||||||
|
@ -28,16 +32,32 @@ class RocketChat extends NotificationProvider {
|
||||||
"attachments": [
|
"attachments": [
|
||||||
{
|
{
|
||||||
"title": "Uptime Kuma Alert *Time (UTC)*\n" + time,
|
"title": "Uptime Kuma Alert *Time (UTC)*\n" + time,
|
||||||
"title_link": notification.rocketbutton,
|
|
||||||
"text": "*Message*\n" + msg,
|
"text": "*Message*\n" + msg,
|
||||||
"color": "#32cd32"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
// Color
|
||||||
|
if (heartbeatJSON.status === DOWN) {
|
||||||
|
data.attachments[0].color = "#ff0000";
|
||||||
|
} else {
|
||||||
|
data.attachments[0].color = "#32cd32";
|
||||||
}
|
}
|
||||||
await axios.post(notification.rocketwebhookURL, data)
|
|
||||||
|
if (notification.rocketbutton) {
|
||||||
|
await Slack.deprecateURL(notification.rocketbutton);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseURL = await setting("primaryBaseURL");
|
||||||
|
|
||||||
|
if (baseURL) {
|
||||||
|
data.attachments[0].title_link = baseURL + getMonitorRelativeURL(monitorJSON.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
await axios.post(notification.rocketwebhookURL, data);
|
||||||
return okMsg;
|
return okMsg;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.throwGeneralAxiosError(error)
|
this.throwGeneralAxiosError(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,40 @@
|
||||||
const NotificationProvider = require("./notification-provider");
|
const NotificationProvider = require("./notification-provider");
|
||||||
const axios = require("axios");
|
const axios = require("axios");
|
||||||
|
const { setSettings, setting } = require("../util-server");
|
||||||
|
const { getMonitorRelativeURL } = require("../../src/util");
|
||||||
|
|
||||||
class Slack extends NotificationProvider {
|
class Slack extends NotificationProvider {
|
||||||
|
|
||||||
name = "slack";
|
name = "slack";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deprecated property notification.slackbutton
|
||||||
|
* Set it as primary base url if this is not yet set.
|
||||||
|
*/
|
||||||
|
static async deprecateURL(url) {
|
||||||
|
let currentPrimaryBaseURL = await setting("primaryBaseURL");
|
||||||
|
|
||||||
|
if (!currentPrimaryBaseURL) {
|
||||||
|
console.log("Move the url to be the primary base URL");
|
||||||
|
await setSettings("general", {
|
||||||
|
primaryBaseURL: url,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log("Already there, no need to move the primary base URL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||||
let okMsg = "Sent Successfully. ";
|
let okMsg = "Sent Successfully. ";
|
||||||
try {
|
try {
|
||||||
if (heartbeatJSON == null) {
|
if (heartbeatJSON == null) {
|
||||||
let data = {
|
let data = {
|
||||||
"text": "Uptime Kuma Slack testing successful.",
|
"text": msg,
|
||||||
"channel": notification.slackchannel,
|
"channel": notification.slackchannel,
|
||||||
"username": notification.slackusername,
|
"username": notification.slackusername,
|
||||||
"icon_emoji": notification.slackiconemo,
|
"icon_emoji": notification.slackiconemo,
|
||||||
}
|
};
|
||||||
await axios.post(notification.slackwebhookURL, data)
|
await axios.post(notification.slackwebhookURL, data);
|
||||||
return okMsg;
|
return okMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,26 +61,35 @@ class Slack extends NotificationProvider {
|
||||||
"type": "mrkdwn",
|
"type": "mrkdwn",
|
||||||
"text": "*Time (UTC)*\n" + time,
|
"text": "*Time (UTC)*\n" + time,
|
||||||
}],
|
}],
|
||||||
},
|
}],
|
||||||
{
|
};
|
||||||
|
|
||||||
|
if (notification.slackbutton) {
|
||||||
|
await Slack.deprecateURL(notification.slackbutton);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseURL = await setting("primaryBaseURL");
|
||||||
|
|
||||||
|
// Button
|
||||||
|
if (baseURL) {
|
||||||
|
data.blocks.push({
|
||||||
"type": "actions",
|
"type": "actions",
|
||||||
"elements": [
|
"elements": [{
|
||||||
{
|
|
||||||
"type": "button",
|
"type": "button",
|
||||||
"text": {
|
"text": {
|
||||||
"type": "plain_text",
|
"type": "plain_text",
|
||||||
"text": "Visit Uptime Kuma",
|
"text": "Visit Uptime Kuma",
|
||||||
},
|
},
|
||||||
"value": "Uptime-Kuma",
|
"value": "Uptime-Kuma",
|
||||||
"url": notification.slackbutton || "https://github.com/louislam/uptime-kuma",
|
"url": baseURL + getMonitorRelativeURL(monitorJSON.id),
|
||||||
},
|
|
||||||
],
|
|
||||||
}],
|
}],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
await axios.post(notification.slackwebhookURL, data)
|
|
||||||
|
await axios.post(notification.slackwebhookURL, data);
|
||||||
return okMsg;
|
return okMsg;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.throwGeneralAxiosError(error)
|
this.throwGeneralAxiosError(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -325,7 +325,7 @@ textarea.form-control {
|
||||||
.item {
|
.item {
|
||||||
display: block;
|
display: block;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
padding: 14px 15px;
|
padding: 13px 15px 10px 15px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
transition: all ease-in-out 0.15s;
|
transition: all ease-in-out 0.15s;
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ export default {
|
||||||
beatMargin: 4,
|
beatMargin: 4,
|
||||||
move: false,
|
move: false,
|
||||||
maxBeat: -1,
|
maxBeat: -1,
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
||||||
|
@ -69,12 +69,12 @@ export default {
|
||||||
if (start < 0) {
|
if (start < 0) {
|
||||||
// Add empty placeholder
|
// Add empty placeholder
|
||||||
for (let i = start; i < 0; i++) {
|
for (let i = start; i < 0; i++) {
|
||||||
placeholders.push(0);
|
placeholders.push(0)
|
||||||
}
|
}
|
||||||
start = 0;
|
start = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return placeholders.concat(this.beatList.slice(start));
|
return placeholders.concat(this.beatList.slice(start))
|
||||||
},
|
},
|
||||||
|
|
||||||
wrapStyle() {
|
wrapStyle() {
|
||||||
|
@ -84,7 +84,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
padding: `${topBottom}px ${leftRight}px`,
|
padding: `${topBottom}px ${leftRight}px`,
|
||||||
width: "100%",
|
width: "100%",
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
barStyle() {
|
barStyle() {
|
||||||
|
@ -94,12 +94,12 @@ export default {
|
||||||
return {
|
return {
|
||||||
transition: "all ease-in-out 0.25s",
|
transition: "all ease-in-out 0.25s",
|
||||||
transform: `translateX(${width}px)`,
|
transform: `translateX(${width}px)`,
|
||||||
};
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
transform: "translateX(0)",
|
transform: "translateX(0)",
|
||||||
};
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ export default {
|
||||||
height: this.beatHeight + "px",
|
height: this.beatHeight + "px",
|
||||||
margin: this.beatMargin + "px",
|
margin: this.beatMargin + "px",
|
||||||
"--hover-scale": this.hoverScale,
|
"--hover-scale": this.hoverScale,
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -120,7 +120,7 @@ export default {
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.move = false;
|
this.move = false;
|
||||||
}, 300);
|
}, 300)
|
||||||
},
|
},
|
||||||
deep: true,
|
deep: true,
|
||||||
},
|
},
|
||||||
|
@ -162,7 +162,7 @@ export default {
|
||||||
methods: {
|
methods: {
|
||||||
resize() {
|
resize() {
|
||||||
if (this.$refs.wrap) {
|
if (this.$refs.wrap) {
|
||||||
this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2));
|
this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ export default {
|
||||||
return `${this.$root.datetime(beat.time)} - ${beat.msg}`;
|
return `${this.$root.datetime(beat.time)} - ${beat.msg}`;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@ -183,9 +183,6 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
.hp-bar-big {
|
.hp-bar-big {
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
|
|
||||||
.beat {
|
.beat {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-color: $primary;
|
background-color: $primary;
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
<div class="list-header">
|
<div class="list-header">
|
||||||
<div class="placeholder"></div>
|
<div class="placeholder"></div>
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<a v-if="!searchText" class="search-icon">
|
<a v-if="searchText == ''" class="search-icon">
|
||||||
<font-awesome-icon icon="search" />
|
<font-awesome-icon icon="search" />
|
||||||
</a>
|
</a>
|
||||||
<a v-if="searchText" class="search-icon" @click="clearSearchText">
|
<a v-if="searchText != ''" class="search-icon" @click="clearSearchText">
|
||||||
<font-awesome-icon icon="times" />
|
<font-awesome-icon icon="times" />
|
||||||
</a>
|
</a>
|
||||||
<input v-model="searchText" class="form-control search-input" :placeholder="$t('Search...')" />
|
<input v-model="searchText" class="form-control search-input" :placeholder="$t('Search...')" />
|
||||||
|
@ -19,21 +19,21 @@
|
||||||
|
|
||||||
<router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
|
<router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 col-md-8 small-padding" :class="{ 'monitorItem': $root.userHeartbeatBar === 'bottom' || $root.userHeartbeatBar === 'none' }">
|
<div class="col-9 col-md-8 small-padding" :class="{ 'monitorItem': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<Uptime :monitor="item" type="24" :pill="true" />
|
<Uptime :monitor="item" type="24" :pill="true" />
|
||||||
<span class="ms-1">{{ item.name }}</span>
|
{{ item.name }}
|
||||||
</div>
|
</div>
|
||||||
<div class="tags">
|
<div class="tags">
|
||||||
<Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
|
<Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="$root.userHeartbeatBar === 'normal'" :key="$root.userHeartbeatBar" class="col-6 col-md-4 small-padding">
|
<div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
|
||||||
<HeartbeatBar size="small" :monitor-id="item.id" />
|
<HeartbeatBar size="small" :monitor-id="item.id" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="$root.userHeartbeatBar === 'bottom'" class="row">
|
<div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<HeartbeatBar size="small" :monitor-id="item.id" />
|
<HeartbeatBar size="small" :monitor-id="item.id" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -47,6 +47,7 @@
|
||||||
import HeartbeatBar from "../components/HeartbeatBar.vue";
|
import HeartbeatBar from "../components/HeartbeatBar.vue";
|
||||||
import Uptime from "../components/Uptime.vue";
|
import Uptime from "../components/Uptime.vue";
|
||||||
import Tag from "../components/Tag.vue";
|
import Tag from "../components/Tag.vue";
|
||||||
|
import { getMonitorRelativeURL } from "../util.ts";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -95,7 +96,7 @@ export default {
|
||||||
|
|
||||||
// Simple filter by search text
|
// Simple filter by search text
|
||||||
// finds monitor name, tag name or tag value
|
// finds monitor name, tag name or tag value
|
||||||
if (this.searchText) {
|
if (this.searchText != "") {
|
||||||
const loweredSearchText = this.searchText.toLowerCase();
|
const loweredSearchText = this.searchText.toLowerCase();
|
||||||
result = result.filter(monitor => {
|
result = result.filter(monitor => {
|
||||||
return monitor.name.toLowerCase().includes(loweredSearchText)
|
return monitor.name.toLowerCase().includes(loweredSearchText)
|
||||||
|
@ -109,7 +110,7 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
monitorURL(id) {
|
monitorURL(id) {
|
||||||
return "/dashboard/" + id;
|
return getMonitorRelativeURL(id);
|
||||||
},
|
},
|
||||||
clearSearchText() {
|
clearSearchText() {
|
||||||
this.searchText = "";
|
this.searchText = "";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<h4 class="mb-3">{{ $t("Tags") }}</h4>
|
<h4 class="mt-5 mb-3">{{ $t("Tags") }}</h4>
|
||||||
<div class="mb-3 p-1">
|
<div v-if="selectedTags.length > 0" class="mb-2 p-1">
|
||||||
<tag
|
<tag
|
||||||
v-for="item in selectedTags"
|
v-for="item in selectedTags"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -124,8 +124,8 @@
|
||||||
import { Modal } from "bootstrap";
|
import { Modal } from "bootstrap";
|
||||||
import VueMultiselect from "vue-multiselect";
|
import VueMultiselect from "vue-multiselect";
|
||||||
import Tag from "../components/Tag.vue";
|
import Tag from "../components/Tag.vue";
|
||||||
import { useToast } from "vue-toastification"
|
import { useToast } from "vue-toastification";
|
||||||
const toast = useToast()
|
const toast = useToast();
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -186,7 +186,7 @@ export default {
|
||||||
color: "#7C3AED" },
|
color: "#7C3AED" },
|
||||||
{ name: this.$t("Pink"),
|
{ name: this.$t("Pink"),
|
||||||
color: "#DB2777" },
|
color: "#DB2777" },
|
||||||
]
|
];
|
||||||
},
|
},
|
||||||
validateDraftTag() {
|
validateDraftTag() {
|
||||||
let nameInvalid = false;
|
let nameInvalid = false;
|
||||||
|
@ -227,7 +227,7 @@ export default {
|
||||||
invalid,
|
invalid,
|
||||||
nameInvalid,
|
nameInvalid,
|
||||||
valueInvalid,
|
valueInvalid,
|
||||||
}
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -243,7 +243,7 @@ export default {
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
this.existingTags = res.tags;
|
this.existingTags = res.tags;
|
||||||
} else {
|
} else {
|
||||||
toast.error(res.msg)
|
toast.error(res.msg);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -277,7 +277,7 @@ export default {
|
||||||
name: this.newDraftTag.select.name,
|
name: this.newDraftTag.select.name,
|
||||||
value: this.newDraftTag.value,
|
value: this.newDraftTag.value,
|
||||||
new: true,
|
new: true,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Add new Tag
|
// Add new Tag
|
||||||
|
@ -286,7 +286,7 @@ export default {
|
||||||
name: this.newDraftTag.name.trim(),
|
name: this.newDraftTag.name.trim(),
|
||||||
value: this.newDraftTag.value,
|
value: this.newDraftTag.value,
|
||||||
new: true,
|
new: true,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
this.clearDraftTag();
|
this.clearDraftTag();
|
||||||
},
|
},
|
||||||
|
@ -348,7 +348,7 @@ export default {
|
||||||
if (tag.name == newTag.name && tag.color == newTag.color) {
|
if (tag.name == newTag.name && tag.color == newTag.color) {
|
||||||
tag.id = newTagResult.id;
|
tag.id = newTagResult.id;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
} else {
|
} else {
|
||||||
tagId = newTag.id;
|
tagId = newTag.id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,33 +22,33 @@ export default {
|
||||||
return Math.round(this.$root.uptimeList[key] * 10000) / 100 + "%";
|
return Math.round(this.$root.uptimeList[key] * 10000) / 100 + "%";
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.$t("notAvailableShort");
|
return this.$t("notAvailableShort")
|
||||||
},
|
},
|
||||||
|
|
||||||
color() {
|
color() {
|
||||||
if (this.lastHeartBeat.status === 0) {
|
if (this.lastHeartBeat.status === 0) {
|
||||||
return "danger";
|
return "danger"
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.lastHeartBeat.status === 1) {
|
if (this.lastHeartBeat.status === 1) {
|
||||||
return "primary";
|
return "primary"
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.lastHeartBeat.status === 2) {
|
if (this.lastHeartBeat.status === 2) {
|
||||||
return "warning";
|
return "warning"
|
||||||
}
|
}
|
||||||
|
|
||||||
return "secondary";
|
return "secondary"
|
||||||
},
|
},
|
||||||
|
|
||||||
lastHeartBeat() {
|
lastHeartBeat() {
|
||||||
if (this.monitor.id in this.$root.lastHeartbeatList && this.$root.lastHeartbeatList[this.monitor.id]) {
|
if (this.monitor.id in this.$root.lastHeartbeatList && this.$root.lastHeartbeatList[this.monitor.id]) {
|
||||||
return this.$root.lastHeartbeatList[this.monitor.id];
|
return this.$root.lastHeartbeatList[this.monitor.id]
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: -1,
|
status: -1,
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
className() {
|
className() {
|
||||||
|
@ -59,7 +59,7 @@ export default {
|
||||||
return "";
|
return "";
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
<input id="rocket-iconemo" v-model="$parent.notification.rocketiconemo" type="text" class="form-control">
|
<input id="rocket-iconemo" v-model="$parent.notification.rocketiconemo" type="text" class="form-control">
|
||||||
<label for="rocket-channel" class="form-label">{{ $t("Channel Name") }}</label>
|
<label for="rocket-channel" class="form-label">{{ $t("Channel Name") }}</label>
|
||||||
<input id="rocket-channel-name" v-model="$parent.notification.rocketchannel" type="text" class="form-control">
|
<input id="rocket-channel-name" v-model="$parent.notification.rocketchannel" type="text" class="form-control">
|
||||||
<label for="rocket-button-url" class="form-label">{{ $t("Uptime Kuma URL") }}</label>
|
|
||||||
<input id="rocket-button" v-model="$parent.notification.rocketbutton" type="text" class="form-control">
|
|
||||||
<div class="form-text">
|
<div class="form-text">
|
||||||
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
|
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
|
||||||
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
|
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
|
||||||
|
|
|
@ -8,8 +8,7 @@
|
||||||
<input id="slack-iconemo" v-model="$parent.notification.slackiconemo" type="text" class="form-control">
|
<input id="slack-iconemo" v-model="$parent.notification.slackiconemo" type="text" class="form-control">
|
||||||
<label for="slack-channel" class="form-label">{{ $t("Channel Name") }}</label>
|
<label for="slack-channel" class="form-label">{{ $t("Channel Name") }}</label>
|
||||||
<input id="slack-channel-name" v-model="$parent.notification.slackchannel" type="text" class="form-control">
|
<input id="slack-channel-name" v-model="$parent.notification.slackchannel" type="text" class="form-control">
|
||||||
<label for="slack-button-url" class="form-label">{{ $t("Uptime Kuma URL") }}</label>
|
|
||||||
<input id="slack-button" v-model="$parent.notification.slackbutton" type="text" class="form-control">
|
|
||||||
<div class="form-text">
|
<div class="form-text">
|
||||||
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
|
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
|
||||||
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
|
<i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import { createI18n } from "vue-i18n/index";
|
import { createI18n } from "vue-i18n/index";
|
||||||
import bgBG from "./languages/bg-BG";
|
|
||||||
import daDK from "./languages/da-DK";
|
import daDK from "./languages/da-DK";
|
||||||
import deDE from "./languages/de-DE";
|
import deDE from "./languages/de-DE";
|
||||||
import en from "./languages/en";
|
import en from "./languages/en";
|
||||||
|
@ -14,6 +13,7 @@ import koKR from "./languages/ko-KR";
|
||||||
import nlNL from "./languages/nl-NL";
|
import nlNL from "./languages/nl-NL";
|
||||||
import pl from "./languages/pl";
|
import pl from "./languages/pl";
|
||||||
import ptBR from "./languages/pt-BR";
|
import ptBR from "./languages/pt-BR";
|
||||||
|
import bgBG from "./languages/bg-BG";
|
||||||
import ruRU from "./languages/ru-RU";
|
import ruRU from "./languages/ru-RU";
|
||||||
import sr from "./languages/sr";
|
import sr from "./languages/sr";
|
||||||
import srLatn from "./languages/sr-latn";
|
import srLatn from "./languages/sr-latn";
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
export default {
|
export default {
|
||||||
languageName: "Български",
|
languageName: "Български",
|
||||||
checkEverySecond: "Проверявай на всеки {0} секунди.",
|
checkEverySecond: "Ще се извършва на всеки {0} секунди.",
|
||||||
retryCheckEverySecond: "Повторен опит на всеки {0} секунди.",
|
retryCheckEverySecond: "Повторен опит на всеки {0} секунди.",
|
||||||
retriesDescription: "Максимакен брой опити преди услугата да бъде маркирана като недостъпна и да бъде изпратено известие",
|
retriesDescription: "Максимакен брой опити преди услугата да бъде маркирана като недостъпна и да бъде изпратено известие",
|
||||||
ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уебсайтове",
|
ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уебсайтове",
|
||||||
|
@ -9,19 +9,19 @@ export default {
|
||||||
acceptedStatusCodesDescription: "Изберете статус кодове, които се считат за успешен отговор.",
|
acceptedStatusCodesDescription: "Изберете статус кодове, които се считат за успешен отговор.",
|
||||||
passwordNotMatchMsg: "Повторената парола не съвпада.",
|
passwordNotMatchMsg: "Повторената парола не съвпада.",
|
||||||
notificationDescription: "Моля, задайте известието към монитор(и), за да функционира.",
|
notificationDescription: "Моля, задайте известието към монитор(и), за да функционира.",
|
||||||
keywordDescription: "Търсете ключова дума в обикновен html или JSON отговор - чувствителна е към регистъра",
|
keywordDescription: "Търси ключова дума в чист html или JSON отговор - чувствителна е към регистъра",
|
||||||
pauseDashboardHome: "Пауза",
|
pauseDashboardHome: "Пауза",
|
||||||
deleteMonitorMsg: "Наистина ли желаете да изтриете този монитор?",
|
deleteMonitorMsg: "Наистина ли желаете да изтриете този монитор?",
|
||||||
deleteNotificationMsg: "Наистина ли желаете да изтриете известието за всички монитори?",
|
deleteNotificationMsg: "Наистина ли желаете да изтриете това известяване за всички монитори?",
|
||||||
resoverserverDescription: "Cloudflare е сървърът по подразбиране, можете да промените сървъра по всяко време.",
|
resoverserverDescription: "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.",
|
||||||
rrtypeDescription: "Изберете ресурсния запис, който желаете да наблюдавате",
|
rrtypeDescription: "Изберете ресурсния запис, който желаете да наблюдавате",
|
||||||
pauseMonitorMsg: "Наистина ли желаете да поставите в режим пауза?",
|
pauseMonitorMsg: "Наистина ли желаете да поставите в режим пауза?",
|
||||||
enableDefaultNotificationDescription: "За всеки нов монитор това известие ще бъде активирано по подразбиране. Можете да изключите известието за всеки отделен монитор.",
|
enableDefaultNotificationDescription: "За всеки нов монитор това известяване ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.",
|
||||||
clearEventsMsg: "Наистина ли желаете да изтриете всички събития за този монитор?",
|
clearEventsMsg: "Наистина ли желаете да изтриете всички събития за този монитор?",
|
||||||
clearHeartbeatsMsg: "Наистина ли желаете да изтриете всички записи за честотни проверки на този монитор?",
|
clearHeartbeatsMsg: "Наистина ли желаете да изтриете всички записи за честотни проверки на този монитор?",
|
||||||
confirmClearStatisticsMsg: "Наистина ли желаете да изтриете всички статистически данни?",
|
confirmClearStatisticsMsg: "Наистина ли желаете да изтриете всички статистически данни?",
|
||||||
importHandleDescription: "Изберете 'Пропусни съществуващите', ако искате да пропуснете всеки монитор или известие със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известие.",
|
importHandleDescription: "Изберете 'Пропусни съществуващите', ако желаете да пропуснете всеки монитор или известяване със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известяване.",
|
||||||
confirmImportMsg: "Сигурни ли сте за импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
|
confirmImportMsg: "Сигурни ли сте, че желаете импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
|
||||||
twoFAVerifyLabel: "Моля, въведете вашия токен код, за да проверите дали 2FA работи",
|
twoFAVerifyLabel: "Моля, въведете вашия токен код, за да проверите дали 2FA работи",
|
||||||
tokenValidSettingsMsg: "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
|
tokenValidSettingsMsg: "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
|
||||||
confirmEnableTwoFAMsg: "Сигурни ли сте, че желаете да активирате 2FA?",
|
confirmEnableTwoFAMsg: "Сигурни ли сте, че желаете да активирате 2FA?",
|
||||||
|
@ -34,32 +34,32 @@ export default {
|
||||||
Theme: "Тема",
|
Theme: "Тема",
|
||||||
General: "Общи",
|
General: "Общи",
|
||||||
Version: "Версия",
|
Version: "Версия",
|
||||||
"Check Update On GitHub": "Провери за актуализация в GitHub",
|
"Check Update On GitHub": "Проверка за актуализация в GitHub",
|
||||||
List: "Списък",
|
List: "Списък",
|
||||||
Add: "Добави",
|
Add: "Добави",
|
||||||
"Add New Monitor": "Добави монитор",
|
"Add New Monitor": "Добави монитор",
|
||||||
"Quick Stats": "Кратка статистика",
|
"Quick Stats": "Кратка статистика",
|
||||||
Up: "Достъпни",
|
Up: "Достъпен",
|
||||||
Down: "Недостъпни",
|
Down: "Недостъпен",
|
||||||
Pending: "В изчакване",
|
Pending: "Изчаква",
|
||||||
Unknown: "Неизвестни",
|
Unknown: "Неизвестен",
|
||||||
Pause: "В пауза",
|
Pause: "Пауза",
|
||||||
Name: "Име",
|
Name: "Име",
|
||||||
Status: "Статус",
|
Status: "Статус",
|
||||||
DateTime: "Дата и час",
|
DateTime: "Дата и час",
|
||||||
Message: "Съобщение",
|
Message: "Отговор",
|
||||||
"No important events": "Няма важни събития",
|
"No important events": "Няма важни събития",
|
||||||
Resume: "Възобнови",
|
Resume: "Възобнови",
|
||||||
Edit: "Редактирай",
|
Edit: "Редактирай",
|
||||||
Delete: "Изтрий",
|
Delete: "Изтрий",
|
||||||
Current: "Текущ",
|
Current: "Текущ",
|
||||||
Uptime: "Време на работа",
|
Uptime: "Достъпност",
|
||||||
"Cert Exp.": "Вал. сертификат",
|
"Cert Exp.": "Вал. сертификат",
|
||||||
days: "дни",
|
days: "дни",
|
||||||
day: "ден",
|
day: "ден",
|
||||||
"-day": "-ден",
|
"-day": "-денa",
|
||||||
hour: "час",
|
hour: "час",
|
||||||
"-hour": "-час",
|
"-hour": "-часa",
|
||||||
Response: "Отговор",
|
Response: "Отговор",
|
||||||
Ping: "Пинг",
|
Ping: "Пинг",
|
||||||
"Monitor Type": "Монитор тип",
|
"Monitor Type": "Монитор тип",
|
||||||
|
@ -78,7 +78,7 @@ export default {
|
||||||
Save: "Запази",
|
Save: "Запази",
|
||||||
Notifications: "Известявания",
|
Notifications: "Известявания",
|
||||||
"Not available, please setup.": "Не е налично. Моля, настройте.",
|
"Not available, please setup.": "Не е налично. Моля, настройте.",
|
||||||
"Setup Notification": "Настройка за известяване",
|
"Setup Notification": "Настройки за известявания",
|
||||||
Light: "Светла",
|
Light: "Светла",
|
||||||
Dark: "Тъмна",
|
Dark: "Тъмна",
|
||||||
Auto: "Автоматично",
|
Auto: "Автоматично",
|
||||||
|
@ -98,9 +98,9 @@ export default {
|
||||||
"Disable Auth": "Изключи удостоверяване",
|
"Disable Auth": "Изключи удостоверяване",
|
||||||
"Enable Auth": "Включи удостоверяване",
|
"Enable Auth": "Включи удостоверяване",
|
||||||
Logout: "Изход от профила",
|
Logout: "Изход от профила",
|
||||||
Leave: "Напускам",
|
Leave: "Отказ",
|
||||||
"I understand, please disable": "Разбирам. Моля, изключи",
|
"I understand, please disable": "Разбирам. Моля, изключи",
|
||||||
Confirm: "Потвърди",
|
Confirm: "Потвърдете",
|
||||||
Yes: "Да",
|
Yes: "Да",
|
||||||
No: "Не",
|
No: "Не",
|
||||||
Username: "Потребител",
|
Username: "Потребител",
|
||||||
|
@ -127,7 +127,7 @@ export default {
|
||||||
"Default enabled": "Включен по подразбиране",
|
"Default enabled": "Включен по подразбиране",
|
||||||
"Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
|
"Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
|
||||||
Create: "Създай",
|
Create: "Създай",
|
||||||
"Clear Data": "Изчисти данни",
|
"Clear Data": "Изтрий данни",
|
||||||
Events: "Събития",
|
Events: "Събития",
|
||||||
Heartbeats: "Проверки",
|
Heartbeats: "Проверки",
|
||||||
"Auto Get": "Автоматияно получаване",
|
"Auto Get": "Автоматияно получаване",
|
||||||
|
@ -136,7 +136,7 @@ export default {
|
||||||
backupDescription3: "Чувствителни данни, като токен кодове за известяване, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
|
backupDescription3: "Чувствителни данни, като токен кодове за известяване, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
|
||||||
alertNoFile: "Моля, изберете файл за импортиране.",
|
alertNoFile: "Моля, изберете файл за импортиране.",
|
||||||
alertWrongFileType: "Моля, изберете JSON файл.",
|
alertWrongFileType: "Моля, изберете JSON файл.",
|
||||||
"Clear all statistics": "Изчисти всички статистики",
|
"Clear all statistics": "Изтрий цялата статистика",
|
||||||
"Skip existing": "Пропусни съществуващите",
|
"Skip existing": "Пропусни съществуващите",
|
||||||
Overwrite: "Презапиши",
|
Overwrite: "Презапиши",
|
||||||
Options: "Опции",
|
Options: "Опции",
|
||||||
|
@ -152,7 +152,7 @@ export default {
|
||||||
Token: "Токен код",
|
Token: "Токен код",
|
||||||
"Show URI": "Покажи URI",
|
"Show URI": "Покажи URI",
|
||||||
Tags: "Етикети",
|
Tags: "Етикети",
|
||||||
"Add New below or Select...": "Добави нов по-долу или избери...",
|
"Add New below or Select...": "Добавете нов по-долу или изберете...",
|
||||||
"Tag with this name already exist.": "Етикет с това име вече съществува.",
|
"Tag with this name already exist.": "Етикет с това име вече съществува.",
|
||||||
"Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
|
"Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
|
||||||
color: "цвят",
|
color: "цвят",
|
||||||
|
@ -171,12 +171,12 @@ export default {
|
||||||
"Entry Page": "Основна страница",
|
"Entry Page": "Основна страница",
|
||||||
statusPageNothing: "Все още няма нищо тук. Моля, добавете група или монитор.",
|
statusPageNothing: "Все още няма нищо тук. Моля, добавете група или монитор.",
|
||||||
"No Services": "Няма Услуги",
|
"No Services": "Няма Услуги",
|
||||||
"All Systems Operational": "Всички системи функционират",
|
"All Systems Operational": "Всички услуги са достъпни",
|
||||||
"Partially Degraded Service": "Частично влошена услуга",
|
"Partially Degraded Service": "Част от услугите са недостъпни",
|
||||||
"Degraded Service": "Влошена услуга",
|
"Degraded Service": "Всички услуги са недостъпни",
|
||||||
"Add Group": "Добави група",
|
"Add Group": "Добави група",
|
||||||
"Add a monitor": "Добави монитор",
|
"Add a monitor": "Добави монитор",
|
||||||
"Edit Status Page": "Редактирай статус страница",
|
"Edit Status Page": "Редактиране Статус страница",
|
||||||
"Go to Dashboard": "Към Таблото",
|
"Go to Dashboard": "Към Таблото",
|
||||||
telegram: "Telegram",
|
telegram: "Telegram",
|
||||||
webhook: "Webhook",
|
webhook: "Webhook",
|
||||||
|
@ -191,9 +191,9 @@ export default {
|
||||||
pushy: "Pushy",
|
pushy: "Pushy",
|
||||||
octopush: "Octopush",
|
octopush: "Octopush",
|
||||||
lunasea: "LunaSea",
|
lunasea: "LunaSea",
|
||||||
apprise: "Apprise (Support 50+ Notification services)",
|
apprise: "Apprise (Поддържа 50+ услуги за инвестяване)",
|
||||||
pushbullet: "Pushbullet",
|
pushbullet: "Pushbullet",
|
||||||
line: "Line Messenger",
|
line: "Line Messenger",
|
||||||
mattermost: "Mattermost",
|
mattermost: "Mattermost",
|
||||||
"Status Page": "Status Page",
|
"Status Page": "Статус страница",
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export default {
|
export default {
|
||||||
languageName: "Danish",
|
languageName: "Danish (Danmark)",
|
||||||
Settings: "Indstillinger",
|
Settings: "Indstillinger",
|
||||||
Dashboard: "Dashboard",
|
Dashboard: "Dashboard",
|
||||||
"New Update": "Opdatering tilgængelig",
|
"New Update": "Opdatering tilgængelig",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export default {
|
export default {
|
||||||
languageName: "German",
|
languageName: "Deutsch (Deutschland)",
|
||||||
Settings: "Einstellungen",
|
Settings: "Einstellungen",
|
||||||
Dashboard: "Dashboard",
|
Dashboard: "Dashboard",
|
||||||
"New Update": "Update Verfügbar",
|
"New Update": "Update Verfügbar",
|
||||||
|
|
|
@ -186,7 +186,7 @@ export default {
|
||||||
First: "اولین",
|
First: "اولین",
|
||||||
Last: "آخرین",
|
Last: "آخرین",
|
||||||
Info: "اطلاعات",
|
Info: "اطلاعات",
|
||||||
"Powered By": "نیرو گرفته از",
|
"Powered by": "نیرو گرفته از",
|
||||||
telegram: "Telegram",
|
telegram: "Telegram",
|
||||||
webhook: "Webhook",
|
webhook: "Webhook",
|
||||||
smtp: "Email (SMTP)",
|
smtp: "Email (SMTP)",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
export default {
|
export default {
|
||||||
languageName: "繁體中文 (香港)",
|
languageName: "繁體中文 (香港)",
|
||||||
Settings: "設定",
|
Settings: "設定",
|
||||||
Dashboard: "錶板",
|
Dashboard: "主控台",
|
||||||
"New Update": "有更新",
|
"New Update": "有更新",
|
||||||
Language: "語言",
|
Language: "語言",
|
||||||
Appearance: "外觀",
|
Appearance: "外觀",
|
||||||
|
@ -104,7 +104,7 @@ export default {
|
||||||
rrtypeDescription: "請選擇 DNS 記錄類型",
|
rrtypeDescription: "請選擇 DNS 記錄類型",
|
||||||
pauseMonitorMsg: "是否確定暫停?",
|
pauseMonitorMsg: "是否確定暫停?",
|
||||||
"Last Result": "最後結果",
|
"Last Result": "最後結果",
|
||||||
"Create your admin account": "製作你的管理員帳號",
|
"Create your admin account": "建立管理員帳號",
|
||||||
"Repeat Password": "重複密碼",
|
"Repeat Password": "重複密碼",
|
||||||
respTime: "反應時間 (ms)",
|
respTime: "反應時間 (ms)",
|
||||||
notAvailableShort: "N/A",
|
notAvailableShort: "N/A",
|
||||||
|
@ -146,43 +146,43 @@ export default {
|
||||||
importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
|
importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
|
||||||
confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
|
confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
|
||||||
"Heartbeat Retry Interval": "Heartbeat Retry Interval",
|
"Heartbeat Retry Interval": "Heartbeat Retry Interval",
|
||||||
"Import Backup": "Import Backup",
|
"Import Backup": "匯入備份",
|
||||||
"Export Backup": "Export Backup",
|
"Export Backup": "匯出備份",
|
||||||
"Skip existing": "Skip existing",
|
"Skip existing": "略過已存在的",
|
||||||
Overwrite: "Overwrite",
|
Overwrite: "覆蓋",
|
||||||
Options: "Options",
|
Options: "選項",
|
||||||
"Keep both": "Keep both",
|
"Keep both": "兩者並存",
|
||||||
Tags: "Tags",
|
Tags: "標籤",
|
||||||
"Add New below or Select...": "Add New below or Select...",
|
"Add New below or Select...": "Add New below or Select...",
|
||||||
"Tag with this name already exist.": "Tag with this name already exist.",
|
"Tag with this name already exist.": "Tag with this name already exist.",
|
||||||
"Tag with this value already exist.": "Tag with this value already exist.",
|
"Tag with this value already exist.": "Tag with this value already exist.",
|
||||||
color: "color",
|
color: "顏色",
|
||||||
"value (optional)": "value (optional)",
|
"value (optional)": "值 (非必需)",
|
||||||
Gray: "Gray",
|
Gray: "灰",
|
||||||
Red: "Red",
|
Red: "紅",
|
||||||
Orange: "Orange",
|
Orange: "橙",
|
||||||
Green: "Green",
|
Green: "綠",
|
||||||
Blue: "Blue",
|
Blue: "藍",
|
||||||
Indigo: "Indigo",
|
Indigo: "靛",
|
||||||
Purple: "Purple",
|
Purple: "紫",
|
||||||
Pink: "Pink",
|
Pink: "粉紅",
|
||||||
"Search...": "Search...",
|
"Search...": "搜尋...",
|
||||||
"Avg. Ping": "Avg. Ping",
|
"Avg. Ping": "平均反應時間",
|
||||||
"Avg. Response": "Avg. Response",
|
"Avg. Response": "平均反應時間",
|
||||||
"Entry Page": "Entry Page",
|
"Entry Page": "Entry Page",
|
||||||
statusPageNothing: "Nothing here, please add a group or a monitor.",
|
statusPageNothing: "Nothing here, please add a group or a monitor.",
|
||||||
"No Services": "No Services",
|
"No Services": "沒有服務",
|
||||||
"All Systems Operational": "All Systems Operational",
|
"All Systems Operational": "一切正常",
|
||||||
"Partially Degraded Service": "Partially Degraded Service",
|
"Partially Degraded Service": "部份服務受阻",
|
||||||
"Degraded Service": "Degraded Service",
|
"Degraded Service": "服務受阻",
|
||||||
"Add Group": "Add Group",
|
"Add Group": "新增群組",
|
||||||
"Add a monitor": "Add a monitor",
|
"Add a monitor": " 新增監測器",
|
||||||
"Edit Status Page": "Edit Status Page",
|
"Edit Status Page": "編輯 Status Page",
|
||||||
"Go to Dashboard": "Go to Dashboard",
|
"Go to Dashboard": "前往主控台",
|
||||||
"Status Page": "Status Page",
|
"Status Page": "Status Page",
|
||||||
telegram: "Telegram",
|
telegram: "Telegram",
|
||||||
webhook: "Webhook",
|
webhook: "Webhook",
|
||||||
smtp: "Email (SMTP)",
|
smtp: "電郵 (SMTP)",
|
||||||
discord: "Discord",
|
discord: "Discord",
|
||||||
teams: "Microsoft Teams",
|
teams: "Microsoft Teams",
|
||||||
signal: "Signal",
|
signal: "Signal",
|
||||||
|
@ -193,7 +193,7 @@ export default {
|
||||||
pushy: "Pushy",
|
pushy: "Pushy",
|
||||||
octopush: "Octopush",
|
octopush: "Octopush",
|
||||||
lunasea: "LunaSea",
|
lunasea: "LunaSea",
|
||||||
apprise: "Apprise (Support 50+ Notification services)",
|
apprise: "Apprise (支援 50 多種通知)",
|
||||||
pushbullet: "Pushbullet",
|
pushbullet: "Pushbullet",
|
||||||
line: "Line Messenger",
|
line: "Line Messenger",
|
||||||
mattermost: "Mattermost",
|
mattermost: "Mattermost",
|
||||||
|
|
|
@ -52,9 +52,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- General Settings -->
|
||||||
<h2 class="mt-5 mb-2">{{ $t("General") }}</h2>
|
<h2 class="mt-5 mb-2">{{ $t("General") }}</h2>
|
||||||
|
|
||||||
<form class="mb-3" @submit.prevent="saveGeneral">
|
<form class="mb-3" @submit.prevent="saveGeneral">
|
||||||
<div class="mb-3">
|
<!-- Timezone -->
|
||||||
|
<div class="mb-4">
|
||||||
<label for="timezone" class="form-label">{{ $t("Timezone") }}</label>
|
<label for="timezone" class="form-label">{{ $t("Timezone") }}</label>
|
||||||
<select id="timezone" v-model="$root.userTimezone" class="form-select">
|
<select id="timezone" v-model="$root.userTimezone" class="form-select">
|
||||||
<option value="auto">
|
<option value="auto">
|
||||||
|
@ -66,7 +69,8 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<!-- Search Engine -->
|
||||||
|
<div class="mb-4">
|
||||||
<label class="form-label">{{ $t("Search Engine Visibility") }}</label>
|
<label class="form-label">{{ $t("Search Engine Visibility") }}</label>
|
||||||
|
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
|
@ -83,7 +87,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<!-- Entry Page -->
|
||||||
|
<div class="mb-4">
|
||||||
<label class="form-label">{{ $t("Entry Page") }}</label>
|
<label class="form-label">{{ $t("Entry Page") }}</label>
|
||||||
|
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
|
@ -101,6 +106,19 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Primary Base URL -->
|
||||||
|
<div class="mb-4">
|
||||||
|
<label class="form-label" for="primaryBaseURL">Primary Base URL</label>
|
||||||
|
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input id="primaryBaseURL" v-model="settings.primaryBaseURL" class="form-control" name="primaryBaseURL" placeholder="https://" pattern="https?://.+">
|
||||||
|
<button class="btn btn-outline-primary" type="button" @click="autoGetPrimaryBaseURL">Auto Get</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-text">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button class="btn btn-primary" type="submit">
|
<button class="btn btn-primary" type="submit">
|
||||||
{{ $t("Save") }}
|
{{ $t("Save") }}
|
||||||
|
@ -109,6 +127,7 @@
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<template v-if="loaded">
|
<template v-if="loaded">
|
||||||
|
<!-- Change Password -->
|
||||||
<template v-if="! settings.disableAuth">
|
<template v-if="! settings.disableAuth">
|
||||||
<h2 class="mt-5 mb-2">{{ $t("Change Password") }}</h2>
|
<h2 class="mt-5 mb-2">{{ $t("Change Password") }}</h2>
|
||||||
<form class="mb-3" @submit.prevent="savePassword">
|
<form class="mb-3" @submit.prevent="savePassword">
|
||||||
|
@ -196,17 +215,19 @@
|
||||||
<h2 class="mt-5 mb-2">{{ $t("Advanced") }}</h2>
|
<h2 class="mt-5 mb-2">{{ $t("Advanced") }}</h2>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<button v-if="settings.disableAuth" class="btn btn-outline-primary me-1 mb-1" @click="enableAuth">{{ $t("Enable Auth") }}</button>
|
<button v-if="settings.disableAuth" class="btn btn-outline-primary me-2 mb-2" @click="enableAuth">{{ $t("Enable Auth") }}</button>
|
||||||
<button v-if="! settings.disableAuth" class="btn btn-primary me-1 mb-1" @click="confirmDisableAuth">{{ $t("Disable Auth") }}</button>
|
<button v-if="! settings.disableAuth" class="btn btn-primary me-2 mb-2" @click="confirmDisableAuth">{{ $t("Disable Auth") }}</button>
|
||||||
<button v-if="! settings.disableAuth" class="btn btn-danger me-1 mb-1" @click="$root.logout">{{ $t("Logout") }}</button>
|
<button v-if="! settings.disableAuth" class="btn btn-danger me-2 mb-2" @click="$root.logout">{{ $t("Logout") }}</button>
|
||||||
<button class="btn btn-outline-danger me-1 mb-1" @click="confirmClearStatistics">{{ $t("Clear all statistics") }}</button>
|
<button class="btn btn-outline-danger me-1 mb-1" @click="confirmClearStatistics">{{ $t("Clear all statistics") }}</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="notification-list col-md-6">
|
<div class="col-md-6">
|
||||||
<div v-if="$root.isMobile" class="mt-3" />
|
<div v-if="$root.isMobile" class="mt-3" />
|
||||||
|
|
||||||
|
<!-- Notifications -->
|
||||||
|
<div class="notification-list ">
|
||||||
<h2>{{ $t("Notifications") }}</h2>
|
<h2>{{ $t("Notifications") }}</h2>
|
||||||
<p v-if="$root.notificationList.length === 0">
|
<p v-if="$root.notificationList.length === 0">
|
||||||
{{ $t("Not available, please setup.") }}
|
{{ $t("Not available, please setup.") }}
|
||||||
|
@ -225,7 +246,9 @@
|
||||||
<button class="btn btn-primary me-2" type="button" @click="$refs.notificationDialog.show()">
|
<button class="btn btn-primary me-2" type="button" @click="$refs.notificationDialog.show()">
|
||||||
{{ $t("Setup Notification") }}
|
{{ $t("Setup Notification") }}
|
||||||
</button>
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Info -->
|
||||||
<h2 class="mt-5">{{ $t("Info") }}</h2>
|
<h2 class="mt-5">{{ $t("Info") }}</h2>
|
||||||
|
|
||||||
{{ $t("Version") }}: {{ $root.info.version }} <br />
|
{{ $t("Version") }}: {{ $root.info.version }} <br />
|
||||||
|
@ -325,7 +348,7 @@
|
||||||
<template v-else-if="$i18n.locale === 'bg-BG' ">
|
<template v-else-if="$i18n.locale === 'bg-BG' ">
|
||||||
<p>Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?</p>
|
<p>Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?</p>
|
||||||
<p>Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access.</p>
|
<p>Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access.</p>
|
||||||
<p>Моля, използвайте внимателно.</p>
|
<p>Моля, използвайте с повишено внимание.</p>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else-if="$i18n.locale === 'hu' ">
|
<template v-else-if="$i18n.locale === 'hu' ">
|
||||||
|
@ -400,7 +423,7 @@ export default {
|
||||||
|
|
||||||
"$i18n.locale"() {
|
"$i18n.locale"() {
|
||||||
localStorage.locale = this.$i18n.locale;
|
localStorage.locale = this.$i18n.locale;
|
||||||
setPageLocale()
|
setPageLocale();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -531,6 +554,10 @@ export default {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
autoGetPrimaryBaseURL() {
|
||||||
|
this.settings.primaryBaseURL = location.protocol + "//" + location.host;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -197,7 +197,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer class="mt-5 mb-4">
|
<footer class="mt-5 mb-4">
|
||||||
{{ $t("Powered By") }} <a target="_blank" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" )}}</a>
|
{{ $t("Powered by") }} <a target="_blank" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
// Backend uses the compiled file util.js
|
// Backend uses the compiled file util.js
|
||||||
// Frontend uses util.ts
|
// Frontend uses util.ts
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.genSecret = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
|
exports.getMonitorRelativeURL = exports.genSecret = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
|
||||||
const _dayjs = require("dayjs");
|
const _dayjs = require("dayjs");
|
||||||
const dayjs = _dayjs;
|
const dayjs = _dayjs;
|
||||||
exports.isDev = process.env.NODE_ENV === "development";
|
exports.isDev = process.env.NODE_ENV === "development";
|
||||||
|
@ -74,7 +74,7 @@ class TimeLogger {
|
||||||
this.startTime = dayjs().valueOf();
|
this.startTime = dayjs().valueOf();
|
||||||
}
|
}
|
||||||
print(name) {
|
print(name) {
|
||||||
if (exports.isDev) {
|
if (exports.isDev && process && process.env.TIMELOGGER === "1") {
|
||||||
console.log(name + ": " + (dayjs().valueOf() - this.startTime) + "ms");
|
console.log(name + ": " + (dayjs().valueOf() - this.startTime) + "ms");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,3 +112,7 @@ function genSecret(length = 64) {
|
||||||
return secret;
|
return secret;
|
||||||
}
|
}
|
||||||
exports.genSecret = genSecret;
|
exports.genSecret = genSecret;
|
||||||
|
function getMonitorRelativeURL(id) {
|
||||||
|
return "/dashboard/" + id;
|
||||||
|
}
|
||||||
|
exports.getMonitorRelativeURL = getMonitorRelativeURL;
|
||||||
|
|
|
@ -86,7 +86,7 @@ export class TimeLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
print(name: string) {
|
print(name: string) {
|
||||||
if (isDev) {
|
if (isDev && process && process.env.TIMELOGGER === "1") {
|
||||||
console.log(name + ": " + (dayjs().valueOf() - this.startTime) + "ms")
|
console.log(name + ": " + (dayjs().valueOf() - this.startTime) + "ms")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,3 +123,7 @@ export function genSecret(length = 64) {
|
||||||
}
|
}
|
||||||
return secret;
|
return secret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getMonitorRelativeURL(id: string) {
|
||||||
|
return "/dashboard/" + id;
|
||||||
|
}
|
||||||
|
|
|
@ -132,18 +132,18 @@ describe("Init", () => {
|
||||||
// Status Page
|
// Status Page
|
||||||
await click(page, "#entryPageNo");
|
await click(page, "#entryPageNo");
|
||||||
await click(page, "form > div > .btn[type=submit]");
|
await click(page, "form > div > .btn[type=submit]");
|
||||||
await sleep(2000);
|
await sleep(4000);
|
||||||
await newPage.goto(baseURL);
|
await newPage.goto(baseURL);
|
||||||
await sleep(3000);
|
await sleep(4000);
|
||||||
pathname = await newPage.evaluate(() => location.pathname);
|
pathname = await newPage.evaluate(() => location.pathname);
|
||||||
expect(pathname).toEqual("/status");
|
expect(pathname).toEqual("/status");
|
||||||
|
|
||||||
// Back to Dashboard
|
// Back to Dashboard
|
||||||
await click(page, "#entryPageYes");
|
await click(page, "#entryPageYes");
|
||||||
await click(page, "form > div > .btn[type=submit]");
|
await click(page, "form > div > .btn[type=submit]");
|
||||||
await sleep(2000);
|
await sleep(4000);
|
||||||
await newPage.goto(baseURL);
|
await newPage.goto(baseURL);
|
||||||
await sleep(3000);
|
await sleep(4000);
|
||||||
pathname = await newPage.evaluate(() => location.pathname);
|
pathname = await newPage.evaluate(() => location.pathname);
|
||||||
expect(pathname).toEqual("/dashboard");
|
expect(pathname).toEqual("/dashboard");
|
||||||
|
|
||||||
|
@ -151,32 +151,39 @@ describe("Init", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Change Password (wrong current password)", async () => {
|
it("Change Password (wrong current password)", async () => {
|
||||||
|
await page.goto(baseURL + "/settings");
|
||||||
|
await page.waitForSelector("#current-password");
|
||||||
|
|
||||||
await page.type("#current-password", "wrong_passw$$d");
|
await page.type("#current-password", "wrong_passw$$d");
|
||||||
await page.type("#new-password", "new_password123");
|
await page.type("#new-password", "new_password123");
|
||||||
await page.type("#repeat-new-password", "new_password123");
|
await page.type("#repeat-new-password", "new_password123");
|
||||||
|
|
||||||
|
// Save
|
||||||
await click(page, "form > div > .btn[type=submit]", 1);
|
await click(page, "form > div > .btn[type=submit]", 1);
|
||||||
await sleep(3000);
|
await sleep(4000);
|
||||||
await click(page, ".btn-danger.btn.me-1");
|
|
||||||
await sleep(2000);
|
await click(page, ".btn-danger.btn.me-2");
|
||||||
await login("admin", "new_password123");
|
await login("admin", "new_password123");
|
||||||
await sleep(2000);
|
|
||||||
let elementCount = await page.evaluate(() => document.querySelectorAll("#floatingPassword").length);
|
let elementCount = await page.evaluate(() => document.querySelectorAll("#floatingPassword").length);
|
||||||
expect(elementCount).toEqual(1);
|
expect(elementCount).toEqual(1);
|
||||||
|
|
||||||
await login("admin", "admin123");
|
await login("admin", "admin123");
|
||||||
await sleep(3000);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Change Password (wrong repeat)", async () => {
|
it("Change Password (wrong repeat)", async () => {
|
||||||
|
await page.goto(baseURL + "/settings");
|
||||||
|
await page.waitForSelector("#current-password");
|
||||||
|
|
||||||
await page.type("#current-password", "admin123");
|
await page.type("#current-password", "admin123");
|
||||||
await page.type("#new-password", "new_password123");
|
await page.type("#new-password", "new_password123");
|
||||||
await page.type("#repeat-new-password", "new_password1234567898797898");
|
await page.type("#repeat-new-password", "new_password1234567898797898");
|
||||||
|
|
||||||
await click(page, "form > div > .btn[type=submit]", 1);
|
await click(page, "form > div > .btn[type=submit]", 1);
|
||||||
await sleep(3000);
|
await sleep(4000);
|
||||||
await click(page, ".btn-danger.btn.me-1");
|
|
||||||
await sleep(2000);
|
await click(page, ".btn-danger.btn.me-2");
|
||||||
await login("admin", "new_password123");
|
await login("admin", "new_password123");
|
||||||
await sleep(2000);
|
|
||||||
let elementCount = await page.evaluate(() => document.querySelectorAll("#floatingPassword").length);
|
let elementCount = await page.evaluate(() => document.querySelectorAll("#floatingPassword").length);
|
||||||
expect(elementCount).toEqual(1);
|
expect(elementCount).toEqual(1);
|
||||||
|
|
||||||
|
@ -220,15 +227,22 @@ async function login(username, password) {
|
||||||
await input(page, "#floatingInput", username);
|
await input(page, "#floatingInput", username);
|
||||||
await input(page, "#floatingPassword", password);
|
await input(page, "#floatingPassword", password);
|
||||||
await page.click(".btn-primary[type=submit]");
|
await page.click(".btn-primary[type=submit]");
|
||||||
|
await sleep(5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function click(page, selector, elementIndex = 0) {
|
async function click(page, selector, elementIndex = 0) {
|
||||||
|
await page.waitForSelector(selector, {
|
||||||
|
timeout: 5000,
|
||||||
|
});
|
||||||
return await page.evaluate((s, i) => {
|
return await page.evaluate((s, i) => {
|
||||||
return document.querySelectorAll(s)[i].click();
|
return document.querySelectorAll(s)[i].click();
|
||||||
}, selector, elementIndex);
|
}, selector, elementIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function input(page, selector, text) {
|
async function input(page, selector, text) {
|
||||||
|
await page.waitForSelector(selector, {
|
||||||
|
timeout: 5000,
|
||||||
|
});
|
||||||
const element = await page.$(selector);
|
const element = await page.$(selector);
|
||||||
await element.click({ clickCount: 3 });
|
await element.click({ clickCount: 3 });
|
||||||
await page.keyboard.press("Backspace");
|
await page.keyboard.press("Backspace");
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
FROM ubuntu:16.04
|
FROM ubuntu:16.04
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt --yes install curl
|
||||||
|
|
||||||
# Test invalid node version, these commands install nodejs 10
|
# Test invalid node version, these commands install nodejs 10
|
||||||
RUN apt-get update
|
#RUN apt --yes install nodejs
|
||||||
RUN apt --yes install nodejs
|
|
||||||
# RUN ln -s /usr/bin/nodejs /usr/bin/node
|
# RUN ln -s /usr/bin/nodejs /usr/bin/node
|
||||||
# RUN node -v
|
# RUN node -v
|
||||||
|
|
||||||
COPY ./install.sh .
|
RUN curl -o kuma_install.sh http://git.kuma.pet/install.sh && bash kuma_install.sh local /opt/uptime-kuma 3000 0.0.0.0
|
||||||
RUN bash install.sh local /opt/uptime-kuma 3000 0.0.0.0
|
|
||||||
|
|
Loading…
Reference in a new issue