Compare commits

...

81 Commits

Author SHA1 Message Date
Donald Zou
ae160aef23 Updated ConfigParser to RawConfigParser; Updated version number
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
2025-08-02 16:54:50 +08:00
Donald Zou
85d1cc8be4 Merge pull request #833 from DaanSelen/hinakumo-patch
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Hinakumo patch
2025-07-26 02:18:40 +08:00
Velrino
8cff8d85f6 chore: update documentation links in agentModal and helpModal (#811)
LGTM!
2025-07-24 20:41:00 +02:00
DaanSelen
d7a1007f41 Merge branch 'donaldzou:main' into hinakumo-patch 2025-07-24 20:28:20 +02:00
Daan Selen
0cd2c6864e make stale compliant 2025-07-24 20:27:54 +02:00
Daan Selen
0cb46e1444 Docker file update 2025-07-24 20:23:42 +02:00
Donald Zou
cb9dfa1321 Fixed Docker system status widget issue (#832)
* Fixed Docker system status widget issue

* Build

ref: https://github.com/donaldzou/WGDashboard/issues/798
2025-07-24 19:42:41 +02:00
Donald Zou
43fd2fff2b Merge pull request #821 from NaturGamerYT/main
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Update de-de.json
2025-07-17 13:49:10 +08:00
Florian
b37c64f5a5 Update de-de.json 2025-07-16 13:55:28 +02:00
hinakumo
f1aa064b2d Made CDs more direct 2025-07-14 01:26:01 +03:00
Matias G Henschel
8abadd1070 Added PT-BR language, minor ES fix. (#817)
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
2025-07-13 21:29:43 +02:00
hinakumo
3f9d9732a0 Added build packages deps to Dockerfile 2025-07-12 09:21:29 +03:00
hinakumo
b9dc3c44a8 Change AWG repos in Dockerfile 2025-07-12 09:08:10 +03:00
DaanSelen
1483ef83d9 Added except label (#806)
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
2025-06-25 10:51:23 +02:00
Donald Zou
dbed799e20 Merge pull request #805 from DaanSelen/staleenglish
English fix
2025-06-25 16:32:28 +08:00
Daan Selen
4602b68425 English fix 2025-06-25 10:27:34 +02:00
Donald Zou
2d3eaedaa7 Update README.md
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
2025-06-24 17:20:21 +08:00
Donald Zou
4d60b21a5f Update stale.yml 2025-06-24 17:09:56 +08:00
Donald Zou
50ee8374ee Update stale.yml 2025-06-24 16:36:22 +08:00
Donald Zou
65eb23e8ce Update stale.yml 2025-06-24 16:36:13 +08:00
Donald Zou
5c76b18ddd Delete .github/workflows/stale_action 2025-06-24 16:27:05 +08:00
Donald Zou
fc6f5d2535 Create stale.yml 2025-06-24 16:26:35 +08:00
Donald Zou
6a0348e9dc Create stale_action 2025-06-24 16:15:36 +08:00
Donald Zou
90e6409b1e Update dashboard.py
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Update version number
2025-06-17 13:34:13 +08:00
Donald Zou
96b28a8e9b Update dashboard.py (#791)
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Removed `getDashboardConfiguration` from API whitelist
2025-06-16 23:01:04 +02:00
Donald Zou
a818e87e96 Merge pull request #793 from DaanSelen/delpr
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
2025-06-16 22:25:16 +08:00
DaanSelen
dc715758a6 Merge branch 'donaldzou:main' into delpr 2025-06-16 14:45:53 +02:00
Daan Selen
87069329d8 Where do these come from? 2025-06-16 14:45:23 +02:00
Daan Selen
8a380a4545 Separated tasks (again) and separate builds 2025-06-16 14:42:39 +02:00
Daan Selen
a5e18cb761 del pr running 2025-06-16 14:41:02 +02:00
DaanSelen
e9da3e7b6a streamline docker (#792) 2025-06-16 14:33:16 +02:00
Daan Selen
289fa23728 streamline 2025-06-16 14:27:12 +02:00
Donald Zou
c117ee61d5 Merge pull request #780 from donaldzou/releasetagging
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Docker release management
2025-06-05 10:55:37 +08:00
Daan
7385932e52 donald 2025-06-04 19:54:40 +02:00
Daan
cb90b69b3f Looks good! 2025-06-04 19:52:44 +02:00
Donald Zou
8d0e31872a Update README.md
Testing GitHub Action
2025-06-05 00:18:22 +08:00
Donald Zou
881925fd43 Update docker.yml 2025-06-04 23:52:51 +08:00
Donald Zou
3a2f744f0a Merge pull request #779 from DaanSelen/scanfix
Add a login to the scan
2025-06-04 23:29:55 +08:00
Daan Selen
9dc9e668c5 Add a login to the scan 2025-06-04 16:53:16 +02:00
Donald Zou
39477c8de8 Merge pull request #778 from donaldzou/DaanSelen-patch-1 2025-06-04 22:44:08 +08:00
DaanSelen
1b0bb95e81 Update docker.yml
I hate this.
2025-06-04 16:41:18 +02:00
Donald Zou
cd5a4bec52 Merge pull request #776 from donaldzou/DaanSelen-patch-4 2025-06-04 22:33:26 +08:00
Daan Selen
43070ab809 Syntax fix 2025-06-04 13:14:03 +02:00
Daan Selen
532fedbb62 Adding file 2025-06-04 13:05:35 +02:00
Daan Selen
585bf37783 THIS SHOULD BE WORKING 2025-06-04 13:04:17 +02:00
DaanSelen
cad364e407 Update docker-build.yml
Pulled out the action docs this time...
2025-06-04 11:01:38 +02:00
Donald Zou
45457c5b38 Merge pull request #775 from donaldzou/DaanSelen-patch-3 2025-06-04 16:57:28 +08:00
DaanSelen
4e9142b5be Update docker-build.yml
Its becoming not fun
2025-06-04 10:56:28 +02:00
Donald Zou
207b365d40 Merge pull request #774 from donaldzou/DaanSelen-patch-2 2025-06-04 16:45:00 +08:00
DaanSelen
1ec95a0d86 Update docker-build.yml 2025-06-04 10:42:54 +02:00
Donald Zou
db4b9ccc7a Merge pull request #773 from donaldzou/DaanSelen-patch-1 2025-06-04 16:38:37 +08:00
DaanSelen
a86d0c74d3 Update docker-build.yml 2025-06-04 10:36:42 +02:00
Donald Zou
354f4e47df Merge pull request #772 from DaanSelen/workflowclarify 2025-06-04 16:32:52 +08:00
Daan Selen
84167650b8 hotfix 2025-06-04 10:27:11 +02:00
Daan Selen
15c12a81f1 Separate stages 2025-06-04 10:12:18 +02:00
DaanSelen
249ae584c3 Merge branch 'donaldzou:main' into workflowclarify 2025-06-04 10:09:57 +02:00
DaanSelen
b04f7b2d2c Separated tasks (again) and separate builds (#771)
* Separated tasks (again) and separate builds (#8)

* Update docker-build.yml

Updated `GHCR_TOKEN` to `GITHUB_TOKEN`

---------

Co-authored-by: Donald Zou <donaldzou@live.hk>
2025-06-04 10:01:01 +02:00
Donald Zou
630ce459cb Update docker-build.yml
Updated `GHCR_TOKEN` to `GITHUB_TOKEN`
2025-06-04 15:55:22 +08:00
DaanSelen
a7a30fb282 Separated tasks (again) and separate builds (#8) 2025-06-03 15:19:11 +02:00
Donald Zou
ab5abe9bcf Merge pull request #767 from donaldzou/potential-fix-#762
Background thread terminated when iterating conf list and list changed
2025-05-31 22:52:12 +08:00
Donald Zou
7834fff541 Update dashboard.py
Potential fix for #762
2025-05-29 16:52:13 +08:00
Donald Zou
ef8849e8a9 Update README.md 2025-05-29 00:24:07 +08:00
Donald Zou
78bedf9ad6 Update README.md 2025-05-25 12:58:18 +08:00
Donald Zou
6ec757ab66 Merge pull request #759 from donaldzou/fix-pi-os-installation-issue
Update wgd.sh
2025-05-24 20:43:18 +08:00
Kármán Zsombor
7d71299c51 Add Hungarian language support (#747)
* feat(i18n): add Hungarian (Magyar) language support

* Update active_languages.json

chore: remove extra leading space from line

* Fix: relocate Hungarian (hu-hu) to correct alphabetical position
2025-05-22 23:52:59 +02:00
Donald Zou
bea37aee7f Update wgd.sh
Added `raspbian` into installation, thanks @DerPitter bringing this up at #749
2025-05-22 19:52:05 +08:00
Donald Zou
5323687ea5 Update README.md 2025-05-22 17:19:56 +08:00
Donald Zou
d1372a4c43 Update README.md 2025-05-22 17:05:25 +08:00
Donald Zou
c9249a164a Merge pull request #758 from DaanSelen/main 2025-05-22 10:00:47 +08:00
DaanSelen
6f105f2626 Updated Dutch translations (#7) 2025-05-21 09:59:40 +02:00
DaanSelen
e4c08896f4 Merge branch 'donaldzou:main' into main 2025-05-21 09:50:49 +02:00
Donald Zou
e85a0df9b7 Update README.md 2025-05-21 13:08:00 +08:00
Donald Zou
a5b7eabd97 Update README.md 2025-05-20 23:56:43 +08:00
Donald Zou
f3688431a3 Update README.md 2025-05-20 23:55:34 +08:00
Donald Zou
44e714352d Merge pull request #755 from donaldzou/fix-awg-qrcode
Fix AmneziaWG QR Code not workiing
2025-05-19 21:55:28 +08:00
Donald Zou
60da68c994 Build 2025-05-19 21:49:19 +08:00
Donald Zou
11288fac20 Update peerQRCode.vue 2025-05-19 21:44:16 +08:00
Donald Zou
fe9d373444 Delete .github/workflows/qodana_code_quality.yml 2025-05-13 20:42:29 +08:00
Donald Zou
cce31f9b0b Merge pull request #744 from donaldzou/fix-schedule-job-issue
Update dashboard.py
2025-05-11 00:14:01 +08:00
Donald Zou
ca779ed5ad Update dashboard.py
- Update Job list before every run
2025-05-11 00:09:23 +08:00
dselen
418c6bd88b Merge branch 'donaldzou:main' into main 2025-05-07 08:41:49 +02:00
67 changed files with 1123 additions and 385 deletions

View File

@@ -12,6 +12,7 @@
name: "CodeQL"
on:
workflow_dispatch:
push:
branches: [ main ]
pull_request:

View File

@@ -1,56 +0,0 @@
name: Docker Scan and Build
on:
push:
branches: [ main ]
schedule:
- cron: "0 0 * * *" # Daily at midnight UTC
workflow_dispatch:
inputs:
trigger-build:
description: 'Trigger a manual build and push'
default: 'true'
env:
DOCKER_IMAGE: donaldzou/wgdashboard
jobs:
docker_build_analyze:
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and export (multi-arch)
uses: docker/build-push-action@v6
with:
context: .
file: ./docker/Dockerfile
push: true
tags: ${{ env.DOCKER_IMAGE }}:latest
platforms: linux/amd64,linux/arm64,linux/arm/v7 #ARM v6 no longer support by go image.
- name: Docker Scout
id: docker-scout
uses: docker/scout-action@v1
with:
command: cves
image: ${{ env.DOCKER_IMAGE }}:latest
only-severities: critical,high,medium,low,unspecified
github-token: ${{ secrets.GITHUB_TOKEN }}

105
.github/workflows/docker.yml vendored Normal file
View File

@@ -0,0 +1,105 @@
name: Docker Build and Push
on:
workflow_dispatch:
push:
branches:
- 'main'
tags:
- '*'
release:
types: [ published ]
env:
DOCKERHUB_PREFIX: docker.io
GITHUB_CONTAINER_PREFIX: ghcr.io
DOCKER_IMAGE: donaldzou/wgdashboard
jobs:
docker_build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKERHUB_PREFIX }}
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.GITHUB_CONTAINER_PREFIX }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: |
- linux/amd64
- linux/arm64
- linux/arm/v7
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta by docs https://github.com/docker/metadata-action
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.DOCKERHUB_PREFIX }}/${{ env.DOCKER_IMAGE }}
${{ env.GITHUB_CONTAINER_PREFIX }}/${{ env.DOCKER_IMAGE }}
tags: |
type=ref,event=branch
type=ref,event=tag
- name: Build and export (multi-arch)
uses: docker/build-push-action@v6
with:
context: .
file: ./docker/Dockerfile
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64,linux/arm/v7
docker_scan:
if: ${{ github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
needs: docker_build
steps:
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKERHUB_PREFIX }}
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Docker Scout CVEs
uses: docker/scout-action@v1
with:
command: cves
image: ${{ env.GITHUB_CONTAINER_PREFIX }}/${{ env.DOCKER_IMAGE }}:main
only-severities: critical,high
only-fixed: true
write-comment: true
github-token: ${{ secrets.GITHUB_TOKEN }}
exit-code: true
- name: Docker Scout Compare
uses: docker/scout-action@v1
with:
command: compare
# Set to Github for maximum compat
image: ${{ env.GITHUB_CONTAINER_PREFIX }}/${{ env.DOCKER_IMAGE }}:main
to: ${{ env.GITHUB_CONTAINER_PREFIX }}/${{ env.DOCKER_IMAGE }}:latest
only-severities: critical,high
ignore-unchanged: true
github-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,28 +0,0 @@
name: Qodana
on:
workflow_dispatch:
pull_request:
push:
branches: # Specify your branches here
- main # The 'main' branch
- v4.2-dev
jobs:
qodana:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
checks: write
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
fetch-depth: 0 # a full history is required for pull request analysis
- name: 'Qodana Scan'
uses: JetBrains/qodana-action@v2024.3
with:
pr-mode: false
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN_2090978292 }}
QODANA_ENDPOINT: 'https://qodana.cloud'

26
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
#
# You can adjust the behavior by modifying this file.
# For more information, see:
# https://github.com/actions/stale
name: Mark stale issues and pull requests
on:
workflow_dispatch:
schedule:
- cron: '00 08 * * *'
jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue has not been updated for 20 days'
stale-pr-message: 'This pull request has not been updated for 20 days'
stale-issue-label: 'stale'
exempt-issue-labels: 'enhancement,ongoing'
days-before-stale: 20

1
.gitignore vendored
View File

@@ -18,6 +18,7 @@ src/db/wgdashboard.db
node_modules/**
*/proxy.js
src/static/app/proxy.js
.secrets
# Logs
logs

View File

@@ -4,27 +4,28 @@
> [!NOTE]
> **Help Wanted 🎉**: Localizing WGDashboard to other languages! If you're willing to help, please visit https://github.com/donaldzou/WGDashboard/issues/397. Many thanks!
![](https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Posters/Banner.png)
<p align="center">
<img alt="WGDashboard" src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Logos/Logo-2-Rounded-512x512.png" width="128">
</p>
<h1 align="center">WGDashboard</h1>
<h1 align="center">
<a href="https://wgdashboard.dev">WGDashboard</a>
</h1>
<p align="center">
<img src="https://forthebadge.com/images/badges/made-with-python.svg">
<img src="https://forthebadge.com/images/badges/made-with-javascript.svg">
<img src="https://forthebadge.com/images/badges/license-mit.svg">
</p>
<p align="center">
<img src="https://forthebadge.com/images/badges/built-with-love.svg">
<img src="https://img.shields.io/badge/Made_With-Python-blue?style=for-the-badge&logo=python&logoColor=ffffff">
<img src="https://img.shields.io/badge/Made_With-Vue.js-42b883?style=for-the-badge&logo=vuedotjs&logoColor=ffffff">
<img src="https://img.shields.io/badge/License-Apache_License_2.0-D22128?style=for-the-badge&logo=apache&logoColor=ffffff">
</p>
<p align="center">
<a href="https://github.com/donaldzou/wireguard-dashboard/releases/latest"><img src="https://img.shields.io/github/v/release/donaldzou/wireguard-dashboard"></a>
<a href="https://wakatime.com/badge/github/donaldzou/WGDashboard"><img src="https://wakatime.com/badge/github/donaldzou/WGDashboard.svg" alt="wakatime"></a>
<a href="https://hitscounter.dev"><img src="https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Fdonaldzou%2FWGDashboard&label=Visitor&icon=github&color=%230a58ca"></a>
<img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff">
<a href="https://github.com/donaldzou/wireguard-dashboard/releases/latest"><img src="https://img.shields.io/github/v/release/donaldzou/wireguard-dashboard?style=for-the-badge"></a>
<a href="https://wakatime.com/badge/github/donaldzou/WGDashboard"><img src="https://wakatime.com/badge/github/donaldzou/WGDashboard.svg?style=for-the-badge" alt="wakatime"></a>
<a href="https://hitscounter.dev"><img src="https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Fdonaldzou%2FWGDashboard&label=Visitor&icon=github&color=%230a58ca&style=for-the-badge"></a>
<img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff&style=for-the-badge">
</p>
<p align="center"><b>This project is supported by</b></p>
<p align="center">
@@ -37,43 +38,40 @@
<p align="center"><b><i>This project is not affiliate to the official WireGuard Project</i></b></p>
<h3 align="center">Looking for help or want to chat about this project?</h4>
<p align="center">
Join our Discord Server for quick help, or you wanna chat about this project!
You can reach out at
</p>
<p align="center">
<a align="center" href="https://discord.gg/72TwzjeuWm"><img src="https://img.shields.io/discord/1276818723637956628?labelColor=ffffff&style=for-the-badge&logo=discord&label=Discord"></a>
<a align="center" href="https://discord.gg/72TwzjeuWm" target="_blank"><img src="https://img.shields.io/discord/1276818723637956628?labelColor=ffffff&style=for-the-badge&logo=discord&label=Discord"></a>
<a align="center" href="https://www.reddit.com/r/WGDashboard/" target="_blank"><img src="https://img.shields.io/badge/Reddit-r%2FWGDashboard-FF4500?style=for-the-badge&logo=reddit"></a>
<a align="center" href="https://app.element.io/#/room/#wgd:matrix.org" target="_blank"><img src="https://img.shields.io/badge/Matrix_Chatroom-%23WGD-000000?style=for-the-badge&logo=matrix"></a>
</p>
<h3 align="center">Want to support this project?</h4>
<p align="center">
You can support via <br>
</p>
<p align="center">
Alternatively, you can also reach out at our Matrix.org Chatroom :)
</p>
<p align="center">
<a href="https://app.element.io/#/room/#wgd:matrix.org">Matrix.org Chatroom</a>
<a align="center" href="https://github.com/sponsors/donaldzou" target="_blank"><img src="https://img.shields.io/badge/GitHub%20Sponsor-2e9a40?style=for-the-badge&logo=github"></a>
<a align="center" href="https://buymeacoffee.com/donaldzou" target="_blank"><img src="https://img.shields.io/badge/Buy%20me%20a%20coffee-ffdd00?style=for-the-badge&logo=buymeacoffee&logoColor=000000"></a>
<a align="center" href="https://patreon.com/c/DonaldDonnyZou/membership" target="_blank"><img src="https://img.shields.io/badge/Patreon-000000?style=for-the-badge&logo=patreon&logoColor=ffffff"></a>
</p>
<p align="center">
<b>or, visit our merch store and support us by purchasing a merch for only $USD 17.00 (Including shipping worldwide & duties)</b>
</p>
<p align="center">
<a align="center" href="https://merch.wgdashboard.dev" target="_blank"><img src="https://img.shields.io/badge/Merch%20from%20WGDashboard-926183?style=for-the-badge"></a>
</p>
<hr>
<h4 align="center">
for more information, visit our
</h4>
<h1 align="center">
<a href="https://wgdashboard.dev">Official Website</a>
</h1>
# [Demo](https://wgd-demo.donaldzou.dev)
If you would like to try out WGDashboard, feel free to access the link above. You won't be able to actually connect it with WireGuard since I blocked all Post/Pre script.
Username: `admin`
Password: `admin`
> **Please don't abuse server 🥺, and do not put any personal information on it.** If you can't access it, [please let me know here](https://github.com/donaldzou/WGDashboard/issues/695).
<hr>
# [Official Documentation](https://donaldzou.dev/WGDashboard-Documentations)
- [💡 Features](https://donaldzou.github.io/WGDashboard-Documentation/features.html)
- [📝 Requirements](https://donaldzou.github.io/WGDashboard-Documentation/requirements.html)
- [🛠 Install](https://donaldzou.github.io/WGDashboard-Documentation/install.html)
- [🐬 Docker Solutions](https://github.com/donaldzou/WGDashboard/tree/main/docker)
- [🪜 Usage](https://donaldzou.github.io/WGDashboard-Documentation/usage.html)
- [📖 API Documentation](https://donaldzou.github.io/WGDashboard-Documentation/api-documentation.html)
- [And much more...](https://donaldzou.github.io/WGDashboard-Documentation/)
# Screenshots
@@ -86,4 +84,4 @@ Password: `admin`
<img src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Documentation%20Images/configuration.png" alt=""/>
<img src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Documentation%20Images/add-peers.png" alt="" />
<img src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Documentation%20Images/ping.png" alt=""/>
<img src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Documentation%20Images/traceroute.png" alt=""/>
<img src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Documentation%20Images/traceroute.png" alt=""/>

View File

@@ -1,24 +1,30 @@
FROM golang:1.24 AS awg
FROM golang:1.24 AS awg-go
RUN git clone https://github.com/amnezia-vpn/amneziawg-go /awg
RUN git clone https://github.com/WGDashboard/amneziawg-go /awg
WORKDIR /awg
RUN go mod download && \
go mod verify && \
go build -ldflags '-linkmode external -extldflags "-fno-PIC -static"' -v -o /usr/bin
FROM alpine:latest AS awg-tools
RUN apk update && apk add --no-cache \
make git build-base linux-headers \
&& git clone https://github.com/WGDashboard/amneziawg-tools \
&& cd amneziawg-tools/src \
&& make \
&& chmod +x wg*
FROM alpine:latest
LABEL maintainer="dselen@nerthus.nl"
RUN apk update && apk add \
RUN apk update && apk add --no-cache \
iproute2 iptables bash curl wget unzip procps sudo \
tzdata wireguard-tools python3 py3-psutil py3-bcrypt openresolv \
&& cd /usr/bin/ \
&& wget $(curl -s https://api.github.com/repos/amnezia-vpn/amneziawg-tools/releases/latest | grep 'alpine' | cut -d : -f 2,3 | tr -d '", ' | tail -n 1) \
&& unzip -j alpine-3.19-amneziawg-tools.zip \
&& chmod +x /usr/bin/awg /usr/bin/awg-quick \
&& rm alpine-3.19-amneziawg-tools.zip
tzdata wireguard-tools python3 py3-psutil py3-bcrypt openresolv
COPY --from=awg /usr/bin/amneziawg-go /usr/bin/amneziawg-go
COPY --from=awg-go /usr/bin/amneziawg-go /usr/bin/amneziawg-go
COPY --from=awg-tools /amneziawg-tools/src/wg /usr/bin/awg
COPY --from=awg-tools /amneziawg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick
# Declaring environment variables, change Peernet to an address you like, standard is a 24 bit subnet.
ARG wg_net="10.0.0.1" \

View File

@@ -25,7 +25,7 @@ from modules.PeerJob import PeerJob
from modules.SystemStatus import SystemStatus
SystemStatus = SystemStatus()
DASHBOARD_VERSION = 'v4.2.3'
DASHBOARD_VERSION = 'v4.2.5'
CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.')
DB_PATH = os.path.join(CONFIGURATION_PATH, 'db')
@@ -180,6 +180,7 @@ class PeerJobs:
def runJob(self):
needToDelete = []
self.__getJobs()
for job in self.Jobs:
c = WireguardConfigurations.get(job.Configuration)
if c is not None:
@@ -1764,7 +1765,7 @@ class DashboardConfig:
def __init__(self):
if not os.path.exists(DASHBOARD_CONF):
open(DASHBOARD_CONF, "x")
self.__config = configparser.ConfigParser(strict=False)
self.__config = configparser.RawConfigParser(strict=False)
self.__config.read_file(open(DASHBOARD_CONF, "r+"))
self.hiddenAttribute = ["totp_key", "auth_req"]
self.__default = {
@@ -2050,7 +2051,7 @@ def auth_req():
else:
DashboardConfig.APIAccessed = False
whiteList = [
'/static/', 'validateAuthentication', 'authenticate', 'getDashboardConfiguration',
'/static/', 'validateAuthentication', 'authenticate',
'getDashboardTheme', 'getDashboardVersion', 'sharePeer/get', 'isTotpEnabled', 'locale',
'/fileDownload'
]
@@ -2381,7 +2382,7 @@ def API_updateDashboardConfigurationItem():
valid, msg = DashboardConfig.SetConfig(
data["section"], data["key"], data['value'])
if not valid:
return ResponseObject(False, msg, status_code=404)
return ResponseObject(False, msg)
if data['section'] == "Server":
if data['key'] == 'wg_conf_path':
WireguardConfigurations.clear()
@@ -3114,16 +3115,19 @@ def peerInformationBackgroundThread():
time.sleep(10)
while True:
with app.app_context():
for c in WireguardConfigurations.values():
if c.getStatus():
try:
c.getPeersTransfer()
c.getPeersLatestHandshake()
c.getPeersEndpoint()
c.getPeersList()
c.getRestrictedPeersList()
except Exception as e:
print(f"[WGDashboard] Background Thread #1 Error: {str(e)}", flush=True)
try:
curKeys = list(WireguardConfigurations.keys())
for name in curKeys:
if name in WireguardConfigurations.keys() and WireguardConfigurations.get(name) is not None:
c = WireguardConfigurations.get(name)
if c.getStatus():
c.getPeersTransfer()
c.getPeersLatestHandshake()
c.getPeersEndpoint()
c.getPeersList()
c.getRestrictedPeersList()
except Exception as e:
print(f"[WGDashboard] Background Thread #1 Error: {str(e)}", flush=True)
time.sleep(10)
def peerJobScheduleBackgroundThread():

View File

@@ -1 +1 @@
import{_ as r,c as i,d as o,w as e,k as l,a as t,j as _,i as a,l as d,S as u}from"./index-CTj5x065.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(k,x,h,w,$,v){const n=l("RouterView");return t(),i("div",p,[o(n,null,{default:e(({Component:s,route:c})=>[o(_,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),a(u,null,{default:e(()=>[(t(),a(d(s),{key:c.path}))]),_:2},1024))]),_:2},1024)]),_:1})])}const B=r(m,[["render",f]]);export{B as default};
import{_ as r,c as i,d as o,w as e,k as l,a as t,j as _,i as a,l as d,S as u}from"./index-oBQzjt8-.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(k,x,h,w,$,v){const n=l("RouterView");return t(),i("div",p,[o(n,null,{default:e(({Component:s,route:c})=>[o(_,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),a(u,null,{default:e(()=>[(t(),a(d(s),{key:c.path}))]),_:2},1024))]),_:2},1024)]),_:1})])}const B=r(m,[["render",f]]);export{B as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
.fade-enter-active[data-v-dafd6275]{transition-delay:var(--7d032b58)!important}.progress-bar[data-v-c20f1a80]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.filter a[data-v-ea61b607]{text-decoration:none}
.fade-enter-active[data-v-dafd6275]{transition-delay:var(--7d032b58)!important}.progress-bar[data-v-851170e4]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.filter a[data-v-ea61b607]{text-decoration:none}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.agentMessage[data-v-8635cf47]{white-space:break-spaces;max-width:80%;display:flex;flex-direction:column;word-wrap:break-word}.text-bg-secondary[data-v-8635cf47]{background-color:RGBA(var(--bs-secondary-rgb),.7)!important}.text-bg-primary[data-v-8635cf47]{background-color:RGBA(var(--bs-primary-rgb),.7)!important}.agentContainer[data-v-a76f42bd]{--agentHeight: 100vh;position:absolute;z-index:9999;top:0;left:100%;width:450px;box-shadow:0 10px 30px #0000004d;backdrop-filter:blur(8px);background:linear-gradient(var(--degree),#009dff52 var(--distance2),#F9464752 100%)}.agentContainer.enabled[data-v-a76f42bd]{height:calc(var(--agentHeight) - 1rem)}@media screen and (max-width: 768px){.agentContainer[data-v-a76f42bd]{--agentHeight: 100vh !important;top:0;left:0;max-height:calc(var(--agentHeight) - 58px - 1rem);width:calc(100% - 1rem)}}.agentChatroomBody[data-v-a76f42bd]{flex:1 1 auto;overflow-y:auto;max-height:calc(var(--agentHeight) - 70px - 244px)}@media screen and (max-width: 768px){.navbar-container[data-v-58e71749]{position:absolute!important;z-index:1000;animation-duration:.4s;animation-fill-mode:both;display:none;animation-timing-function:cubic-bezier(.82,.58,.17,.9)}.navbar-container.active[data-v-58e71749]{animation-direction:normal;display:block!important;animation-name:zoomInFade-58e71749}}.navbar-container[data-v-58e71749]{height:100vh;position:relative}@supports (height: 100dvh){@media screen and (max-width: 768px){.navbar-container[data-v-58e71749]{height:calc(100dvh - 58px)}}}@keyframes zoomInFade-58e71749{0%{opacity:0;transform:translateY(60px);filter:blur(3px)}to{opacity:1;transform:translateY(0);filter:blur(0px)}}.slideIn-enter-active[data-v-58e71749],.slideIn-leave-active[data-v-58e71749]{transition:all .3s cubic-bezier(.82,.58,.17,1)}.slideIn-enter-from[data-v-58e71749],.slideIn-leave-to[data-v-58e71749]{transform:translateY(30px);filter:blur(3px);opacity:0}main[data-v-0c6a5068]{height:100vh}@supports (height: 100dvh){@media screen and (max-width: 768px){main[data-v-0c6a5068]{height:calc(100dvh - 58px)}}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.agentContainer[data-v-44ff028e]{--agentHeight: 100vh;position:absolute;z-index:9999;top:0;left:100%;width:450px;box-shadow:0 10px 30px #0000004d;backdrop-filter:blur(8px);background:linear-gradient(var(--degree),#009dff52 var(--distance2),#F9464752 100%)}.agentContainer.enabled[data-v-44ff028e]{height:calc(var(--agentHeight) - 1rem)}@media screen and (max-width: 768px){.agentContainer[data-v-44ff028e]{--agentHeight: 100vh !important;top:0;left:0;max-height:calc(var(--agentHeight) - 58px - 1rem);width:calc(100% - 1rem)}}.agentChatroomBody[data-v-44ff028e]{flex:1 1 auto;overflow-y:auto;max-height:calc(var(--agentHeight) - 70px - 244px)}@media screen and (max-width: 768px){.navbar-container[data-v-58e71749]{position:absolute!important;z-index:1000;animation-duration:.4s;animation-fill-mode:both;display:none;animation-timing-function:cubic-bezier(.82,.58,.17,.9)}.navbar-container.active[data-v-58e71749]{animation-direction:normal;display:block!important;animation-name:zoomInFade-58e71749}}.navbar-container[data-v-58e71749]{height:100vh;position:relative}@supports (height: 100dvh){@media screen and (max-width: 768px){.navbar-container[data-v-58e71749]{height:calc(100dvh - 58px)}}}@keyframes zoomInFade-58e71749{0%{opacity:0;transform:translateY(60px);filter:blur(3px)}to{opacity:1;transform:translateY(0);filter:blur(0px)}}.slideIn-enter-active[data-v-58e71749],.slideIn-leave-active[data-v-58e71749]{transition:all .3s cubic-bezier(.82,.58,.17,1)}.slideIn-enter-from[data-v-58e71749],.slideIn-leave-to[data-v-58e71749]{transform:translateY(30px);filter:blur(3px);opacity:0}main[data-v-0c6a5068]{height:100vh}@supports (height: 100dvh){@media screen and (max-width: 768px){main[data-v-0c6a5068]{height:calc(100dvh - 58px)}}}

View File

@@ -1,4 +1,4 @@
import{P as Ws,Q as Vs,R as Ue,U as Hn,r as Wn,o as Vn,V as Nn,H as jn,X as Xe,Y as $n,Z as Ns}from"./index-CTj5x065.js";/*!
import{P as Ws,Q as Vs,R as Ue,U as Hn,r as Wn,o as Vn,V as Nn,H as jn,X as Xe,Y as $n,Z as Ns}from"./index-oBQzjt8-.js";/*!
* @kurkle/color v0.3.2
* https://github.com/kurkle/color#readme
* (c) 2023 Jukka Kurkela

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as e,G as t,a as o,c as a,t as c}from"./index-CTj5x065.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return t(this.t)}}};function n(r,p,l,_,i,x){return o(),a("span",null,c(this.getLocaleText),1)}const u=e(s,[["render",n]]);export{u as L};
import{_ as e,G as t,a as o,c as a,t as c}from"./index-oBQzjt8-.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return t(this.t)}}};function n(r,p,l,_,i,x){return o(),a("span",null,c(this.getLocaleText),1)}const u=e(s,[["render",n]]);export{u as L};

View File

@@ -1 +1 @@
import{L as l}from"./localeText-B4ON0kK9.js";import{d as c}from"./dayjs.min-BoqtvfeE.js";import{_ as h,a as o,c as a,b as e,d as i,w as u,f as p,t as n,j as g,n as f,k as _}from"./index-CTj5x065.js";const x={name:"message",methods:{dayjs:c,hide(){this.ct(),this.message.show=!1},show(){this.timeout=setTimeout(()=>{this.message.show=!1},5e3)},ct(){clearTimeout(this.timeout)}},components:{LocaleText:l},props:{message:Object},mounted(){this.show()},data(){return{dismiss:!1,timeout:null}}},v=["id"],b={key:0,class:"d-flex"},w={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},y={class:"ms-auto"},k={key:1},T={class:"card-body d-flex align-items-center gap-3"};function M(j,s,C,L,t,m){const d=_("LocaleText");return o(),a("div",{onMouseenter:s[1]||(s[1]=r=>{t.dismiss=!0,this.ct()}),onMouseleave:s[2]||(s[2]=r=>{t.dismiss=!1,this.show()}),class:"card shadow rounded-3 position-relative message ms-auto",id:this.message.id},[e("div",{class:f([{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"},"card-header pos"])},[i(g,{name:"zoom",mode:"out-in"},{default:u(()=>[t.dismiss?(o(),a("div",k,[e("small",{onClick:s[0]||(s[0]=r=>m.hide()),class:"d-block mx-auto w-100 text-center",style:{cursor:"pointer"}},[s[3]||(s[3]=e("i",{class:"bi bi-x-lg me-2"},null,-1)),i(d,{t:"Dismiss"})])])):(o(),a("div",b,[e("small",w,[i(d,{t:"FROM "}),p(" "+n(this.message.from),1)]),e("small",y,n(m.dayjs().format("hh:mm A")),1)]))]),_:1})],2),e("div",T,[e("div",null,n(this.message.content),1)])],40,v)}const z=h(x,[["render",M],["__scopeId","data-v-94c76b54"]]);export{z as M};
import{L as l}from"./localeText-CuybU_0U.js";import{d as c}from"./dayjs.min-BHDUvWAB.js";import{_ as h,a as o,c as a,b as e,d as i,w as u,f as p,t as n,j as g,n as f,k as _}from"./index-oBQzjt8-.js";const x={name:"message",methods:{dayjs:c,hide(){this.ct(),this.message.show=!1},show(){this.timeout=setTimeout(()=>{this.message.show=!1},5e3)},ct(){clearTimeout(this.timeout)}},components:{LocaleText:l},props:{message:Object},mounted(){this.show()},data(){return{dismiss:!1,timeout:null}}},v=["id"],b={key:0,class:"d-flex"},w={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},y={class:"ms-auto"},k={key:1},T={class:"card-body d-flex align-items-center gap-3"};function M(j,s,C,L,t,m){const d=_("LocaleText");return o(),a("div",{onMouseenter:s[1]||(s[1]=r=>{t.dismiss=!0,this.ct()}),onMouseleave:s[2]||(s[2]=r=>{t.dismiss=!1,this.show()}),class:"card shadow rounded-3 position-relative message ms-auto",id:this.message.id},[e("div",{class:f([{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"},"card-header pos"])},[i(g,{name:"zoom",mode:"out-in"},{default:u(()=>[t.dismiss?(o(),a("div",k,[e("small",{onClick:s[0]||(s[0]=r=>m.hide()),class:"d-block mx-auto w-100 text-center",style:{cursor:"pointer"}},[s[3]||(s[3]=e("i",{class:"bi bi-x-lg me-2"},null,-1)),i(d,{t:"Dismiss"})])])):(o(),a("div",b,[e("small",w,[i(d,{t:"FROM "}),p(" "+n(this.message.from),1)]),e("small",y,n(m.dayjs().format("hh:mm A")),1)]))]),_:1})],2),e("div",T,[e("div",null,n(this.message.content),1)])],40,v)}const z=h(x,[["render",M],["__scopeId","data-v-94c76b54"]]);export{z as M};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as v,D as g,r as o,o as h,J as x,g as y,a as i,c as n,b as s,d as c,n as w,e as C,w as k,j as F}from"./index-CTj5x065.js";import{L as T}from"./localeText-B4ON0kK9.js";import"./browser-CjSdxGTc.js";const M={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},S={class:"container d-flex h-100 w-100"},D={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},P={class:"card rounded-3 shadow w-100"},j={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},B={class:"mb-0"},G={class:"card-body p-4 d-flex flex-column gap-3"},L={style:{height:"300px"},class:"d-flex"},N=["value"],V={key:0,class:"spinner-border m-auto",role:"status"},I={class:"d-flex"},W=["disabled"],$={key:0,class:"d-block"},q={key:1,class:"d-block",id:"check"},z={__name:"peerConfigurationFile",props:{selectedPeer:Object},emits:["close"],setup(u,{emit:p}){const m=p,f=u,r=g(),t=o(!1),l=o(""),a=o(!0);o({error:!1,message:void 0}),h(()=>{const d=x();y("/api/downloadPeer/"+d.params.id,{id:f.selectedPeer.id},e=>{e.status?(l.value=e.data.file,a.value=!1):this.dashboardStore.newMessage("Server",e.message,"danger")})});const b=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(l.value).then(()=>{t.value=!0,setTimeout(()=>{t.value=!1},3e3)}).catch(()=>{r.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(t.value=!0,setTimeout(()=>{t.value=!1},3e3)):r.newMessage("WGDashboard","Failed to copy","danger"))};return(d,e)=>(i(),n("div",M,[s("div",S,[s("div",D,[s("div",P,[s("div",j,[s("h4",B,[c(T,{t:"Peer Configuration File"})]),s("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=_=>m("close"))})]),s("div",G,[s("div",L,[s("textarea",{style:{height:"300px"},class:w(["form-control w-100 rounded-3 animate__fadeIn animate__faster animate__animated",{"d-none":a.value}]),id:"peerConfigurationFile",value:l.value},null,10,N),a.value?(i(),n("div",V,e[2]||(e[2]=[s("span",{class:"visually-hidden"},"Loading...",-1)]))):C("",!0)]),s("div",I,[s("button",{onClick:e[1]||(e[1]=_=>b()),disabled:t.value||a.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[c(F,{name:"slide-up",mode:"out-in"},{default:k(()=>[t.value?(i(),n("span",q,e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)]))):(i(),n("span",$,e[3]||(e[3]=[s("i",{class:"bi bi-clipboard-fill"},null,-1)])))]),_:1})],8,W)])])])])])]))}},R=v(z,[["__scopeId","data-v-b0ea2d46"]]);export{R as default};
import{_ as v,D as g,r as o,o as h,J as x,g as y,a as i,c as n,b as s,d as c,n as w,e as C,w as k,j as F}from"./index-oBQzjt8-.js";import{L as T}from"./localeText-CuybU_0U.js";import"./browser-CjSdxGTc.js";const M={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},S={class:"container d-flex h-100 w-100"},D={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},P={class:"card rounded-3 shadow w-100"},j={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},B={class:"mb-0"},G={class:"card-body p-4 d-flex flex-column gap-3"},L={style:{height:"300px"},class:"d-flex"},N=["value"],V={key:0,class:"spinner-border m-auto",role:"status"},I={class:"d-flex"},W=["disabled"],$={key:0,class:"d-block"},q={key:1,class:"d-block",id:"check"},z={__name:"peerConfigurationFile",props:{selectedPeer:Object},emits:["close"],setup(u,{emit:p}){const m=p,f=u,r=g(),t=o(!1),l=o(""),a=o(!0);o({error:!1,message:void 0}),h(()=>{const d=x();y("/api/downloadPeer/"+d.params.id,{id:f.selectedPeer.id},e=>{e.status?(l.value=e.data.file,a.value=!1):this.dashboardStore.newMessage("Server",e.message,"danger")})});const b=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(l.value).then(()=>{t.value=!0,setTimeout(()=>{t.value=!1},3e3)}).catch(()=>{r.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(t.value=!0,setTimeout(()=>{t.value=!1},3e3)):r.newMessage("WGDashboard","Failed to copy","danger"))};return(d,e)=>(i(),n("div",M,[s("div",S,[s("div",D,[s("div",P,[s("div",j,[s("h4",B,[c(T,{t:"Peer Configuration File"})]),s("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=_=>m("close"))})]),s("div",G,[s("div",L,[s("textarea",{style:{height:"300px"},class:w(["form-control w-100 rounded-3 animate__fadeIn animate__faster animate__animated",{"d-none":a.value}]),id:"peerConfigurationFile",value:l.value},null,10,N),a.value?(i(),n("div",V,e[2]||(e[2]=[s("span",{class:"visually-hidden"},"Loading...",-1)]))):C("",!0)]),s("div",I,[s("button",{onClick:e[1]||(e[1]=_=>b()),disabled:t.value||a.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[c(F,{name:"slide-up",mode:"out-in"},{default:k(()=>[t.value?(i(),n("span",q,e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)]))):(i(),n("span",$,e[3]||(e[3]=[s("i",{class:"bi bi-clipboard-fill"},null,-1)])))]),_:1})],8,W)])])])])])]))}},R=v(z,[["__scopeId","data-v-b0ea2d46"]]);export{R as default};

View File

@@ -1 +1 @@
import{S as p,a as b}from"./schedulePeerJob-CaPFdA59.js";import{_ as h,W as u,z as m,k as i,a as o,c as a,b as e,d as r,w as _,F as v,h as f,i as J,e as x,T as g}from"./index-CTj5x065.js";import{L as w}from"./localeText-B4ON0kK9.js";import"./vue-datepicker-BgItBmc-.js";import"./dayjs.min-BoqtvfeE.js";const P={name:"peerJobs",setup(){return{store:u()}},props:{selectedPeer:Object},components:{LocaleText:w,SchedulePeerJob:p,ScheduleDropdown:b},data(){return{}},methods:{deleteJob(d){this.selectedPeer.jobs=this.selectedPeer.jobs.filter(t=>t.JobID!==d.JobID)},addJob(){this.selectedPeer.jobs.unshift(JSON.parse(JSON.stringify({JobID:m().toString(),Configuration:this.selectedPeer.configuration.Name,Peer:this.selectedPeer.id,Field:this.store.PeerScheduleJobs.dropdowns.Field[0].value,Operator:this.store.PeerScheduleJobs.dropdowns.Operator[0].value,Value:"",CreationDate:"",ExpireDate:"",Action:this.store.PeerScheduleJobs.dropdowns.Action[0].value})))}}},S={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},y={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},C={class:"card rounded-3 shadow",style:{width:"700px"}},D={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},k={class:"mb-0 fw-normal"},j={class:"card-body px-4 pb-4 pt-2 position-relative"},T={class:"d-flex align-items-center mb-3"},N={class:"card shadow-sm",key:"none",style:{height:"153px"}},I={class:"card-body text-muted text-center d-flex"},L={class:"m-auto"};function O(d,t,B,F,V,A){const n=i("LocaleText"),l=i("SchedulePeerJob");return o(),a("div",S,[e("div",y,[e("div",$,[e("div",C,[e("div",D,[e("h4",k,[r(n,{t:"Schedule Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=s=>this.$emit("close"))})]),e("div",j,[e("div",T,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow",onClick:t[1]||(t[1]=s=>this.addJob())},[t[3]||(t[3]=e("i",{class:"bi bi-plus-lg me-2"},null,-1)),r(n,{t:"Job"})])]),r(g,{name:"schedulePeerJobTransition",tag:"div",class:"position-relative"},{default:_(()=>[(o(!0),a(v,null,f(this.selectedPeer.jobs,(s,E)=>(o(),J(l,{onRefresh:t[2]||(t[2]=c=>this.$emit("refresh")),onDelete:c=>this.deleteJob(s),dropdowns:this.store.PeerScheduleJobs.dropdowns,key:s.JobID,pjob:s},null,8,["onDelete","dropdowns","pjob"]))),128)),this.selectedPeer.jobs.length===0?(o(),a("div",N,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):x("",!0)]),_:1})])])])])])}const q=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{q as default};
import{S as p,a as b}from"./schedulePeerJob-D7M0MV7j.js";import{_ as h,W as u,z as m,k as i,a as o,c as a,b as e,d as r,w as _,F as v,h as f,i as J,e as x,T as g}from"./index-oBQzjt8-.js";import{L as w}from"./localeText-CuybU_0U.js";import"./vue-datepicker-DZRPqFzF.js";import"./dayjs.min-BHDUvWAB.js";const P={name:"peerJobs",setup(){return{store:u()}},props:{selectedPeer:Object},components:{LocaleText:w,SchedulePeerJob:p,ScheduleDropdown:b},data(){return{}},methods:{deleteJob(d){this.selectedPeer.jobs=this.selectedPeer.jobs.filter(t=>t.JobID!==d.JobID)},addJob(){this.selectedPeer.jobs.unshift(JSON.parse(JSON.stringify({JobID:m().toString(),Configuration:this.selectedPeer.configuration.Name,Peer:this.selectedPeer.id,Field:this.store.PeerScheduleJobs.dropdowns.Field[0].value,Operator:this.store.PeerScheduleJobs.dropdowns.Operator[0].value,Value:"",CreationDate:"",ExpireDate:"",Action:this.store.PeerScheduleJobs.dropdowns.Action[0].value})))}}},S={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},y={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},C={class:"card rounded-3 shadow",style:{width:"700px"}},D={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},k={class:"mb-0 fw-normal"},j={class:"card-body px-4 pb-4 pt-2 position-relative"},T={class:"d-flex align-items-center mb-3"},N={class:"card shadow-sm",key:"none",style:{height:"153px"}},I={class:"card-body text-muted text-center d-flex"},L={class:"m-auto"};function O(d,t,B,F,V,A){const n=i("LocaleText"),l=i("SchedulePeerJob");return o(),a("div",S,[e("div",y,[e("div",$,[e("div",C,[e("div",D,[e("h4",k,[r(n,{t:"Schedule Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=s=>this.$emit("close"))})]),e("div",j,[e("div",T,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow",onClick:t[1]||(t[1]=s=>this.addJob())},[t[3]||(t[3]=e("i",{class:"bi bi-plus-lg me-2"},null,-1)),r(n,{t:"Job"})])]),r(g,{name:"schedulePeerJobTransition",tag:"div",class:"position-relative"},{default:_(()=>[(o(!0),a(v,null,f(this.selectedPeer.jobs,(s,E)=>(o(),J(l,{onRefresh:t[2]||(t[2]=c=>this.$emit("refresh")),onDelete:c=>this.deleteJob(s),dropdowns:this.store.PeerScheduleJobs.dropdowns,key:s.JobID,pjob:s},null,8,["onDelete","dropdowns","pjob"]))),128)),this.selectedPeer.jobs.length===0?(o(),a("div",N,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):x("",!0)]),_:1})])])])])])}const q=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{q as default};

View File

@@ -1 +1 @@
import{S as _}from"./schedulePeerJob-CaPFdA59.js";import{_ as g,W as v,k as c,a as t,c as r,b as e,d as l,F as p,h as b,t as m,e as f,i as y}from"./index-CTj5x065.js";import{L as x}from"./localeText-B4ON0kK9.js";import"./vue-datepicker-BgItBmc-.js";import"./dayjs.min-BoqtvfeE.js";const J={name:"peerJobsAllModal",setup(){return{store:v()}},components:{LocaleText:x,SchedulePeerJob:_},props:{configurationPeers:Array[Object]},computed:{getAllJobs(){return this.configurationPeers.filter(a=>a.jobs.length>0)}}},k={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},w={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},A={class:"card rounded-3 shadow",style:{width:"900px"}},L={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},S={class:"mb-0 fw-normal"},C={class:"card-body px-4 pb-4 pt-2"},P={key:0,class:"accordion",id:"peerJobsLogsModalAccordion"},j={class:"accordion-header"},M=["data-bs-target"],B={key:0},N={class:"text-muted"},D=["id"],T={class:"accordion-body"},V={key:1,class:"card shadow-sm",style:{height:"153px"}},F={class:"card-body text-muted text-center d-flex"},O={class:"m-auto"};function W(a,o,E,I,R,q){const n=c("LocaleText"),u=c("SchedulePeerJob");return t(),r("div",k,[e("div",w,[e("div",$,[e("div",A,[e("div",L,[e("h4",S,[l(n,{t:"All Active Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:o[0]||(o[0]=s=>this.$emit("close"))})]),e("div",C,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow mb-2",onClick:o[1]||(o[1]=s=>this.$emit("allLogs"))},[o[4]||(o[4]=e("i",{class:"bi bi-clock me-2"},null,-1)),l(n,{t:"Logs"})]),this.getAllJobs.length>0?(t(),r("div",P,[(t(!0),r(p,null,b(this.getAllJobs,(s,d)=>(t(),r("div",{class:"accordion-item",key:s.id},[e("h2",j,[e("button",{class:"accordion-button collapsed",type:"button","data-bs-toggle":"collapse","data-bs-target":"#collapse_"+d},[e("small",null,[e("strong",null,[s.name?(t(),r("span",B,m(s.name)+" • ",1)):f("",!0),e("samp",N,m(s.id),1)])])],8,M)]),e("div",{id:"collapse_"+d,class:"accordion-collapse collapse","data-bs-parent":"#peerJobsLogsModalAccordion"},[e("div",T,[(t(!0),r(p,null,b(s.jobs,i=>(t(),y(u,{onDelete:o[2]||(o[2]=h=>this.$emit("refresh")),onRefresh:o[3]||(o[3]=h=>this.$emit("refresh")),dropdowns:this.store.PeerScheduleJobs.dropdowns,viewOnly:!0,key:i.JobID,pjob:i},null,8,["dropdowns","pjob"]))),128))])],8,D)]))),128))])):(t(),r("div",V,[e("div",F,[e("span",O,[l(n,{t:"No active job at the moment."})])])]))])])])])])}const U=g(J,[["render",W]]);export{U as default};
import{S as _}from"./schedulePeerJob-D7M0MV7j.js";import{_ as g,W as v,k as c,a as t,c as r,b as e,d as l,F as p,h as b,t as m,e as f,i as y}from"./index-oBQzjt8-.js";import{L as x}from"./localeText-CuybU_0U.js";import"./vue-datepicker-DZRPqFzF.js";import"./dayjs.min-BHDUvWAB.js";const J={name:"peerJobsAllModal",setup(){return{store:v()}},components:{LocaleText:x,SchedulePeerJob:_},props:{configurationPeers:Array[Object]},computed:{getAllJobs(){return this.configurationPeers.filter(a=>a.jobs.length>0)}}},k={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},w={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},A={class:"card rounded-3 shadow",style:{width:"900px"}},L={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},S={class:"mb-0 fw-normal"},C={class:"card-body px-4 pb-4 pt-2"},P={key:0,class:"accordion",id:"peerJobsLogsModalAccordion"},j={class:"accordion-header"},M=["data-bs-target"],B={key:0},N={class:"text-muted"},D=["id"],T={class:"accordion-body"},V={key:1,class:"card shadow-sm",style:{height:"153px"}},F={class:"card-body text-muted text-center d-flex"},O={class:"m-auto"};function W(a,o,E,I,R,q){const n=c("LocaleText"),u=c("SchedulePeerJob");return t(),r("div",k,[e("div",w,[e("div",$,[e("div",A,[e("div",L,[e("h4",S,[l(n,{t:"All Active Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:o[0]||(o[0]=s=>this.$emit("close"))})]),e("div",C,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow mb-2",onClick:o[1]||(o[1]=s=>this.$emit("allLogs"))},[o[4]||(o[4]=e("i",{class:"bi bi-clock me-2"},null,-1)),l(n,{t:"Logs"})]),this.getAllJobs.length>0?(t(),r("div",P,[(t(!0),r(p,null,b(this.getAllJobs,(s,d)=>(t(),r("div",{class:"accordion-item",key:s.id},[e("h2",j,[e("button",{class:"accordion-button collapsed",type:"button","data-bs-toggle":"collapse","data-bs-target":"#collapse_"+d},[e("small",null,[e("strong",null,[s.name?(t(),r("span",B,m(s.name)+" • ",1)):f("",!0),e("samp",N,m(s.id),1)])])],8,M)]),e("div",{id:"collapse_"+d,class:"accordion-collapse collapse","data-bs-parent":"#peerJobsLogsModalAccordion"},[e("div",T,[(t(!0),r(p,null,b(s.jobs,i=>(t(),y(u,{onDelete:o[2]||(o[2]=h=>this.$emit("refresh")),onRefresh:o[3]||(o[3]=h=>this.$emit("refresh")),dropdowns:this.store.PeerScheduleJobs.dropdowns,viewOnly:!0,key:i.JobID,pjob:i},null,8,["dropdowns","pjob"]))),128))])],8,D)]))),128))])):(t(),r("div",V,[e("div",F,[e("span",O,[l(n,{t:"No active job at the moment."})])])]))])])])])])}const U=g(J,[["render",W]]);export{U as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
@media screen and (max-width: 768px){#qrcode[data-v-7c287bf3]{width:100%!important;height:auto!important;aspect-ratio:1/1}}

View File

@@ -1 +0,0 @@
@media screen and (max-width: 768px){#qrcode[data-v-5816a147]{width:100%!important;height:auto!important;aspect-ratio:1/1}}

View File

@@ -0,0 +1 @@
import{b as i}from"./browser-CjSdxGTc.js";import{L as c}from"./localeText-CuybU_0U.js";import{_ as l,D as p,g as _,k as m,a as n,c as r,b as e,d as u,n as h,e as f}from"./index-oBQzjt8-.js";const g={name:"peerQRCode",components:{LocaleText:c},props:{selectedPeer:Object},setup(){return{dashboardStore:p()}},data(){return{loading:!0}},mounted(){_("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},o=>{if(this.loading=!1,o.status){let t="";if(this.selectedPeer.configuration.Protocol==="awg"){let a={containers:[{awg:{isThirdPartyConfig:!0,last_config:o.data.file,port:this.selectedPeer.configuration.ListenPort,transport_proto:"udp"},container:"amnezia-awg"}],defaultContainer:"amnezia-awg",description:this.selectedPeer.name,hostName:this.dashboardStore.Configuration.Peers.remote_endpoint};t=btoa(JSON.stringify(a))}else t=o.data.file;i.toCanvas(document.querySelector("#qrcode"),t,a=>{a&&console.error(a)})}else this.dashboardStore.newMessage("Server",o.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},v={class:"container d-flex h-100 w-100"},C={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},w={class:"card rounded-3 shadow"},P={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},x={class:"mb-0"},S={class:"card-body p-4"},y={class:"d-flex"},L={key:0,class:"spinner-border m-auto",role:"status"};function k(o,t,a,N,s,$){const d=m("LocaleText");return n(),r("div",b,[e("div",v,[e("div",C,[e("div",w,[e("div",P,[e("h4",x,[u(d,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=Q=>this.$emit("close"))})]),e("div",S,[e("div",y,[e("canvas",{id:"qrcode",class:h(["rounded-3 shadow animate__animated animate__fadeIn animate__faster",{"d-none":s.loading}])},null,2),s.loading?(n(),r("div",L,t[1]||(t[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)]))):f("",!0)])])])])])])}const q=l(g,[["render",k],["__scopeId","data-v-7c287bf3"]]);export{q as default};

View File

@@ -1 +0,0 @@
import{b as i}from"./browser-CjSdxGTc.js";import{L as c}from"./localeText-B4ON0kK9.js";import{_ as l,D as p,g as _,k as m,a as n,c as r,b as e,d as u,n as h,e as f}from"./index-CTj5x065.js";const g={name:"peerQRCode",components:{LocaleText:c},props:{selectedPeer:Object},setup(){return{dashboardStore:p()}},data(){return{loading:!0}},mounted(){_("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},o=>{if(this.loading=!1,o.status){let t="";if(this.selectedPeer.configuration.Protocol==="awg"){let a={containers:[{awg:{isThirdPartyConfig:!0,last_config:o.data.file,port:this.selectedPeer.configuration.ListenPort,transport_proto:"udp"},container:"amnezia-awg"}],defaultContainer:"amnezia-awg",description:this.selectedPeer.name,hostName:this.dashboardStore.Configuration.Peers.remote_endpoint};t=JSON.stringify(a)}else t=o.data.file;i.toCanvas(document.querySelector("#qrcode"),t,a=>{a&&console.error(a)})}else this.dashboardStore.newMessage("Server",o.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},v={class:"container d-flex h-100 w-100"},C={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},w={class:"card rounded-3 shadow"},P={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},x={class:"mb-0"},S={class:"card-body p-4"},y={class:"d-flex"},L={key:0,class:"spinner-border m-auto",role:"status"};function k(o,t,a,N,s,$){const d=m("LocaleText");return n(),r("div",b,[e("div",v,[e("div",C,[e("div",w,[e("div",P,[e("h4",x,[u(d,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=Q=>this.$emit("close"))})]),e("div",S,[e("div",y,[e("canvas",{id:"qrcode",class:h(["rounded-3 shadow animate__animated animate__fadeIn animate__faster",{"d-none":s.loading}])},null,2),s.loading?(n(),r("div",L,t[1]||(t[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)]))):f("",!0)])])])])])])}const q=l(g,[["render",k],["__scopeId","data-v-5816a147"]]);export{q as default};

View File

@@ -1 +1 @@
import{_ as u,q as m,G as p,r as b,W as f,a2 as h,o as g,a as v,i as y,w as _,b as e,m as x,y as w,d as S,j as B}from"./index-CTj5x065.js";import{L as T}from"./localeText-B4ON0kK9.js";const C={class:"fixed-bottom w-100 bottom-0 z-2",style:{"z-index":"1"}},P={class:"container-fluid"},k={class:"row g-0"},L={class:"col-md-9 col-lg-10 d-flex justify-content-center py-2"},V={class:"rounded-3 p-2 border shadow searchPeersContainer bg-body-tertiary"},j={class:"d-flex gap-1 align-items-center px-2"},z=["placeholder"],D={__name:"peerSearchBar",emits:["close"],setup(G,{emit:n}){const l=m(()=>p("Search Peers..."));let t;const o=b(""),r=f(),i=()=>{t?(clearTimeout(t),t=setTimeout(()=>{r.searchString=o.value},300)):t=setTimeout(()=>{r.searchString=o.value},300)},d=n,c=h("searchBar");return g(()=>{c.value.focus()}),(M,s)=>(v(),y(B,{name:"slideUp",appear:"",type:"animation",style:{"animation-delay":"1s"}},{default:_(()=>[e("div",C,[e("div",P,[e("div",k,[s[5]||(s[5]=e("div",{class:"col-md-3 col-lg-2"},null,-1)),e("div",L,[e("div",V,[e("div",j,[s[4]||(s[4]=e("h6",{class:"mb-0 me-2"},[e("label",{for:"searchPeers"},[e("i",{class:"bi bi-search"})])],-1)),x(e("input",{ref:"searchBar",class:"flex-grow-1 form-control rounded-3 bg-secondary-subtle border-1 border-secondary-subtle",placeholder:l.value,id:"searchPeers",onKeyup:s[0]||(s[0]=a=>i()),"onUpdate:modelValue":s[1]||(s[1]=a=>o.value=a)},null,40,z),[[w,o.value]]),e("button",{onClick:s[2]||(s[2]=a=>d("close")),style:{"white-space":"nowrap"},class:"btn bg-secondary-subtle text-secondary-emphasis border-secondary-subtle rounded-3 d-flex align-items-center"},[e("span",null,[s[3]||(s[3]=e("i",{class:"bi bi-x-circle-fill me-2"},null,-1)),S(T,{t:"Done"})])])])])])])])])]),_:1}))}},W=u(D,[["__scopeId","data-v-b741afe7"]]);export{W as default};
import{_ as u,q as m,G as p,r as b,W as f,a2 as h,o as g,a as v,i as y,w as _,b as e,m as x,y as w,d as S,j as B}from"./index-oBQzjt8-.js";import{L as T}from"./localeText-CuybU_0U.js";const C={class:"fixed-bottom w-100 bottom-0 z-2",style:{"z-index":"1"}},P={class:"container-fluid"},k={class:"row g-0"},L={class:"col-md-9 col-lg-10 d-flex justify-content-center py-2"},V={class:"rounded-3 p-2 border shadow searchPeersContainer bg-body-tertiary"},j={class:"d-flex gap-1 align-items-center px-2"},z=["placeholder"],D={__name:"peerSearchBar",emits:["close"],setup(G,{emit:n}){const l=m(()=>p("Search Peers..."));let t;const o=b(""),r=f(),i=()=>{t?(clearTimeout(t),t=setTimeout(()=>{r.searchString=o.value},300)):t=setTimeout(()=>{r.searchString=o.value},300)},d=n,c=h("searchBar");return g(()=>{c.value.focus()}),(M,s)=>(v(),y(B,{name:"slideUp",appear:"",type:"animation",style:{"animation-delay":"1s"}},{default:_(()=>[e("div",C,[e("div",P,[e("div",k,[s[5]||(s[5]=e("div",{class:"col-md-3 col-lg-2"},null,-1)),e("div",L,[e("div",V,[e("div",j,[s[4]||(s[4]=e("h6",{class:"mb-0 me-2"},[e("label",{for:"searchPeers"},[e("i",{class:"bi bi-search"})])],-1)),x(e("input",{ref:"searchBar",class:"flex-grow-1 form-control rounded-3 bg-secondary-subtle border-1 border-secondary-subtle",placeholder:l.value,id:"searchPeers",onKeyup:s[0]||(s[0]=a=>i()),"onUpdate:modelValue":s[1]||(s[1]=a=>o.value=a)},null,40,z),[[w,o.value]]),e("button",{onClick:s[2]||(s[2]=a=>d("close")),style:{"white-space":"nowrap"},class:"btn bg-secondary-subtle text-secondary-emphasis border-secondary-subtle rounded-3 d-flex align-items-center"},[e("span",null,[s[3]||(s[3]=e("i",{class:"bi bi-x-circle-fill me-2"},null,-1)),S(T,{t:"Done"})])])])])])])])])]),_:1}))}},W=u(D,[["__scopeId","data-v-b741afe7"]]);export{W as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{L as r}from"./localeText-B4ON0kK9.js";import{a as t,c as n,f as i,i as s,e as a}from"./index-CTj5x065.js";const d={key:0,class:"badge wireguardBg rounded-3 shadow"},c={key:1,class:"badge amneziawgBg rounded-3 shadow"},u={__name:"protocolBadge",props:{protocol:String,mini:!1},setup(e){return(m,o)=>e.protocol==="wg"?(t(),n("span",d,[o[0]||(o[0]=i(" WireGuard ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):e.protocol==="awg"?(t(),n("span",c,[o[1]||(o[1]=i(" AmneziaWG ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):a("",!0)}};export{u as _};
import{L as r}from"./localeText-CuybU_0U.js";import{a as t,c as n,f as i,i as s,e as a}from"./index-oBQzjt8-.js";const d={key:0,class:"badge wireguardBg rounded-3 shadow"},c={key:1,class:"badge amneziawgBg rounded-3 shadow"},u={__name:"protocolBadge",props:{protocol:String,mini:!1},setup(e){return(m,o)=>e.protocol==="wg"?(t(),n("span",d,[o[0]||(o[0]=i(" WireGuard ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):e.protocol==="awg"?(t(),n("span",c,[o[1]||(o[1]=i(" AmneziaWG ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):a("",!0)}};export{u as _};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as u,D as m,A as p,c as r,b as e,d as o,f as c,t as h,e as f,m as l,y as d,a as i,k as w}from"./index-CTj5x065.js";import{L as g}from"./localeText-B4ON0kK9.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:m()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,p("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},A={for:"confirmPassword",class:"mb-1 text-muted"},$=["disabled"],q={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=w("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=c(" 😊"))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):f("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",A,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",q,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,$)])])])],8,_)}const j=u(b,[["render",B]]);export{j as default};
import{_ as u,D as m,A as p,c as r,b as e,d as o,f as c,t as h,e as f,m as l,y as d,a as i,k as w}from"./index-oBQzjt8-.js";import{L as g}from"./localeText-CuybU_0U.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:m()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,p("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},A={for:"confirmPassword",class:"mb-1 text-muted"},$=["disabled"],q={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=w("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=c(" 😊"))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):f("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",A,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",q,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,$)])])])],8,_)}const j=u(b,[["render",B]]);export{j as default};

View File

@@ -1 +1 @@
import{_,r,D as p,g as u,c as m,b as t,d as c,J as h,a as f,k as b}from"./index-CTj5x065.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-B4ON0kK9.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=h(),e=r(!1),i=p(),n=r(""),s=r(void 0),l=r(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(s.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(s.value=d.data,l.value=new Blob([s.value.file],{type:"text/plain"})):s.value=void 0,e.value=!0}),{store:i,theme:n,peerConfiguration:s,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),i=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=i,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},w=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},I={class:"m-auto"},L={key:1,class:"d-flex align-items-center flex-column gap-3"},k={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},B={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},D={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},R=["download","href"];function q(o,e,i,n,s,l){const a=b("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",x,[this.peerConfiguration?(f(),m("div",L,[t("div",k,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",B,null,512),t("p",D,[c(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),c(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)]),8,R)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",I,[c(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,w)}const N=_(g,[["render",q],["__scopeId","data-v-1b44aacd"]]);export{N as default};
import{_,r,D as p,g as u,c as m,b as t,d as c,J as h,a as f,k as b}from"./index-oBQzjt8-.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-CuybU_0U.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=h(),e=r(!1),i=p(),n=r(""),s=r(void 0),l=r(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(s.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(s.value=d.data,l.value=new Blob([s.value.file],{type:"text/plain"})):s.value=void 0,e.value=!0}),{store:i,theme:n,peerConfiguration:s,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),i=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=i,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},w=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},I={class:"m-auto"},L={key:1,class:"d-flex align-items-center flex-column gap-3"},k={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},B={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},D={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},R=["download","href"];function q(o,e,i,n,s,l){const a=b("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",x,[this.peerConfiguration?(f(),m("div",L,[t("div",k,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",B,null,512),t("p",D,[c(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),c(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)]),8,R)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",I,[c(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,w)}const N=_(g,[["render",q],["__scopeId","data-v-1b44aacd"]]);export{N as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as b,p as m,r as p,q as v,a as t,c as r,d as g,w as x,s as n,n as f,b as l,t as d,e as C,j as w}from"./index-CTj5x065.js";const y={class:"text-muted me-2"},_={class:"fw-bold"},k={__name:"cpuCore",props:{core_number:Number,percentage:Number,align:Boolean,square:Boolean},setup(e){m(c=>({"2ec4d3bc":o.value}));const u=e,s=p(!1),o=v(()=>u.square?"40px":"25px");return(c,a)=>(t(),r("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:a[0]||(a[0]=i=>s.value=!0),onMouseleave:a[1]||(a[1]=i=>s.value=!1),style:n({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[g(w,{name:"zoomReversed"},{default:x(()=>[s.value?(t(),r("div",{key:0,style:n([{"white-space":"nowrap"},{top:o.value}]),class:f(["floatingLabel z-3 border position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow d-flex",[e.align?"end-0":"start-0"]])},[l("small",y," Core #"+d(e.core_number+1),1),l("small",_,d(e.percentage)+"% ",1)],6)):C("",!0)]),_:1})],36))}},B=b(k,[["__scopeId","data-v-2ad535bb"]]);export{B as C};
import{_ as b,p as m,r as p,q as v,a as t,c as r,d as g,w as x,s as n,n as f,b as l,t as d,e as C,j as w}from"./index-oBQzjt8-.js";const y={class:"text-muted me-2"},_={class:"fw-bold"},k={__name:"cpuCore",props:{core_number:Number,percentage:Number,align:Boolean,square:Boolean},setup(e){m(c=>({"2ec4d3bc":o.value}));const u=e,s=p(!1),o=v(()=>u.square?"40px":"25px");return(c,a)=>(t(),r("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:a[0]||(a[0]=i=>s.value=!0),onMouseleave:a[1]||(a[1]=i=>s.value=!1),style:n({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[g(w,{name:"zoomReversed"},{default:x(()=>[s.value?(t(),r("div",{key:0,style:n([{"white-space":"nowrap"},{top:o.value}]),class:f(["floatingLabel z-3 border position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow d-flex",[e.align?"end-0":"start-0"]])},[l("small",y," Core #"+d(e.core_number+1),1),l("small",_,d(e.percentage)+"% ",1)],6)):C("",!0)]),_:1})],36))}},B=b(k,[["__scopeId","data-v-2ad535bb"]]);export{B as C};

View File

@@ -1 +1 @@
import{_ as h,D as m,g as p,A as f,c as b,b as t,d as i,t as _,m as v,y as g,i as d,w as r,k as c,a as n}from"./index-CTj5x065.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-B4ON0kK9.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=m();let e="";return await p("/api/Welcome_GetTotpLink",{},a=>{a.status&&(e=a.data)}),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?f("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},L={class:"d-flex flex-column"},M={class:"dashboardLogo display-4"},C={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},A={for:"totp",class:"mb-2"},D={class:"text-muted"},S={class:"form-group mb-2"},q=["disabled"],E={class:"invalid-feedback"},F={class:"valid-feedback"},R={class:"d-flex gap-3 mt-5 flex-column"};function G(s,e,a,N,W,Q){const o=c("LocaleText"),l=c("RouterLink");return n(),b("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",w,[t("div",L,[t("div",null,[t("h1",M,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",C,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,_(this.l),1)],8,B)]),t("label",A,[t("small",D,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",S,[v(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,q),[[g,this.totp]]),t("div",E,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",F,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",R,[this.verified?(n(),d(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:r(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),d(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:r(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const z=h(T,[["render",G]]);export{z as default};
import{_ as h,D as m,g as p,A as f,c as b,b as t,d as i,t as _,m as v,y as g,i as d,w as r,k as c,a as n}from"./index-oBQzjt8-.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-CuybU_0U.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=m();let e="";return await p("/api/Welcome_GetTotpLink",{},a=>{a.status&&(e=a.data)}),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?f("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},L={class:"d-flex flex-column"},M={class:"dashboardLogo display-4"},C={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},A={for:"totp",class:"mb-2"},D={class:"text-muted"},S={class:"form-group mb-2"},q=["disabled"],E={class:"invalid-feedback"},F={class:"valid-feedback"},R={class:"d-flex gap-3 mt-5 flex-column"};function G(s,e,a,N,W,Q){const o=c("LocaleText"),l=c("RouterLink");return n(),b("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",w,[t("div",L,[t("div",null,[t("h1",M,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",C,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,_(this.l),1)],8,B)]),t("label",A,[t("small",D,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",S,[v(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,q),[[g,this.totp]]),t("div",E,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",F,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",R,[this.verified?(n(),d(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:r(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),d(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:r(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const z=h(T,[["render",G]]);export{z as default};

View File

@@ -1 +1 @@
import{_ as h,W as g,g as b,c as o,b as t,d as n,m as y,y as f,C as x,w as r,j as c,a as l,f as v,F as u,h as m,n as k,s as T,t as i,k as _}from"./index-CTj5x065.js";import{O as A}from"./osmap-MF-Nk1v9.js";import{L as w}from"./localeText-B4ON0kK9.js";const R={name:"traceroute",components:{LocaleText:w,OSMap:A},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:g()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,b("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},M={class:"mt-md-5 mt-3 text-body"},S={class:"container-md"},$={class:"mb-3 text-body"},C={class:"d-flex gap-2 mb-3 flex-column"},L={class:"flex-grow-1"},P={class:"mb-1 text-muted",for:"ipAddress"},O=["disabled"],V=["disabled"],B={key:0,class:"d-block"},I={key:1,class:"d-block"},N={class:"position-relative"},z={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={scope:"col"},K={scope:"col"},W={scope:"col"},j={scope:"col"},U={scope:"col"},q={key:0},J={key:1};function Q(d,s,X,Y,Z,tt){const a=_("LocaleText"),p=_("OSMap");return l(),o("div",M,[t("div",S,[t("h3",$,[n(a,{t:"Traceroute"})]),t("div",C,[t("div",L,[t("label",P,[t("small",null,[n(a,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control rounded-3","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=x(e=>this.execute(),["enter"])),type:"text"},null,40,O),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 position-relative flex-grow-1",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(l(),o("span",I,s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)]))):(l(),o("span",B,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ")])))]),_:1})],8,V)]),t("div",N,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(l(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(a,{t:"Hop"})]),t("th",H,[n(a,{t:"IP Address"})]),t("th",K,[n(a,{t:"Average RTT (ms)"})]),t("th",W,[n(a,{t:"Min RTT (ms)"})]),t("th",j,[n(a,{t:"Max RTT (ms)"})]),t("th",U,[n(a,{t:"Geolocation"})])])]),t("tbody",null,[(l(!0),o(u,null,m(this.tracerouteResult,(e,et)=>(l(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,[t("samp",null,i(e.ip),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.avg_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.min_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.max_rtt),1)])]),t("td",null,[e.geo.city&&e.geo.country?(l(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):(l(),o("span",J," - "))])]))),256))])])])])):(l(),o("div",z,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(l(),o(u,null,m(5,e=>t("div",{class:k(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:T({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const lt=h(R,[["render",Q],["__scopeId","data-v-3e75b4d4"]]);export{lt as default};
import{_ as h,W as g,g as b,c as o,b as t,d as n,m as y,y as f,C as x,w as r,j as c,a as l,f as v,F as u,h as m,n as k,s as T,t as i,k as _}from"./index-oBQzjt8-.js";import{O as A}from"./osmap-DL0KYfmh.js";import{L as w}from"./localeText-CuybU_0U.js";const R={name:"traceroute",components:{LocaleText:w,OSMap:A},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:g()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,b("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},M={class:"mt-md-5 mt-3 text-body"},S={class:"container-md"},$={class:"mb-3 text-body"},C={class:"d-flex gap-2 mb-3 flex-column"},L={class:"flex-grow-1"},P={class:"mb-1 text-muted",for:"ipAddress"},O=["disabled"],V=["disabled"],B={key:0,class:"d-block"},I={key:1,class:"d-block"},N={class:"position-relative"},z={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={scope:"col"},K={scope:"col"},W={scope:"col"},j={scope:"col"},U={scope:"col"},q={key:0},J={key:1};function Q(d,s,X,Y,Z,tt){const a=_("LocaleText"),p=_("OSMap");return l(),o("div",M,[t("div",S,[t("h3",$,[n(a,{t:"Traceroute"})]),t("div",C,[t("div",L,[t("label",P,[t("small",null,[n(a,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control rounded-3","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=x(e=>this.execute(),["enter"])),type:"text"},null,40,O),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 position-relative flex-grow-1",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(l(),o("span",I,s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)]))):(l(),o("span",B,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ")])))]),_:1})],8,V)]),t("div",N,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(l(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(a,{t:"Hop"})]),t("th",H,[n(a,{t:"IP Address"})]),t("th",K,[n(a,{t:"Average RTT (ms)"})]),t("th",W,[n(a,{t:"Min RTT (ms)"})]),t("th",j,[n(a,{t:"Max RTT (ms)"})]),t("th",U,[n(a,{t:"Geolocation"})])])]),t("tbody",null,[(l(!0),o(u,null,m(this.tracerouteResult,(e,et)=>(l(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,[t("samp",null,i(e.ip),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.avg_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.min_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.max_rtt),1)])]),t("td",null,[e.geo.city&&e.geo.country?(l(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):(l(),o("span",J," - "))])]))),256))])])])])):(l(),o("div",z,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(l(),o(u,null,m(5,e=>t("div",{class:k(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:T({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const lt=h(R,[["render",Q],["__scopeId","data-v-3e75b4d4"]]);export{lt as default};

View File

@@ -10,7 +10,7 @@
<link rel="icon" href="/static/app/dist/img/Logo-2-512x512.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WGDashboard</title>
<script type="module" crossorigin src="/static/app/dist/assets/index-CTj5x065.js"></script>
<script type="module" crossorigin src="/static/app/dist/assets/index-oBQzjt8-.js"></script>
<link rel="stylesheet" crossorigin href="/static/app/dist/assets/index-DFl-XeJT.css">
</head>
<body>

View File

@@ -1,12 +1,12 @@
{
"name": "app",
"version": "4.2.0",
"version": "4.2.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "app",
"version": "4.2.0",
"version": "4.2.3",
"dependencies": {
"@vue/language-server": "^2.1.10",
"@vuepic/vue-datepicker": "^9.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "app",
"version": "4.2.3",
"version": "4.2.5",
"private": true,
"type": "module",
"scripts": {

View File

@@ -42,7 +42,7 @@ export default {
description: this.selectedPeer.name,
hostName: this.dashboardStore.Configuration.Peers.remote_endpoint
}
data = JSON.stringify(awgQRCodeObject)
data = btoa(JSON.stringify(awgQRCodeObject))
}else{
data = res.data.file
}

View File

@@ -1,6 +1,5 @@
<script setup>
import LocaleText from "@/components/text/localeText.vue";
import AgentContainer from "@/components/navbarComponents/agentContainer.vue";
import {DashboardConfigurationStore} from "@/stores/DashboardConfigurationStore.js";
const emits = defineEmits(['close'])
@@ -29,7 +28,7 @@ const store = DashboardConfigurationStore()
<LocaleText t="You can visit our: "></LocaleText>
</p>
<div class="list-group">
<a href="https://donaldzou.github.io/WGDashboard-Documentation/"
<a href="https://docs.wgdashboard.dev/"
target="_blank" class="list-group-item list-group-item-action d-flex align-items-center">
<i class="bi bi-book-fill"></i>
<LocaleText class="ms-auto" t="Official Documentation"></LocaleText>

View File

@@ -52,7 +52,7 @@ onMounted(() => {
</div>
</div>
</a>
<a class="card text-decoration-none" href="https://donaldzou.github.io/WGDashboard-Documentation/" target="_blank">
<a class="card text-decoration-none" href="https://docs.wgdashboard.dev/" target="_blank">
<div class="card-body d-flex gap-4 align-items-center">
<h1 class="mb-0">
<i class="bi bi-hash"></i>

View File

@@ -72,7 +72,7 @@ const data = computed(() => {
</h6>
</div>
<div class="progress" role="progressbar" style="height: 6px">
<div class="progress-bar bg-success" :style="{width: `${data?.Disks.find(x => x.mountPoint === '/').percent}%` }"></div>
<div class="progress-bar bg-success" :style="{width: `${data?.Disks.find(x => x.mountPoint === '/') ? data?.Disks.find(x => x.mountPoint === '/').percent : data?.Disks[0].percent}%` }"></div>
</div>
<div class="d-flex mt-2 gap-1">
<StorageMount v-for="(disk, count) in data?.Disks"

View File

@@ -9,7 +9,6 @@ import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router/router.js'
import {DashboardConfigurationStore} from "@/stores/DashboardConfigurationStore.js";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
let Locale;
await fetch("/api/locale")
.then(res => res.json())
@@ -24,7 +23,6 @@ const pinia = createPinia();
pinia.use(({ store }) => {
store.$router = markRaw(router)
})
pinia.use(piniaPluginPersistedstate)
app.use(pinia)
const store = DashboardConfigurationStore()

View File

@@ -64,6 +64,11 @@
"lang_name": "German",
"lang_name_localized": "Deutsch"
},
{
"lang_id": "hu-hu",
"lang_name": "Hungarian",
"lang_name_localized": "Magyar"
},
{
"lang_id": "it-it",
"lang_name": "Italian",
@@ -84,6 +89,11 @@
"lang_name": "Polish",
"lang_name_localized": "Polski"
},
{
"lang_id": "pt-br",
"lang_name": "Portuguese (Brazil)",
"lang_name_localized": "Português (Brasil)"
},
{
"lang_id": "ru",
"lang_name": "Russian",

View File

@@ -307,63 +307,63 @@
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Bei der Massenerstellung wird der Name jedes Peers automatisch generiert, und die erlaubte IP wird der nächsten verfügbaren IP zugewiesen.",
"How many peers you want to add\\?": "Wie viele Peers möchtest du hinzufügen?",
"Adding\\.\\.\\.": "Füge hinzu...",
"Dashboard IP Address \\& Listen Port": "",
"Table": "",
"Search": "",
"Hop": "",
"Average RTT \\(ms\\)": "",
"Min RTT \\(ms\\)": "",
"Max RTT \\(ms\\)": "",
"You can visit our: ": "",
"Official Documentation": "",
"Discord Server": "",
"Are you sure to restore this backup\\?": "",
"Download": "",
"Display As": "",
"List": "",
"Grid": "",
"Protocol": "",
"Open File": "",
"Advanced Options": "",
"Allowed IPs Validation": "",
"Update Name": "",
"Dashboard IP Address \\& Listen Port": "Dashboard IP-Adresse & Empfangsport",
"Table": "Tabelle",
"Search": "Suchen",
"Hop": "Hop",
"Average RTT \\(ms\\)": "Durchschnittliche RTT ($1ms)",
"Min RTT \\(ms\\)": "Min RTT ($1ms)",
"Max RTT \\(ms\\)": "Max RTT ($1ms)",
"You can visit our: ": "Besuche unsere:",
"Official Documentation": "Offizielle Dokumentation",
"Discord Server": "Discord Server",
"Are you sure to restore this backup\\?": "Bist du sicher, dass du dieses Backup wiederherstellen möchtest?",
"Download": "Herunterladen",
"Display As": "Anzeigen als",
"List": "Liste",
"Grid": "Netz",
"Protocol": "Protokoll",
"Open File": "Datei öffnen",
"Advanced Options": "Erweiterte Optionen",
"Allowed IPs Validation": "Erlaubte IP\\'s Validierung",
"Update Name": "Name ändern",
"To update this configuration's name, WGDashboard will execute the following operations:": "",
"Duplicate current configuration's database table and \\.conf file with the new name": "",
"Delete current configuration's database table and \\.conf file": "",
"Danger Zone": "",
"Configuration File": "",
"Edit Raw Configuration File": "",
"Peer Configuration File": "",
"Share with Email": "",
"Email Account": "",
"Ready": "",
"Port": "",
"Encryption": "",
"No Encryption": "",
"Send From": "",
"Send Test Email": "",
"Email Body Template": "",
"Live Preview": "",
"Include configuration file as an attachment": "",
"Send": "",
"Sending\\.\\.\\.": "",
"Email sent successfully!": "",
"AmneziaWG Peer Setting": "",
"System Status": "",
"CPU": "",
"Memory": "",
"Danger Zone": "Gefahrenzone",
"Configuration File": "Konfigurationsdatei",
"Edit Raw Configuration File": "Bearbeiten der Konfigurationsdatei",
"Peer Configuration File": "Peer Konfigurationsdatei",
"Share with Email": "Per E-Mail teilen",
"Email Account": "E-Mail Konto",
"Ready": "Bereit",
"Port": "Port",
"Encryption": "Verschlüsselung",
"No Encryption": "Keine Verschlüsselung",
"Send From": "Gesendet von",
"Send Test Email": "Sende Test E-Mail",
"Email Body Template": "E-Mail Textvorlage",
"Live Preview": "Vorschau",
"Include configuration file as an attachment": "Konfigurationsdatei als Anhang beifügen",
"Send": "Senden",
"Sending\\.\\.\\.": "Senden\\.\\.\\.",
"Email sent successfully!": "E-Mail erfolgreich gesendet!",
"AmneziaWG Peer Setting": "AmneziaWG Peer-Einstellungen",
"System Status": "System Status",
"CPU": "CPU",
"Memory": "Arbeitsspeicher",
"Swap Memory": "",
"Processes": "",
"CPU Usage": "",
"Memory Usage": "",
"Swap Memory Usage": "",
"Network": "",
"([0-9]{1,}) Interfaces": "",
"Storage": "",
"([0-9]{1,}) Partitions": "",
"(.*) Used": "",
"Untitled Peer": "",
"Processes": "Prozesse",
"CPU Usage": "Auslastung",
"Memory Usage": "Auslastung",
"Swap Memory Usage": "Auslastung",
"Network": "Netzwerk",
"([0-9]{1,}) Interfaces": "$1 Interfaces",
"Storage": "Speicher",
"([0-9]{1,}) Partitions": "$1 Partionen",
"(.*) Used": "genutzt",
"Untitled Peer": "Unbenannter Peer",
"Who are you sending to\\?": "",
"What\\'s the subject\\?": "",
"What\\'s the body\\?": ""
}
"What\\'s the subject\\?": "Betreff",
"What\\'s the body\\?": "Inhalt"
}

View File

@@ -305,8 +305,8 @@
"Failed to allow access of peer (.*)": "Fallo de habilitar acceso del peer $1",
"Failed to save configuration through WireGuard": "Fallo de salvar configuración a través de WireGuard",
"Allow access successfully": "Acceso permitido con éxito",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Eliminados $1 peer(s)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Eliminados $1 peer(s) con éxito. Fallo al eliminar $2 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Restringidos $1 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Restringidos $1 peer(s) con éxito. Fallo al restringir $2 peer(s)"
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) eliminado(s)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) eliminado(s) con éxito. Fallo al eliminar $2 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s)",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s) con éxito. Fallo al restringir $2 peer(s)"
}

View File

@@ -0,0 +1,369 @@
{
"Welcome to": "Üdvözlünk a(z) ",
"Username": "Felhasználónév",
"Password": "Jelszó",
"OTP from your authenticator": "Egyszer használatos kód (OTP) az autentikátorodból",
"Sign In": "Bejelentkezés",
"Signing In\\.\\.\\.": "Bejelentkezés folyamatban...",
"Access Remote Server": "Távoli szerver elérése",
"Server": "Szerver",
"Click": "Kattintson",
"Pinging...": "Pingelés...",
"to add your server": "a szerver hozzáadásához",
"Server List": "Szerverlista",
"Sorry, your username or password is incorrect.": "Sajnáljuk, a felhasználónév vagy a jelszó hibás.",
"Home": "Főoldal",
"Settings": "Beállítások",
"Tools": "Eszközök",
"Sign Out": "Kijelentkezés",
"Checking for update...": "Frissítések ellenőrzése...",
"You're on the latest version": "Már a legfrissebb verziót használja",
"WireGuard Configurations": "WireGuard konfigurációk",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Még nincsenek WireGuard konfigurációi. Kérjük, ellenőrizze a konfigurációs mappát, vagy módosítsa a beállításoknál. Alapértelmezés szerint a mappa a /etc/wireguard.",
"Configuration": "Konfiguráció",
"Configurations": "Konfigurációk",
"Peers Default Settings": "Alapértelmezett társ beállítások",
"Dashboard Theme": "Vezérlőpanel téma",
"Light": "Világos",
"Dark": "Sötét",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Ez globálisan változik, és minden társ QR-kódjára és konfigurációs fájljára alkalmazva lesz.",
"WireGuard Configurations Settings": "WireGuard konfiguráció beállításai",
"Configurations Directory": "Konfigurációs könyvtár",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Ne felejtse el eltávolítani a '/' karaktert az útvonal végéről. (pl. /etc/wireguard)",
"WGDashboard Account Settings": "WGDashboard fiókbeállítások",
"Current Password": "Jelenlegi jelszó",
"New Password": "Új jelszó",
"Repeat New Password": "Új jelszó ismétlése",
"Update Password": "Jelszó frissítése",
"Multi-Factor Authentication \\(MFA\\)": "Többfaktoros hitelesítés (MFA)",
"Reset": "Visszaállítás",
"Setup": "Beállítás",
"API Keys": "API-kulcsok",
"API Key": "API-kulcs",
"Key": "Kulcs",
"Enabled": "Engedélyezve",
"Disabled": "Letiltva",
"No WGDashboard API Key": "Nincs WGDashboard API-kulcs",
"Expire At": "Lejár:",
"Are you sure to delete this API key\\?": "Biztosan törölni szeretné ezt az API-kulcsot?",
"Create API Key": "API-kulcs létrehozása",
"When should this API Key expire\\?": "Mikor járjon le ez az API-kulcs?",
"Never Expire": "Soha ne járjon le",
"Don't think that's a good idea": "Szerintem ez nem jó ötlet",
"Creating\\.\\.\\.": "Létrehozás...",
"Create": "Létrehozás",
"Status": "Állapot",
"On": "Bekapcsolva",
"Off": "Kikapcsolva",
"Turning On\\.\\.\\.": "Bekapcsolás...",
"Turning Off\\.\\.\\.": "Kikapcsolás...",
"Address": "Cím",
"Listen Port": "Port hallgatása",
"Table": "Táblázat",
"Public Key": "Nyilvános kulcs",
"Connected Peers": "Csatlakozott társak",
"Total Usage": "Teljes használat",
"Total Received": "Összes fogadott",
"Total Sent": "Összes elküldött",
"Peers Data Usage": "Társak adatforgalma",
"Real Time Received Data Usage": "Valós idejű fogadott forgalom",
"Real Time Sent Data Usage": "Valós idejű elküldött forgalom",
"Peer": "Társ",
"Peers": "Társak",
"Peer Settings": "Társ beállítások",
"Download All": "Összes letöltése",
"Search": "Keresés",
"Search Peers\\.\\.\\.": "Társak keresése...",
"Display": "Megjelenítés",
"Sort By": "Rendezés",
"Refresh Interval": "Frissítési időköz",
"Name": "Név",
"Allowed IPs": "Engedélyezett IP-k",
"Restricted": "Korlátozott",
"(.*) Seconds": "$1 másodperc",
"(.*) Minutes": "$1 perc",
"Configuration Settings": "Konfiguráció beállítások",
"Peer Jobs": "Társ feladatok",
"Active Jobs": "Aktív feladatok",
"All Active Jobs": "Összes aktív feladat",
"Logs": "Naplók",
"Private Key": "Privát kulcs",
"\\(Required for QR Code and Download\\)": "(Szükséges a QR-kódhoz és letöltéshez)",
"\\(Required\\)": "(Szükséges)",
"Endpoint Allowed IPs": "Végpont engedélyezett IP-k",
"DNS": "DNS",
"Optional Settings": "Opcionális beállítások",
"Pre-Shared Key": "Előre megosztott kulcs",
"MTU": "MTU",
"Persistent Keepalive": "Folyamatos keepalive",
"Reset Data Usage": "Adatforgalom visszaállítása",
"Total": "Összesen",
"Sent": "Elküldött",
"Received": "Fogadott",
"Revert": "Visszaállítás",
"Save Peer": "Társ mentése",
"QR Code": "QR-kód",
"Schedule Jobs": "Feladatok ütemezése",
"Job": "Feladat",
"Job ID": "Feladat azonosító",
"Unsaved Job": "Mentetlen feladat",
"This peer does not have any job yet\\.": "Ennek a társnak még nincs feladata.",
"if": "ha",
"is": "van",
"then": "akkor",
"larger than": "nagyobb mint",
"Date": "Dátum",
"Restrict Peer": "Társ korlátozása",
"Delete Peer": "Társ törlése",
"Edit": "Szerkesztés",
"Delete": "Törlés",
"Deleting...": "Törlés...",
"Cancel": "Mégse",
"Save": "Mentés",
"No active job at the moment\\.": "Jelenleg nincs aktív feladat.",
"Jobs Logs": "Feladatnaplók",
"Updated at": "Frissítve:",
"Refresh": "Frissítés",
"Filter": "Szűrés",
"Success": "Sikeres",
"Failed": "Sikertelen",
"Log ID": "Napló azonosító",
"Message": "Üzenet",
"Share Peer": "Társ megosztása",
"Currently the peer is not sharing": "A társ jelenleg nincs megosztva",
"Sharing\\.\\.\\.": "Megosztás...",
"Start Sharing": "Megosztás indítása",
"Stop Sharing\\.\\.\\.": "Megosztás leállítása...",
"Stop Sharing": "Megosztás leállítása",
"Access Restricted": "Hozzáférés korlátozva",
"Restrict Access": "Hozzáférés korlátozása",
"Restricting\\.\\.\\.": "Korlátozás...",
"Allow Access": "Hozzáférés engedélyezése",
"Allowing Access\\.\\.\\.": "Engedélyezés...",
"Download \\& QR Code is not available due to no private key set for this peer": "Letöltés és QR-kód nem érhető el, mert nincs beállított privát kulcs ehhez a társhoz",
"Add Peers": "Társ hozzáadása",
"Bulk Add": "Tömeges hozzáadás",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Társak tömeges hozzáadásakor minden társ neve automatikusan generálódik, és az engedélyezett IP a következő elérhető IP lesz.",
"How many peers you want to add\\?": "Hány társat szeretne hozzáadni?",
"You can add up to (.*) peers": "Legfeljebb $1 társat adhat hozzá",
"Use your own Private and Public Key": "Használja saját privát és nyilvános kulcsát",
"Enter IP Address/CIDR": "Adja meg az IP-címet/CIDR-t",
"IP Address/CIDR": "IP-cím/CIDR",
"or": "vagy",
"Pick Available IP": "Elérhető IP kiválasztása",
"No available IP containing": "Nincs elérhető IP, amely tartalmazza",
"Add": "Hozzáadás",
"Adding\\.\\.\\.": "Hozzáadás...",
"Failed to check available update": "Nem sikerült ellenőrizni a frissítéseket",
"Nice to meet you!": "Örülök, hogy megismerhetlek!",
"Please fill in the following fields to finish setup": "Töltse ki az alábbi mezőket a beállítás befejezéséhez",
"Create an account": "Fiók létrehozása",
"Enter an username you like": "Adja meg a kívánt felhasználónevet",
"Enter a password": "Adja meg a jelszót",
"\\(At least 8 characters and make sure is strong enough!\\)": "(Legalább 8 karakter, és legyen elég erős!)",
"Confirm password": "Jelszó megerősítése",
"Next": "Tovább",
"Saving\\.\\.\\.": "Mentés...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Kérjük, olvassa be az alábbi QR-kódot, hogy TOTP-t generáljon az Ön által választott autentikátorral",
"Or you can click the link below:": "Vagy kattintson az alábbi hivatkozásra:",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Adja meg az autentikátor által generált TOTP-t a megerősítéshez",
"TOTP verified!": "TOTP sikeresen ellenőrizve!",
"I don't need MFA": "Nincs szükségem MFA-ra",
"Complete": "Befejezés",
"(v[0-9.]{1,}) is now available for update!": "$1 frissíthető!",
"Current Version:": "Jelenlegi verzió:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Hoppá... Ez a hivatkozás lejárt vagy érvénytelen.",
"Scan QR Code with the WireGuard App to add peer": "Olvassa be a QR-kódot a WireGuard alkalmazással a társ hozzáadásához",
"or click the button below to download the ": "vagy kattintson az alábbi gombra a letöltéshez: ",
" file": " fájl",
"FROM ": "FORRÁS: ",
"(.*) is on": "$1 be van kapcsolva",
"(.*) is off": "$1 ki van kapcsolva",
"Allowed IPs is invalid": "Az engedélyezett IP-k érvénytelenek",
"Peer created successfully": "A társ sikeresen létrejött",
"Please fill in all required box": "Töltse ki az összes kötelező mezőt",
"Please specify amount of peers you want to add": "Adja meg, hány társat szeretne hozzáadni",
"No more available IP can assign": "Nincs több elérhető IP kiosztható",
"The maximum number of peers can add is (.*)": "A hozzáadható társak maximális száma: $1",
"Generating key pairs by bulk failed": "Nem sikerült tömegesen kulcspárokat generálni",
"Failed to add peers in bulk": "Nem sikerült tömegesen hozzáadni a társakat",
"This peer already exist": "Ez a társ már létezik",
"This IP is not available: (.*)": "Ez az IP nem elérhető: $1",
"Configuration does not exist": "A konfiguráció nem létezik",
"Peer does not exist": "A társ nem létezik",
"Please provide a valid configuration name": "Adjon meg érvényes konfigurációs nevet",
"Peer saved": "A társ mentve",
"Allowed IPs already taken by another peer": "Az engedélyezett IP-ket már egy másik társ foglalta le",
"Endpoint Allowed IPs format is incorrect": "A végpont engedélyezett IP-k formátuma helytelen",
"DNS format is incorrect": "A DNS formátum helytelen",
"MTU format is not correct": "Az MTU formátuma helytelen",
"Persistent Keepalive format is not correct": "A folyamatos keepalive formátuma helytelen",
"Private key does not match with the public key": "A privát kulcs nem egyeztethető a nyilvános kulccsal",
"Update peer failed when updating Pre-Shared Key": "A társ frissítése sikertelen volt az előre megosztott kulcs frissítésekor",
"Update peer failed when updating Allowed IPs": "A társ frissítése sikertelen volt az engedélyezett IP-k frissítésekor",
"Update peer failed when saving the configuration": "A társ frissítése sikertelen volt a konfiguráció mentésekor",
"Peer data usage reset successfully": "A társ adatforgalma sikeresen visszaállítva",
"Peer download started": "A társ letöltése elindult",
"Please specify one or more peers": "Jelöljön ki egy vagy több társat",
"Share link failed to create. Reason: (.*)": "Nem sikerült létrehozni a megosztási hivatkozást. Ok: $1",
"Link expire date updated": "A hivatkozás lejárati dátuma frissítve",
"Link expire date failed to update. Reason: (.*)": "A hivatkozás lejárati dátumának frissítése sikertelen. Ok: $1",
"Peer job saved": "A társ feladata mentve",
"Please specify job": "Adja meg a feladatot",
"Please specify peer and configuration": "Jelölje ki a társat és a konfigurációt",
"Peer job deleted": "A társ feladata törölve",
"API Keys function is successfully enabled": "Az API-kulcs funkció sikeresen engedélyezve",
"API Keys function is successfully disabled": "Az API-kulcs funkció sikeresen letiltva",
"API Keys function is failed to enable": "Az API-kulcs funkció engedélyezése sikertelen",
"API Keys function is failed to disable": "Az API-kulcs funkció letiltása sikertelen",
"WGDashboard API Keys function is disabled": "A WGDashboard API-kulcs funkció letiltva",
"WireGuard configuration path saved": "A WireGuard konfigurációs útvonal mentve",
"API Key deleted": "API-kulcs törölve",
"API Key created": "API-kulcs létrehozva",
"Sign in session ended, please sign in again": "A bejelentkezés lejárt, kérjük jelentkezzen be újra",
"Please specify an IP Address (v4/v6)": "Adjon meg egy IP-címet (v4/v6)",
"Please provide ipAddress and count": "Adja meg az IP-címet és a darabszámot",
"Please provide ipAddress": "Adja meg az IP-címet",
"Dashboard Language": "Vezérlőpanel nyelv",
"Dashboard language update failed": "A vezérlőpanel nyelvének frissítése sikertelen",
"Peer Remote Endpoint": "Társ távoli végpontja",
"New Configuration": "Új konfiguráció",
"Configuration Name": "Konfiguráció neve",
"Configuration name is invalid. Possible reasons:": "A konfiguráció neve érvénytelen. Lehetséges okok:",
"Configuration name already exist\\.": "A konfiguráció neve már létezik.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "A konfiguráció neve csak 15 kis- vagy nagybetűt, számokat, alulvonást, egyenlőségjelet, pluszjelet, pontot és kötőjelet tartalmazhat.",
"Invalid Port": "Érvénytelen port",
"Save Configuration": "Konfiguráció mentése",
"IP Address/CIDR is invalid": "Az IP-cím/CIDR érvénytelen",
"IP Address": "IP-cím",
"Enter IP Address / Hostname": "Adja meg az IP-címet / hosztnevet",
"IP Address / Hostname": "IP-cím / hosztnév",
"Dashboard IP Address \\& Listen Port": "Vezérlőpanel IP-cím és hallgató port",
"Count": "Darabszám",
"Hop": "Ugrás",
"Average RTT \\(ms\\)": "Átlagos RTT (ms)",
"Min RTT \\(ms\\)": "Minimum RTT (ms)",
"Max RTT \\(ms\\)": "Maximum RTT (ms)",
"Geolocation": "Földrajzi hely",
"Is Alive": "Élő?",
"Average / Min / Max Round Trip Time": "Átlagos / min / max oda-vissza idő",
"Sent / Received / Lost Package": "Elküldött / fogadott / elveszett csomag",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "A WGDashboard kézi újraindítása szükséges az IP-cím és a portváltoztatások alkalmazásához",
"Restore Configuration": "Konfiguráció visszaállítása",
"Step (.*)": "Lépés $1",
"Select a backup you want to restore": "Válasszon egy visszaállítandó biztonsági másolatot",
"Click to change a backup": "Kattintson a biztonsági mentés megváltoztatásához",
"Selected Backup": "Kiválasztott mentés",
"You don't have any configuration to restore": "Nincs visszaállítandó konfigurációja",
"Help": "Súgó",
"You can visit our: ": "Látogasson el ide:",
"Official Documentation": "Hivatalos dokumentáció",
"Discord Server": "Discord szerver",
"Backup": "Biztonsági mentés",
"([0-9].*) Backups\\?": "$1 mentés?",
"Yes": "Igen",
"No": "Nem",
"Backup not selected": "Nincs kiválasztva mentés",
"Confirm \\& edit restore information": "Visszaállítási információk megerősítése és szerkesztése",
"(.*) Available IP Address": "$1 elérhető IP-cím",
"Database File": "Adatbázis fájl",
"Contain": "Tartalmaz",
"Restricted Peers\\?": "Korlátozott társak?",
"Restore": "Visszaállítás",
"Restoring": "Visszaállítás folyamatban",
"WGDashboard Settings": "WGDashboard beállítások",
"Peers Settings": "Társ beállítások",
"WireGuard Configuration Settings": "WireGuard konfiguráció beállítások",
"Appearance": "Megjelenés",
"Theme": "Téma",
"Language": "Nyelv",
"Account Settings": "Fiókbeállítások",
"Peer Default Settings": "Társ alapértelmezett beállítások",
"Toggle When Start Up": "Indításkor törlése",
"Other Settings": "Egyéb beállítások",
"Select Peers": "Társak kiválasztása",
"Backup & Restore": "Mentés és visszaállítás",
"Delete Configuration": "Konfiguráció törlése",
"Create Backup": "Biztonsági mentés létrehozása",
"No backup yet, click the button above to create backup\\.": "Még nincs mentés, kattintson a fenti gombra a mentés létrehozásához.",
"Are you sure to delete this backup\\?": "Biztosan törölni szeretné ezt a mentést?",
"Are you sure to restore this backup\\?": "Biztosan visszaállítja ezt a mentést?",
"Backup Date": "Mentés dátuma",
"File": "Fájl",
"Are you sure to delete this configuration\\?": "Biztosan törölni szeretné ezt a konfigurációt?",
"Once you deleted this configuration\\:": "Ha törli ezt a konfigurációt:",
"All connected peers will get disconnected": "Minden kapcsolódott társ le lesz választva",
"Both configuration file \\(.conf\\) and database table related to this configuration will get deleted": "A konfigurációhoz tartozó .conf fájl és adatbázis tábla is törlődik",
"Checking backups...": "Mentések ellenőrzése...",
"This configuration have ([0-9].*) backups": "Ennél a konfigurációnál $1 mentés van",
"This configuration have no backup": "Ennél a konfigurációnál nincs mentés",
"If you're sure, please type in the configuration name below and click Delete": "Ha biztos, írja be a konfiguráció nevét alább, és kattintson a Törlésre",
"Select All": "Összes kiválasztása",
"Clear Selection": "Kiválasztás törlése",
"([0-9].*) Peers\\?": "$1 társ?",
"Download": "Letöltés",
"Downloading": "Letöltés...",
"Download Finished": "Letöltés befejezve",
"Done": "Kész",
"Are you sure to delete": "Biztosan törölni szeretné",
"Are you sure to delete this peer\\?": "Biztosan törölni szeretné ezt a társat?",
"Configuration deleted": "Konfiguráció törölve",
"Configuration saved": "Konfiguráció mentve",
"WGDashboard language update failed": "A WGDashboard nyelvének frissítése sikertelen",
"Configuration restored": "Konfiguráció visszaállítva",
"Allowed IP already taken by another peer": "Az engedélyezett IP-t már egy másik társ használja",
"Failed to allow access of peer (.*)": "Nem sikerült engedélyezni a hozzáférést a társ számára: $1",
"Failed to save configuration through WireGuard": "Nem sikerült menteni a konfigurációt WireGuardon keresztül",
"Allow access successfully": "Hozzáférés sikeresen engedélyezve",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Törölve $1 társ",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Sikeresen törölve $1 társ. $2 társ törlése sikertelen",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Korlátozva $1 társ",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Sikeresen korlátozva $1 társ. $2 társ korlátozása sikertelen",
"Display As": "Megjelenítés",
"List": "Lista",
"Grid": "Rács",
"Protocol": "Protokoll",
"Open File": "Fájl megnyitása",
"Advanced Options": "Haladó beállítások",
"Allowed IPs Validation": "Engedélyezett IP-k érvényesítése",
"Update Name": "Név frissítése",
"To update this configuration's name, WGDashboard will execute the following operations:": "A konfiguráció nevének frissítéséhez a WGDashboard a következő műveleteket hajtja végre:",
"Duplicate current configuration's database table and \\..\\.conf file with the new name": "A jelenlegi konfiguráció adatbázis táblájának és .conf fájljának másolása az új névvel",
"Delete current configuration's database table and \\..\\.conf file": "A jelenlegi konfiguráció adatbázis táblájának és .conf fájljának törlése",
"Danger Zone": "Veszélyes zóna",
"Configuration File": "Konfigurációs fájl",
"Edit Raw Configuration File": "Nyers konfigurációs fájl szerkesztése",
"Peer Configuration File": "Társ konfigurációs fájl",
"Share with Email": "Megosztás e-mailben",
"Email Account": "E-mail fiók",
"Ready": "Kész",
"Port": "Port",
"Encryption": "Titkosítás",
"No Encryption": "Nincs titkosítás",
"Send From": "Feladó",
"Send Test Email": "Teszt e-mail küldése",
"Email Body Template": "E-mail törzs sablon",
"Live Preview": "Élő előnézet",
"Include configuration file as an attachment": "Konfigurációs fájl mellékletként csatolása",
"Send": "Küldés",
"Sending\\.\\.\\.": "Küldés...",
"Email sent successfully!": "Az e-mail sikeresen elküldve!",
"AmneziaWG Peer Setting": "AmneziaWG társ beállítás",
"System Status": "Rendszerállapot",
"CPU": "CPU",
"Memory": "Memória",
"Swap Memory": "Swap memória",
"Processes": "Folyamatok",
"CPU Usage": "CPU használat",
"Memory Usage": "Memória használat",
"Swap Memory Usage": "Swap memória használat",
"Network": "Hálózat",
"([0-9]{1,}) Interfaces": "$1 interfész",
"Storage": "Tároló",
"([0-9]{1,}) Partitions": "$1 partíció",
"(.*) Used": "$1 használva",
"Untitled Peer": "Névtelen társ",
"Who are you sending to\\?": "Kinek küldi?",
"What\\'s the subject\\?": "Mi a tárgy?",
"What\\'s the body\\?": "Mi a szövegtörzs?"
}

View File

@@ -296,7 +296,7 @@
"Adding\\.\\.\\.": "Toevoegen...",
"Configuration name already exist\\.": "Configuratienaam bestaat al.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "De configuratienaam mag alleen uit 15 tekens bestaan, inclusief hoofd-/kleine letters, cijfers, onderstrepingsteken, gelijkteken, plusteken, punt en koppelteken.",
"Dashboard IP Address \\& Listen Port": "",
"Dashboard IP Address \\& Listen Port": "Dashboard IP-adres & Luisterpoort",
"Confirm \\& edit restore information": "Bevestigen & herstelinformatie bewerken",
"No backup yet, click the button above to create backup\\.": "Nog geen back-up, klik op de knop hierboven om een back-up te maken.",
"Are you sure to delete this backup\\?": "Weet je zeker dat je deze back-up wilt verwijderen?",
@@ -308,62 +308,53 @@
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) succesvol verwijderd. Het verwijderen van $2 peer(s) is mislukt",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) beperkt",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) succesvol beperkt. Het beperken van $2 peer(s) is mislukt",
"Table": "",
"Search": "",
"Hop": "",
"Average RTT \\(ms\\)": "",
"Min RTT \\(ms\\)": "",
"Max RTT \\(ms\\)": "",
"You can visit our: ": "",
"Official Documentation": "",
"Discord Server": "",
"Are you sure to restore this backup\\?": "",
"Download": "",
"Display As": "",
"List": "",
"Grid": "",
"Protocol": "",
"Open File": "",
"Advanced Options": "",
"Allowed IPs Validation": "",
"Update Name": "",
"To update this configuration's name, WGDashboard will execute the following operations:": "",
"Duplicate current configuration's database table and \\.conf file with the new name": "",
"Delete current configuration's database table and \\.conf file": "",
"Danger Zone": "",
"Configuration File": "",
"Edit Raw Configuration File": "",
"Peer Configuration File": "",
"Share with Email": "",
"Email Account": "",
"Ready": "",
"Port": "",
"Encryption": "",
"No Encryption": "",
"Send From": "",
"Send Test Email": "",
"Email Body Template": "",
"Live Preview": "",
"Include configuration file as an attachment": "",
"Send": "",
"Sending\\.\\.\\.": "",
"Email sent successfully!": "",
"AmneziaWG Peer Setting": "",
"System Status": "",
"CPU": "",
"Memory": "",
"Swap Memory": "",
"Processes": "",
"CPU Usage": "",
"Memory Usage": "",
"Swap Memory Usage": "",
"Network": "",
"([0-9]{1,}) Interfaces": "",
"Storage": "",
"([0-9]{1,}) Partitions": "",
"(.*) Used": "",
"Untitled Peer": "",
"Who are you sending to\\?": "",
"What\\'s the subject\\?": "",
"What\\'s the body\\?": ""
"Search": "Zoeken",
"Download": "Download",
"Display As": "Weergeven Als",
"List": "Lijst",
"Grid": "Raster",
"Protocol": "Protocol",
"Open File": "Bestand Openen",
"Advanced Options": "Geavanceerde Opties",
"Allowed IPs Validation": "Allowed IPs validatie",
"Update Name": "Naam Bijwerken",
"To update this configuration's name, WGDashboard will execute the following operations:": "Om deze configuratie bij te werken zal WGDashboard de volgende bewerkingen uitvoeren:",
"Duplicate current configuration's database table and \\.conf file with the new name": "Dupliceer de database-tabel en het .conf-bestand van de huidige configuratie met de nieuwe naam",
"Delete current configuration's database table and \\.conf file": "Verwijder de database-tabel en het .conf-bestand van de huidige configuratie",
"Danger Zone": "Gevarenzone",
"Configuration File": "Configuratiebestand",
"Edit Raw Configuration File": "Bewerk Ruwe Configuratiebestand",
"Peer Configuration File": "Peer-configuratiebestand",
"Share with Email": "Delen via E-mail",
"Who are you sending to?": "Naar wie stuur je het?",
"What's the subject?": "Wat is het onderwerp?",
"What's the body?": "Wat is de inhoud?",
"Email Account": "E-mailaccount",
"Ready": "Klaar",
"Port": "Poort",
"Encryption": "Encryptie",
"No Encryption": "Geen Encryptie",
"Send From": "Verzenden vanaf",
"Send Test Email": "Testmail verzenden",
"Email Body Template": "E-mail Inhoud Template",
"Live Preview": "Live voorbeeld",
"Include configuration file as an attachment": "Configuratiebestand als bijlage toevoegen",
"Send": "Verzenden",
"Sending\\.\\.\\.": "Bezig Met Verzenden...",
"Email sent successfully!": "E-mail succesvol verzonden",
"AmneziaWG Peer Setting": "AmneziaWG Peer-instellingen",
"System Status": "Systeemstatus",
"CPU": "CPU",
"Memory": "Geheugen",
"Swap Memory": "Swap-geheugen",
"Processes": "Processen",
"CPU Usage": "CPU-verbruik",
"Memory Usage": "Geheugenverbruik",
"Swap Memory Usage": "Swap-geheugenverbruik",
"Network": "Netwerk",
"([0-9]{1,}) Interfaces": "([0-9]{1,}) Interfaces",
"Storage": "Opslag",
"([0-9]{1,}) Partitions": "([0-9]{1,}) Partities",
"(.*) Used": "(.*) Gebruikt",
"Untitled Peer": "Naamloze Peer"
}

View File

@@ -0,0 +1,369 @@
{
"Welcome to": "Bem vindo ao",
"Username": "Usuário",
"Password": "Senha",
"OTP from your authenticator": "Senha de uso único do seu autenticador",
"Sign In": "Entrar",
"Signing In\\.\\.\\.": "Entrando...",
"Access Remote Server": "Acessar Servidor Remoto",
"Server": "Servidor",
"Click": "Clique",
"Pinging...": "Ping em andamento...",
"to add your server": "para adicionar seu servidor",
"Server List": "Lista de Servidores",
"Sorry, your username or password is incorrect.": "Desculpe, seu usuário ou senha está incorreto.",
"Home": "Página principal",
"Settings": "Definições",
"Tools": "Ferramentas",
"Sign Out": "Sair",
"Checking for update...": "Verificando atualizações...",
"You're on the latest version": "Você está na versão mais recente",
"WireGuard Configurations": "Cofigurações do WireGuard",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Você ainda não tem nenhuma configuração do WireGuard. Verifique a pasta de configurações ou altere-a nas Definições. Por padrão, a pasta é /etc/wireguard.",
"Configuration": "Configuração",
"Configurations": "Configurações",
"Peers Default Settings": "Definições Padrão dos Peers",
"Dashboard Theme": "Tema do Painel",
"Light": "Claro",
"Dark": "Escuro",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Estes itens serão alterados globalmente, e serão aplicados a todos os QR codes e arquivos de configuração dos peers.",
"WireGuard Configurations Settings": "Definições de Configurações do WireGuard",
"Configurations Directory": "Diretório de Configurações",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Certifique-se de remover / no final do caminho. Exemplo: /etc/wireguard",
"WGDashboard Account Settings": "Definições da Conta do WGDashboard",
"Current Password": "Senha Atual",
"New Password": "Nova Senha",
"Repeat New Password": "Repetir Nova Senha",
"Update Password": "Atualizar Senha",
"Multi-Factor Authentication \\(MFA\\)": "Autenticação em duas etapas (MFA)",
"Reset": "Redefinir",
"Setup": "Definir",
"API Keys": "Chaves de API",
"API Key": "Chave de API",
"Key": "Chave",
"Enabled": "Habilitado",
"Disabled": "Desabilitado",
"No WGDashboard API Key": "Nenhuma Chave de API do WGDashboard",
"Expire At": "Expira Em",
"Are you sure to delete this API key\\?": "Tem certeza que deseja remover esta chave de API?",
"Create API Key": "Criar Chave de API",
"When should this API Key expire\\?": "Quando esta Chave de API deve expirar?",
"Never Expire": "Nunca Expira",
"Don't think that's a good idea": "Não acho que seja uma boa ideia",
"Creating\\.\\.\\.": "Criando...",
"Create": "Criar",
"Status": "Status",
"On": "Ligado",
"Off": "Desligado",
"Turning On\\.\\.\\.": "Ligando...",
"Turning Off\\.\\.\\.": "Desligando...",
"Address": "Endereço",
"Listen Port": "Porta",
"Table": "Tabela",
"Public Key": "Chave Pública",
"Connected Peers": "Peers Conectados",
"Total Usage": "Uso Total",
"Total Received": "Total Recebido",
"Total Sent": "Total Enviado",
"Peers Data Usage": "Uso de Dados dos Peers",
"Real Time Received Data Usage": "Uso de Dados Recebidos em Tempo Real",
"Real Time Sent Data Usage": "Uso de Dados Enviados em Tempo Real",
"Peer": "Peer",
"Peers": "Peers",
"Peer Settings": "Definições do Peer",
"Download All": "Baixar Todos",
"Search": "Buscar",
"Search Peers\\.\\.\\.": "Buscando em Peers...",
"Display": "Mostrar",
"Sort By": "Ordenar Por",
"Refresh Interval": "Intervalo de Atualização",
"Name": "Nome",
"Allowed IPs": "IPs Permitidos",
"Restricted": "Restrito",
"(.*) Seconds": "$1 Segundos",
"(.*) Minutes": "$1 Minutos",
"Configuration Settings": "Definição de Configuração",
"Peer Jobs": "Jobs do Peer",
"Active Jobs": "Jobs Ativos",
"All Active Jobs": "Todos os Jobs Ativos",
"Logs": "Logs",
"Private Key": "Chave Privada",
"\\(Required for QR Code and Download\\)": "(Obrigatório para QR Code e Download)",
"\\(Required\\)": "(Obrigatório)",
"Endpoint Allowed IPs": "Endeços IP Permitidos do Endpoint",
"DNS": "DNS",
"Optional Settings": "Definições Opcionais",
"Pre-Shared Key": "Chave Pré-Compartilhada",
"MTU": "MTU",
"Persistent Keepalive": "Keepalive Persistente",
"Reset Data Usage": "Redefinir Uso de Dados",
"Total": "Total",
"Sent": "Enviado",
"Received": "Recebido",
"Revert": "Reverter",
"Save Peer": "Salvar Peer",
"QR Code": "QR Code",
"Schedule Jobs": "Agendar Jobs",
"Job": "Job",
"Job ID": "ID do Job",
"Unsaved Job": "Job não salvo",
"This peer does not have any job yet\\.": "Este peer ainda não tem nenhum job.",
"if": "se",
"is": "é",
"then": "então",
"larger than": "maior que",
"Date": "Data",
"Restrict Peer": "Peer Restrito",
"Delete Peer": "Remover Peer",
"Edit": "Editar",
"Delete": "Remover",
"Deleting...": "Removendo...",
"Cancel": "Cancelar",
"Save": "Salvar",
"No active job at the moment\\.": "Nenhum job ativo no momento.",
"Jobs Logs": "Logs de Jobs",
"Updated at": "Atualizado em",
"Refresh": "Atualizar",
"Filter": "Filtrar",
"Success": "Sucesso",
"Failed": "Falhou",
"Log ID": "ID do Log",
"Message": "Mensagem",
"Share Peer": "Compartilhar Peer",
"Currently the peer is not sharing": "No momento o peer não está compartilhando",
"Sharing\\.\\.\\.": "Compartilhando...",
"Start Sharing": "Iniciar Compartilhamento",
"Stop Sharing\\.\\.\\.": "Parar Compartilhamento...",
"Stop Sharing": "Parar Compartilhamento",
"Access Restricted": "Acesso Restrito",
"Restrict Access": "Restringir Acesso",
"Restricting\\.\\.\\.": "Restringindo...",
"Allow Access": "Permitir Acesso",
"Allowing Access\\.\\.\\.": "Permitindo Acesso...",
"Download \\& QR Code is not available due to no private key set for this peer": "Download & QR Code não estão disponíveis devido à ausência de chave privada definida para este peer",
"Add Peers": "Adicionar Peers",
"Bulk Add": "Adicionar Vários",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Ao gerar vários Peers, o nome de cada peer será gerado automaticamente, e o IP será atribuído ao próximo IP disponível.",
"How many peers you want to add\\?": "Quantos peers você quer adicionar?",
"You can add up to (.*) peers": "Você pode adicionar até $1 peers",
"Use your own Private and Public Key": "Use sua própria Chave Privada e Pública",
"Enter IP Address/CIDR": "Digite Endereço IP/CIDR",
"IP Address/CIDR": "Endereço IP/CIDR",
"or": "ou",
"Pick Available IP": "Selecione um IP Disponível",
"No available IP containing": "Nenhum IP disponível contendo",
"Add": "Adicionar",
"Adding\\.\\.\\.": "Adcionando...",
"Failed to check available update": "Erro ao verificar atualização disponível",
"Nice to meet you!": "Bom te conhecer!",
"Please fill in the following fields to finish setup": "Preencha os seguintes campos para finalizar a configuração",
"Create an account": "Crie uma conta",
"Enter an username you like": "Digite um nome de usuário",
"Enter a password": "Digite uma senha",
"\\(At least 8 characters and make sure is strong enough!\\)": "(Pelo menos 8 caracteres e certifique-se de que seja forte o suficiente!)",
"Confirm password": "Confirme a senha",
"Next": "Próximo",
"Saving\\.\\.\\.": "Salvando...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Escaneie o seguinte QR Code para gerar um código de uso único com um autenticador de sua escolha",
"Or you can click the link below:": "Ou clique no link abaixo:",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Digite o código de uso único gerado pelo seu autenticador para verificar",
"TOTP verified!": "Código de uso único verificado!",
"I don't need MFA": "Não preciso de autenticação em duas etapas (MFA)",
"Complete": "Completar",
"(v[0-9.]{1,}) is now available for update!": "$1 está disponível para atualização!",
"Current Version:": "Versão Atual:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Ops... Este link é inválido ou expirou.",
"Scan QR Code with the WireGuard App to add peer": "Escaneie o QR Code com o App WireGuard para adicionar o peer",
"or click the button below to download the ": "ou clique no botão abaixo para baixar o ",
" file": " arquivo",
"FROM ": "DE ",
"(.*) is on": "$1 está ligado",
"(.*) is off": "$1 está desligado",
"Allowed IPs is invalid": "IPs Permitidos inválido",
"Peer created successfully": "Peer criado com sucesso",
"Please fill in all required box": "Preencha todas as caixas obrigatórias",
"Please specify amount of peers you want to add": "Especifique a quantidade de peers que você deseja adicionar",
"No more available IP can assign": "Não há mais IPs disponíveis para atribuir",
"The maximum number of peers can add is (.*)": "O número máximo de peers que podem ser adicionados é $1",
"Generating key pairs by bulk failed": "Gerar vários pares de chaves falhou",
"Failed to add peers in bulk": "Erro ao adicionar múltiplos peers",
"This peer already exist": "Este peer já existe",
"This IP is not available: (.*)": "Este IP não está disponível: $1",
"Configuration does not exist": "Configuração não existe",
"Peer does not exist": "Peer não existe",
"Please provide a valid configuration name": "Informe um nome de configuração válido",
"Peer saved": "Peer salvo",
"Allowed IPs already taken by another peer": "IPs Permitidos já estão sendo usados por outro peer",
"Endpoint Allowed IPs format is incorrect": "Formato dos IPs Permitidos do Endpoint está incorreta",
"DNS format is incorrect": "Formato do DNS está incorreto",
"MTU format is not correct": "Formato do MTU está incorreto",
"Persistent Keepalive format is not correct": "Formato do Keepalive Persistente está incorreto",
"Private key does not match with the public key": "Chave privada não corresponde com a chave pública",
"Update peer failed when updating Pre-Shared Key": "Atualização do peer falhou ao atualizar a Chave Pré-Compartilhada",
"Update peer failed when updating Allowed IPs": "Atualização do peer falhou ao atualizar os IPs Permitidos",
"Update peer failed when saving the configuration": "Atualização do peer falhou ao salvar a configuração",
"Peer data usage reset successfully": "Uso de dados do peer redefinido com sucesso",
"Peer download started": "Download do peer iniciado",
"Please specify one or more peers": "Especifique um ou mais peers",
"Share link failed to create. Reason: (.*)": "Erro ao criar link de compartilhamento. Motivo: $1",
"Link expire date updated": "Data de expiração do link atualizada",
"Link expire date failed to update. Reason: (.*)": "Erro ao atualizar a data de expiração do link. Motivo: $1",
"Peer job saved": "Job do peer salvo",
"Please specify job": "Especifique o job",
"Please specify peer and configuration": "Especifique o peer e a configuração",
"Peer job deleted": "Job do peer removido",
"API Keys function is successfully enabled": "Recurso de Chaves API está habilitado",
"API Keys function is successfully disabled": "Recurso de Chaves API está desabilitado",
"API Keys function is failed to enable": "Falha ao habilitar recurso de Chaves API",
"API Keys function is failed to disable": "Falha ao desabilitar recurso de Chaves API",
"WGDashboard API Keys function is disabled": "Recurso de Chaves de API do WGDashboard está desabilitada",
"WireGuard configuration path saved": "Caminho do arquivo de configuração WireGuard salvo",
"API Key deleted": "Chave de API removida",
"API Key created": "Chave de API criada",
"Sign in session ended, please sign in again": "Sessão encerrada. Por favor, entre novamente",
"Please specify an IP Address (v4/v6)": "Especifique um endereço IP (v4/v6)",
"Please provide ipAddress and count": "Especifique endereço IP e quantidade",
"Please provide ipAddress": "Especifique endereço IP",
"Dashboard Language": "Idioma do Painel",
"Dashboard language update failed": "Atualização do idioma do painel falhou",
"Peer Remote Endpoint": "Endpoint Remoto do Peer",
"New Configuration": "Nova Configuração",
"Configuration Name": "Nome de Configuração",
"Configuration name is invalid. Possible reasons:": "Nome de configuração é inválido. Possíveis razões:",
"Configuration name already exist\\.": "Nome de configuração já existe\\.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Nome de configuração pode conter apenas 15 caracteres alfanuméricos, sublinhado, igual, mais, ponto e hífen.",
"Invalid Port": "Porta Inválida",
"Save Configuration": "Salvar Configuração",
"IP Address/CIDR is invalid": "Endereço IP/CIDR inválido",
"IP Address": "Endereço IP",
"Enter IP Address / Hostname": "Digite Endereço IP / Nome do Host",
"IP Address / Hostname": "Endereço IP / Nome do Host",
"Dashboard IP Address \\& Listen Port": "Endereço IP do Painel e Porta",
"Count": "Quantidade",
"Hop": "Salto",
"Average RTT \\(ms\\)": "RTT médio (ms)",
"Min RTT \\(ms\\)": "RTT mínimo (ms)",
"Max RTT \\(ms\\)": "RTT máximo (ms)",
"Geolocation": "Geolocalização",
"Is Alive": "Está Ativo",
"Average / Min / Max Round Trip Time": "Média / Mínimo / Máximo do Tempo de Ida e Volta (Round Trip)",
"Sent / Received / Lost Package": "Enviado / Recebido / Pacotes Perdidos",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "É necessário reiniciar o WGDashboard para aplicar as mudanças de Endereço IP e Porta",
"Restore Configuration": "Restaurar Configuração",
"Step (.*)": "Passo (.*)",
"Select a backup you want to restore": "Selecione o backup que deseja restaurar",
"Click to change a backup": "Clique para alterar um backup",
"Selected Backup": "Backup Selecionado",
"You don't have any configuration to restore": "Você não tem configurações para restaurar",
"Help": "Ajuda",
"You can visit our: ": "Você pode visitar nosso: ",
"Official Documentation": "Documentação Oficial",
"Discord Server": "Servidor do Discord",
"Backup": "Backup",
"([0-9].*) Backups?": "([0-9].*) Backups?",
"Yes": "Sim",
"No": "Não",
"Backup not selected": "Backup não selecionado",
"Confirm \\& edit restore information": "Confirmar \\& editar informações de restauração",
"(.*) Available IP Address": "$1 endereço IP disponível",
"Database File": "Arquivo de Banco de Dados",
"Contain": "Contém",
"Restricted Peers?": "Peers Restritos?",
"Restore": "Restaurar",
"Restoring": "Restaurando",
"WGDashboard Settings": "Configurações do WGDashboard",
"Peers Settings": "Configurações dos Peers",
"WireGuard Configuration Settings": "Definições de Configuração WireGuard",
"Appearance": "Aparência",
"Theme": "Tema",
"Language": "Idioma",
"Account Settings": "Definições de Conta",
"Peer Default Settings": "Definições Padrão do Peer",
"Toggle When Start Up": "Ativar Quanto Iniciar",
"Other Settings": "Outras Definições",
"Select Peers": "Selecione Peers",
"Backup & Restore": "Backup e Restauração",
"Delete Configuration": "Remover Configuração",
"Create Backup": "Criar Backup",
"No backup yet, click the button above to create backup\\.": "Nenhum backup, clique no botão acima para criar um backup.",
"Are you sure to delete this backup\\?": "Tem certeza de que deseja remover este backup?",
"Are you sure to restore this backup\\?": "Tem certeza de que deseja restaurar este backup?",
"Backup Date": "Data do Backup",
"File": "Arquivo",
"Are you sure to delete this configuration\\?": "Tem certeza de que deseja remover esta configuração?",
"Once you deleted this configuration\\:": "Uma vez que remover esta configuração:",
"All connected peers will get disconnected": "Todos peers conectados serão desconectados",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Ambos tabela do banco de dados e arquivo de configuração (.conf) desta configuração serão removidos",
"Checking backups...": "Verificando backups...",
"This configuration have ([0-9].*) backups": "Esta configuração tem $1 backups",
"This configuration have no backup": "Esta configuração não tem backups",
"If you're sure, please type in the configuration name below and click Delete": "Se você tem certeza, confirme o nome da configuração abaixo e clique em Remover",
"Select All": "Selecionar Todos",
"Clear Selection": "Limpar Seleção",
"([0-9].*) Peers?": "$1 Peers?",
"Download": "Baixar",
"Downloading": "Baixando",
"Download Finished": "Download Concluído",
"Done": "Pronto",
"Are you sure to delete": "Tem certeza de que deseja remover",
"Are you sure to delete this peer\\?": "Tem certeza de que deseja remover este peer?",
"Configuration deleted": "Configuração removida",
"Configuration saved": "Configuração salva",
"WGDashboard language update failed": "Falha ao atualizar idioma do WGDashboard",
"Configuration restored": "Configuração restaurada",
"Allowed IP already taken by another peer": "Endereço IP já está em uso por outro peer",
"Failed to allow access of peer (.*)": "Falha ao permitir acesso ao peer $1",
"Failed to save configuration through WireGuard": "Falha ao salvar configuração pelo WGDashboard",
"Allow access successfully": "Acesso permitido com sucesso",
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) removido(s)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) removido(s) com sucesso. Falha ao remover $2 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s)",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s) com sucesso. Falha ao restringir $2 peer(s)",
"Display As": "Mostrar Como",
"List": "Lista",
"Grid": "Grid",
"Protocol": "Protocolo",
"Open File": "Abrir Arquivo",
"Advanced Options": "Opções Avançadas",
"Allowed IPs Validation": "Validação de IPs Permitidos",
"Update Name": "Atualizar Nome",
"To update this configuration's name, WGDashboard will execute the following operations:": "Para atualizar este nome de configuração, o WGDashboard vaoi executar as seguintes operações:",
"Duplicate current configuration's database table and \\.conf file with the new name": "Duplicar tabela do banco de dados e arquivo .conf da configuração atual com novo nome",
"Delete current configuration's database table and \\.conf file": "Remover tabela do banco de dados e arquivo .conf da configuração atual",
"Danger Zone": "Zona de Perigo",
"Configuration File": "Arquivo de Configuração",
"Edit Raw Configuration File": "Editar Conteúdo do Arquivo de Configuração",
"Peer Configuration File": "Arquivo de Configuração do Peer",
"Share with Email": "Compartilhar com Email",
"Email Account": "Conta de Email",
"Ready": "Pronto",
"Port": "Porta",
"Encryption": "Criptografia",
"No Encryption": "Sem Criptografia",
"Send From": "Enviar de",
"Send Test Email": "Enviar Email de Teste",
"Email Body Template": "Modelo de Corpo de Email",
"Live Preview": "Prévia ao vivo",
"Include configuration file as an attachment": "Incluir arquivo de configuração como anexo",
"Send": "Enviar",
"Sending\\.\\.\\.": "Enviando...",
"Email sent successfully!": "Email enviado com sucesso!",
"AmneziaWG Peer Setting": "Definições de Peer do AmneziaWG",
"System Status": "Status do Sistema",
"CPU": "CPU",
"Memory": "Memória",
"Swap Memory": "Memória Swap",
"Processes": "Processos",
"CPU Usage": "Uso de CPU",
"Memory Usage": "Uso de Memória",
"Swap Memory Usage": "Uso de Memória Swap",
"Network": "Rede",
"([0-9]{1,}) Interfaces": "$1 Interfaces",
"Storage": "Armazenamento",
"([0-9]{1,}) Partitions": "$1 Repartições",
"(.*) Used": "$1 Usado",
"Untitled Peer": "Peer Sem Nome",
"Who are you sending to\\?": "Para quem você está enviando?",
"What\\'s the subject\\?": "Qual o título?",
"What\\'s the body\\?": "Qual a mensagem?"
}

View File

@@ -83,7 +83,7 @@ _installPython(){
{ printf "\n\n [Installing Python] [%s] \n\n""$(date)"; } >> ./log/install.txt
printf "[WGDashboard] %s Installing Python\n" "$install"
case "$OS" in
ubuntu|debian)
ubuntu|debian|raspbian)
{ sudo apt update ; sudo apt-get install -y python3 net-tools; printf "\n\n"; } >> ./log/install.txt
;;
centos|fedora|redhat|rhel|almalinux|rocky)
@@ -116,7 +116,7 @@ _installPythonVenv(){
printf "[WGDashboard] %s Installing Python Virtual Environment\n" "$install"
if [ "$pythonExecutable" = "python3" ]; then
case "$OS" in
ubuntu|debian)
ubuntu|debian|raspbian)
{ sudo apt update ; sudo apt-get install -y python3-venv; printf "\n\n"; } &>> ./log/install.txt
;;
centos|fedora|redhat|rhel|almalinux|rocky)
@@ -140,7 +140,7 @@ _installPythonVenv(){
esac
else
case "$OS" in
ubuntu|debian)
ubuntu|debian|raspbian)
{ sudo apt-get update; sudo apt-get install ${pythonExecutable}-venv; } &>> ./log/install.txt
;;
esac
@@ -162,7 +162,7 @@ _installPythonPip(){
then
printf "[WGDashboard] %s Installing Python Package Manager (PIP)\n" "$install"
case "$OS" in
ubuntu|debian)
ubuntu|debian|raspbian)
if [ "$pythonExecutable" = "python3" ]; then
{ sudo apt update ; sudo apt-get install -y python3-pip; printf "\n\n"; } &>> ./log/install.txt
else
@@ -205,7 +205,7 @@ _checkWireguard(){
then
printf "[WGDashboard] %s Installing WireGuard\n" "$install"
case "$OS" in
ubuntu|debian)
ubuntu|debian|raspbian)
{
sudo apt update && sudo apt-get install -y wireguard;
printf "\n[WGDashboard] WireGuard installed on %s.\n\n" "$OS";