mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2025-06-28 01:06:58 +00:00
Compare commits
150 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
1483ef83d9 | ||
|
dbed799e20 | ||
|
4602b68425 | ||
|
2d3eaedaa7 | ||
|
4d60b21a5f | ||
|
50ee8374ee | ||
|
65eb23e8ce | ||
|
5c76b18ddd | ||
|
fc6f5d2535 | ||
|
6a0348e9dc | ||
|
90e6409b1e | ||
|
96b28a8e9b | ||
|
a818e87e96 | ||
|
dc715758a6 | ||
|
87069329d8 | ||
|
8a380a4545 | ||
|
a5e18cb761 | ||
|
e9da3e7b6a | ||
|
289fa23728 | ||
|
c117ee61d5 | ||
|
7385932e52 | ||
|
cb90b69b3f | ||
|
8d0e31872a | ||
|
881925fd43 | ||
|
3a2f744f0a | ||
|
9dc9e668c5 | ||
|
39477c8de8 | ||
|
1b0bb95e81 | ||
|
cd5a4bec52 | ||
|
43070ab809 | ||
|
532fedbb62 | ||
|
585bf37783 | ||
|
cad364e407 | ||
|
45457c5b38 | ||
|
4e9142b5be | ||
|
207b365d40 | ||
|
1ec95a0d86 | ||
|
db4b9ccc7a | ||
|
a86d0c74d3 | ||
|
354f4e47df | ||
|
84167650b8 | ||
|
15c12a81f1 | ||
|
249ae584c3 | ||
|
b04f7b2d2c | ||
|
630ce459cb | ||
|
a7a30fb282 | ||
|
ab5abe9bcf | ||
|
7834fff541 | ||
|
ef8849e8a9 | ||
|
78bedf9ad6 | ||
|
6ec757ab66 | ||
|
7d71299c51 | ||
|
bea37aee7f | ||
|
5323687ea5 | ||
|
d1372a4c43 | ||
|
c9249a164a | ||
|
6f105f2626 | ||
|
e4c08896f4 | ||
|
e85a0df9b7 | ||
|
a5b7eabd97 | ||
|
f3688431a3 | ||
|
44e714352d | ||
|
60da68c994 | ||
|
11288fac20 | ||
|
fe9d373444 | ||
|
cce31f9b0b | ||
|
ca779ed5ad | ||
|
eb0eaaae2e | ||
|
9631b97694 | ||
|
6f036876c8 | ||
|
bd47179ea4 | ||
|
418c6bd88b | ||
|
ada4c4f816 | ||
|
91b499fb14 | ||
|
1f73adffd6 | ||
|
82bd313e7a | ||
|
14cbfe47b9 | ||
|
f2d4ff6dc4 | ||
|
bf33a70727 | ||
|
e1bdcbd581 | ||
|
051c1e7622 | ||
|
3b176474ff | ||
|
15f1b33ea6 | ||
|
0603d4076a | ||
|
ac94f10dc3 | ||
|
bbb92490e9 | ||
|
2cb63092c0 | ||
|
b9bcb59592 | ||
|
e083adc022 | ||
|
c3cd38fe9f | ||
|
a7c2db5e99 | ||
|
4926ee5117 | ||
|
e7723ac3db | ||
|
8dbfb93e4e | ||
|
6096366756 | ||
|
8e4cf12512 | ||
|
b61fa1f870 | ||
|
ac3cf9e4b1 | ||
|
e18463f059 | ||
|
ee54e08d18 | ||
|
3c07df6496 | ||
|
2117b828c8 | ||
|
28d9694432 | ||
|
7d977700e6 | ||
|
33942945d0 | ||
|
8d7d78db46 | ||
|
3268cc30ea | ||
|
8830ebe34f | ||
|
1d9adba6dd | ||
|
71be73777e | ||
|
7709f70ef1 | ||
|
9b528b84e1 | ||
|
c53a4d4861 | ||
|
766173df3d | ||
|
7f65cae891 | ||
|
bc56ecb85c | ||
|
50c3151301 | ||
|
d49ec0a81e | ||
|
6692028762 | ||
|
b71c357958 | ||
|
03b7621f3e | ||
|
2bcf24bd84 | ||
|
cc5aa05b12 | ||
|
3232c5c4ce | ||
|
72a52f5cd6 | ||
|
bda48a56e0 | ||
|
09cdcf8e53 | ||
|
a4d5b41ca7 | ||
|
9fa0d91d06 | ||
|
510f60bdeb | ||
|
30fe827253 | ||
|
8f0f4b168b | ||
|
cd11c4beb6 | ||
|
4d49cc413a | ||
|
3d50a58a31 | ||
|
d5701230fa | ||
|
ab945d6afe | ||
|
b4f8a36d43 | ||
|
608c1b4eb6 | ||
|
edf3c42157 | ||
|
c523cec113 | ||
|
6f8b987d42 | ||
|
d0d0642bdf | ||
|
924d760e3b | ||
|
f8c207ca2b | ||
|
ada1edd0b7 | ||
|
c79333db61 | ||
|
13778bed87 | ||
|
83b4d96f42 | ||
|
6cf96de0b4 |
1
.github/workflows/codeql-analyze.yaml
vendored
1
.github/workflows/codeql-analyze.yaml
vendored
@ -12,6 +12,7 @@
|
|||||||
name: "CodeQL"
|
name: "CodeQL"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches: [ main ]
|
branches: [ main ]
|
||||||
pull_request:
|
pull_request:
|
||||||
|
55
.github/workflows/docker-related.yaml
vendored
55
.github/workflows/docker-related.yaml
vendored
@ -1,55 +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: .
|
|
||||||
push: true
|
|
||||||
tags: ${{ env.DOCKER_IMAGE }}:latest
|
|
||||||
platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7
|
|
||||||
|
|
||||||
- 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
105
.github/workflows/docker.yml
vendored
Normal 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 }}
|
28
.github/workflows/qodana_code_quality.yml
vendored
28
.github/workflows/qodana_code_quality.yml
vendored
@ -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
26
.github/workflows/stale.yml
vendored
Normal 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
1
.gitignore
vendored
@ -18,6 +18,7 @@ src/db/wgdashboard.db
|
|||||||
node_modules/**
|
node_modules/**
|
||||||
*/proxy.js
|
*/proxy.js
|
||||||
src/static/app/proxy.js
|
src/static/app/proxy.js
|
||||||
|
.secrets
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
logs
|
logs
|
||||||
|
62
README.md
62
README.md
@ -4,27 +4,28 @@
|
|||||||
> [!NOTE]
|
> [!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!
|
> **Help Wanted 🎉**: Localizing WGDashboard to other languages! If you're willing to help, please visit https://github.com/donaldzou/WGDashboard/issues/397. Many thanks!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img alt="WGDashboard" src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Logos/Logo-2-Rounded-512x512.png" width="128">
|
<img alt="WGDashboard" src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Logos/Logo-2-Rounded-512x512.png" width="128">
|
||||||
</p>
|
</p>
|
||||||
<h1 align="center">WGDashboard</h1>
|
<h1 align="center">
|
||||||
|
<a href="https://wgdashboard.dev">WGDashboard</a>
|
||||||
|
</h1>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://forthebadge.com/images/badges/made-with-python.svg">
|
<img src="https://img.shields.io/badge/Made_With-Python-blue?style=for-the-badge&logo=python&logoColor=ffffff">
|
||||||
<img src="https://forthebadge.com/images/badges/made-with-javascript.svg">
|
<img src="https://img.shields.io/badge/Made_With-Vue.js-42b883?style=for-the-badge&logo=vuedotjs&logoColor=ffffff">
|
||||||
<img src="https://forthebadge.com/images/badges/license-mit.svg">
|
<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">
|
|
||||||
<img src="https://forthebadge.com/images/badges/built-with-love.svg">
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<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://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" alt="wakatime"></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"></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">
|
<img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff&style=for-the-badge">
|
||||||
</p>
|
</p>
|
||||||
<p align="center"><b>This project is supported by</b></p>
|
<p align="center"><b>This project is supported by</b></p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@ -37,31 +38,40 @@
|
|||||||
|
|
||||||
<p align="center"><b><i>This project is not affiliate to the official WireGuard Project</i></b></p>
|
<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">
|
<p align="center">
|
||||||
Join our Discord Server for quick help, or you wanna chat about this project!
|
You can reach out at
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<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>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Alternatively, you can also reach out at our Matrix.org Chatroom :)
|
<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>
|
||||||
</p>
|
<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>
|
||||||
<p align="center">
|
<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>
|
||||||
<a href="https://app.element.io/#/room/#wgd:matrix.org">Matrix.org Chatroom</a>
|
|
||||||
</p>
|
</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>
|
<hr>
|
||||||
|
<h4 align="center">
|
||||||
|
for more information, visit our
|
||||||
|
</h4>
|
||||||
|
<h1 align="center">
|
||||||
|
<a href="https://wgdashboard.dev">Official Website</a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
# [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)
|
|
||||||
- [🪜 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
|
# Screenshots
|
||||||
|
|
||||||
|
@ -1,58 +1,38 @@
|
|||||||
FROM golang:1.23 AS compiler
|
FROM golang:1.24 AS awg
|
||||||
WORKDIR /go
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN git clone https://github.com/amnezia-vpn/amneziawg-go /awg
|
||||||
git make bash build-essential \
|
WORKDIR /awg
|
||||||
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
RUN go mod download && \
|
||||||
|
go mod verify && \
|
||||||
|
go build -ldflags '-linkmode external -extldflags "-fno-PIC -static"' -v -o /usr/bin
|
||||||
|
|
||||||
RUN git clone --depth=1 https://github.com/amnezia-vpn/amneziawg-tools.git && \
|
|
||||||
git clone --depth=1 https://github.com/amnezia-vpn/amneziawg-go.git
|
|
||||||
RUN cd /go/amneziawg-tools/src && make
|
|
||||||
|
|
||||||
RUN cd /go/amneziawg-go && \
|
|
||||||
go get -u ./... && \
|
|
||||||
go mod tidy && \
|
|
||||||
make && \
|
|
||||||
chmod +x /go/amneziawg-go/amneziawg-go /go/amneziawg-tools/src/wg /go/amneziawg-tools/src/wg-quick/linux.bash
|
|
||||||
RUN echo "DONE AmneziaWG"
|
|
||||||
|
|
||||||
### INTERMEDIATE STAGE
|
|
||||||
FROM scratch AS bins
|
|
||||||
COPY --from=compiler /go/amneziawg-go/amneziawg-go /amneziawg-go
|
|
||||||
COPY --from=compiler /go/amneziawg-tools/src/wg /awg
|
|
||||||
COPY --from=compiler /go/amneziawg-tools/src/wg-quick/linux.bash /awg-quick
|
|
||||||
|
|
||||||
# FINAL STAGE
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
LABEL maintainer="dselen@nerthus.nl"
|
LABEL maintainer="dselen@nerthus.nl"
|
||||||
|
|
||||||
COPY --from=bins /amneziawg-go /usr/bin/amneziawg-go
|
RUN apk update && apk add \
|
||||||
COPY --from=bins /awg /usr/bin/awg
|
iproute2 iptables bash curl wget unzip procps sudo \
|
||||||
COPY --from=bins /awg-quick /usr/bin/awg-quick
|
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
|
||||||
|
|
||||||
|
COPY --from=awg /usr/bin/amneziawg-go /usr/bin/amneziawg-go
|
||||||
|
|
||||||
# Declaring environment variables, change Peernet to an address you like, standard is a 24 bit subnet.
|
# Declaring environment variables, change Peernet to an address you like, standard is a 24 bit subnet.
|
||||||
ARG wg_net="10.0.0.1"
|
ARG wg_net="10.0.0.1" \
|
||||||
ARG wg_port="51820"
|
wg_port="51820"
|
||||||
|
|
||||||
# Following ENV variables are changable on container runtime because /entrypoint.sh handles that. See compose.yaml for more info.
|
# Following ENV variables are changable on container runtime because /entrypoint.sh handles that. See compose.yaml for more info.
|
||||||
ENV TZ="Europe/Amsterdam"
|
ENV TZ="Europe/Amsterdam" \
|
||||||
ENV global_dns="1.1.1.1"
|
global_dns="9.9.9.9" \
|
||||||
ENV isolate="none"
|
wgd_port="10086" \
|
||||||
ENV public_ip=""
|
public_ip=""
|
||||||
ENV wgd_port="10086"
|
|
||||||
|
|
||||||
# Doing package management operations, such as upgrading
|
|
||||||
RUN apk update \
|
|
||||||
&& apk add --no-cache bash git tzdata \
|
|
||||||
iptables ip6tables openrc curl wireguard-tools \
|
|
||||||
sudo py3-psutil py3-bcrypt \
|
|
||||||
&& apk upgrade
|
|
||||||
|
|
||||||
# Using WGDASH -- like wg_net functionally as a ARG command. But it is needed in entrypoint.sh so it needs to be exported as environment variable.
|
# Using WGDASH -- like wg_net functionally as a ARG command. But it is needed in entrypoint.sh so it needs to be exported as environment variable.
|
||||||
ENV WGDASH=/opt/wgdashboard
|
ENV WGDASH=/opt/wgdashboard
|
||||||
|
|
||||||
# Removing the Linux Image package to preserve space on the image, for this reason also deleting apt lists, to be able to install packages: run apt update.
|
|
||||||
|
|
||||||
# Doing WireGuard Dashboard installation measures. Modify the git clone command to get the preferred version, with a specific branch for example.
|
# Doing WireGuard Dashboard installation measures. Modify the git clone command to get the preferred version, with a specific branch for example.
|
||||||
RUN mkdir /data \
|
RUN mkdir /data \
|
||||||
&& mkdir /configs \
|
&& mkdir /configs \
|
||||||
@ -81,7 +61,7 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
|||||||
CMD sh -c 'pgrep gunicorn > /dev/null && pgrep tail > /dev/null' || exit 1
|
CMD sh -c 'pgrep gunicorn > /dev/null && pgrep tail > /dev/null' || exit 1
|
||||||
|
|
||||||
# Copy the basic entrypoint.sh script.
|
# Copy the basic entrypoint.sh script.
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
COPY ./docker/entrypoint.sh /entrypoint.sh
|
||||||
|
|
||||||
# Exposing the default WireGuard Dashboard port for web access.
|
# Exposing the default WireGuard Dashboard port for web access.
|
||||||
EXPOSE 10086
|
EXPOSE 10086
|
184
docker/README.md
184
docker/README.md
@ -1,39 +1,59 @@
|
|||||||
# WGDashboard Docker Explanation:
|
# WGDashboard Docker Explanation:
|
||||||
Author: DaanSelen<br>
|
Author: @DaanSelen<br>
|
||||||
|
|
||||||
This document delves into how the WGDashboard Docker container has been built.<br>
|
This document delves into how the WGDashboard Docker container has been built.<br>
|
||||||
Of course there are two stages, one before run-time and one at/after run-time.<br>
|
Of course there are two stages (simply said), one before run-time and one at/after run-time.<br>
|
||||||
The `Dockerfile` describes how the container image is made, and the `entrypoint.sh` is executed after running the container. <br>
|
The `Dockerfile` describes how the container image is made, and the `entrypoint.sh` is executed after running the container. <br>
|
||||||
In this example, WireGuard is integrated into the container itself, so it should be a run-and-go/out-of-the-box.<br>
|
In this example, WireGuard is integrated into the container itself, so it should be a run-and-go(/out-of-the-box).<br>
|
||||||
For more details on the source-code specific to this Docker image, refer to the source files, they have lots of comments.
|
For more details on the source-code specific to this Docker image, refer to the source files, they have lots of comments.
|
||||||
|
|
||||||
I have tried to embed some new features such as `isolate` and interface startup on container-start (through `enable`). I hope you enjoy!
|
<br>
|
||||||
|
<img
|
||||||
|
src="https://wgdashboard-resources.tor1.cdn.digitaloceanspaces.com/Logos/Logo-2-Rounded-512x512.png"
|
||||||
|
alt="WG-Dashboard Logo"
|
||||||
|
title="WG-Dashboard Logo"
|
||||||
|
style="display: block; margin: 0 auto;"
|
||||||
|
width="150"
|
||||||
|
height="150"
|
||||||
|
/>
|
||||||
|
<br>
|
||||||
|
|
||||||
<img src="https://raw.githubusercontent.com/donaldzou/WGDashboard/main/src/static/img/logo.png" alt="WG-Dashboard Logo" title="WG-Dashboard Logo" width="150" height="150" />
|
To get the container running you either pull the image from the repository, (docker.io)`donaldzou/wgdashboard:latest`.<br>
|
||||||
|
|
||||||
## Getting the container running:
|
|
||||||
|
|
||||||
To get the container running you either pull the image from the repository, `donaldzou/wgdashboard:latest`.<br>
|
|
||||||
From there either use the environment variables describe below as parameters or use the Docker Compose file: `compose.yaml`.<br>
|
From there either use the environment variables describe below as parameters or use the Docker Compose file: `compose.yaml`.<br>
|
||||||
Be careful, the default generated WireGuard configuration file uses port 51820/udp. So use this port if you want to use it out of the box.<br>
|
Be careful, the default generated WireGuard configuration file uses port 51820/udp. So use this port if you want to use it out of the box.<br>
|
||||||
Otherwise edit the configuration file in `/etc/wireguard/wg0.conf`.
|
Otherwise edit the configuration file in `/etc/wireguard/wg0.conf`.
|
||||||
|
|
||||||
An example of a simple command to get the container running is show below:<br>
|
# WGDashboard: 🐳 Docker Deployment Guide
|
||||||
|
|
||||||
```shell
|
To run the container, you can either pull the image from Docker Hub or build it yourself. The image is available at:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker.io/donaldzou/wgdashboard:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
> `docker.io` is in most cases automatically resolved by the Docker application.
|
||||||
|
|
||||||
|
### 🔧 Quick Docker Run Command
|
||||||
|
|
||||||
|
Here's an example to get it up and running quickly:
|
||||||
|
|
||||||
|
```bash
|
||||||
docker run -d \
|
docker run -d \
|
||||||
--name wgdashboard \
|
--name wgdashboard \
|
||||||
--restart unless-stopped \
|
--restart unless-stopped \
|
||||||
-e enable=wg0 \
|
|
||||||
-e isolate=wg0 \
|
|
||||||
-p 10086:10086/tcp \
|
-p 10086:10086/tcp \
|
||||||
-p 51820:51820/udp \
|
-p 51820:51820/udp \
|
||||||
--cap-add NET_ADMIN \
|
--cap-add NET_ADMIN \
|
||||||
donaldzou/wgdashboard:latest
|
donaldzou/wgdashboard:latest
|
||||||
```
|
```
|
||||||
<br>
|
|
||||||
If you want to use Compose instead of a raw Docker command, refer to the example in the `compose.yaml` or the one pasted below:
|
> ⚠️ The default WireGuard port is `51820/udp`. If you change this, update the `/etc/wireguard/wg0.conf` accordingly.
|
||||||
<br><br>
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📦 Docker Compose Alternative
|
||||||
|
|
||||||
|
You can also use Docker Compose for easier configuration:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
@ -42,11 +62,9 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
container_name: wgdashboard
|
container_name: wgdashboard
|
||||||
environment:
|
environment:
|
||||||
#- tz=
|
# - tz=Europe/Amsterdam
|
||||||
#- global_dns=
|
# - global_dns=1.1.1.1
|
||||||
#- enable=
|
# - public_ip=YOUR_PUBLIC_IP
|
||||||
#- isolate=
|
|
||||||
#- public_ip=
|
|
||||||
ports:
|
ports:
|
||||||
- 10086:10086/tcp
|
- 10086:10086/tcp
|
||||||
- 51820:51820/udp
|
- 51820:51820/udp
|
||||||
@ -59,51 +77,121 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
conf:
|
conf:
|
||||||
data:
|
data:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to customize the yaml, make sure the core stays the same, but for example volume PATHs (ON THE HOST) can be freely changed.<br>
|
> 📁 You can customize the **volume paths** on the host to fit your needs. The example above uses Docker volumes.
|
||||||
This setup is just generic and will use the Docker volumes.
|
|
||||||
|
|
||||||
## Updating the container:
|
---
|
||||||
|
|
||||||
Updating is right now in Alpha stage. I have got it to work, testing methods.
|
## 🔄 Updating the Container
|
||||||
|
|
||||||
## Working with the container and environment variables:
|
Updating WGDashboard is currently in **alpha** stage. While the update process may work, it's still under testing.
|
||||||
|
|
||||||
Once the container is running, the installation process is essentially the same as running it on bare-metal.<br>
|
---
|
||||||
So go to the assign TCP port in this case HTTP, like the default 10086 one in the example and log into the WEB-GUI.<br>
|
|
||||||
|
|
||||||
| Environment variable | Accepted arguments | Default value | Example value | Verbose |
|
## ⚙️ Environment Variables
|
||||||
| -------------- | ------- | ------- | ------- | ------- |
|
|
||||||
| tz | Europe/Amsterdam or any confirming timezone notation. | `Europe/Amsterdam` | `America/New_York` | Sets the timezone of the Docker container. This is to timesync the container to any other processes which would need it. |
|
|
||||||
| global_dns | Any IPv4 address, such as my personal recommendation: 9.9.9.9 (QUAD9). | `1.1.1.1` | `8.8.8.8` or any IP-Address that resolves DNS-names, and of course is reachable | Set the default DNS given to clients once they connect to the WireGuard tunnel, and for new peers, set to Cloudflare DNS for reliability.
|
|
||||||
| enable | Anything, preferably an existing WireGuard interface name. | `none` | `wg0,wg2,wg13` | Enables or disables the starting of the WireGuard interface on container 'boot-up'.
|
|
||||||
| isolate | Anything, preferably an existing WireGuard interface name. | `none` | `wg1,wg0` | The Wireguard interface itself IS able to reach the peers (Done through the `iptables` package).
|
|
||||||
| public_ip | Any IPv4 (public recommended) address, such as the one returned by default | Default uses the return of `curl ifconfig.me` | `89.20.83.118` | To reach your VPN from outside your own network, you need WG-Dashboard to know what your public IP-address is, otherwise it will generate faulty config files for clients. This happends because it is inside a Docker/Kubernetes container. In or outside of NAT is not relevant as long as the given IP-address is reachable from the internet or the target network.
|
|
||||||
|
|
||||||
## Be careful with:
|
| Variable | Accepted Values | Default | Example | Description |
|
||||||
|
|---------------|------------------------------------------|-------------------------|------------------------|-----------------------------------------------------------------------------|
|
||||||
|
| `tz` | Timezone | `Europe/Amsterdam` | `America/New_York` | Sets the container's timezone. Useful for accurate logs and scheduling. |
|
||||||
|
| `global_dns` | IPv4 and IPv6 addresses | `9.9.9.9` | `8.8.8.8`, `1.1.1.1` | Default DNS for WireGuard clients. |
|
||||||
|
| `public_ip` | Public IP address | Retrieved automatically | `253.162.134.73` | Used to generate accurate client configs. Needed if container is NAT’d. |
|
||||||
|
| `wgd_port` | Any port that is allowed for the process | `10086` | `443` | This port is used to set the WGDashboard web port. |
|
||||||
|
|
||||||
When you are going to work with multiple WireGuard interfaces, you need to also open them up to the Docker host. This done by either adding the port mappings like: `51821:51821/udp` in the Docker Compose file, or to open a range like: `51820-51830:51820-51830/udp`<br>
|
---
|
||||||
The latter opens up UDP ports from 51820 to 51830, so all ports in between as well! Be careful, it is good security practise to open only needed ports!
|
|
||||||
|
|
||||||
## Building the image yourself:
|
## 🔐 Port Forwarding Note
|
||||||
|
|
||||||
To build the image yourself, you need to do a couple things:<br>
|
When using multiple WireGuard interfaces, remember to **open their respective ports** on the host.
|
||||||
1. Clone the Github repository containing the source code of WGDashboard including the docker directory. For example do: `git clone https://github.com/donaldzou/WGDashboard.git`
|
|
||||||
1. Navigate into the cloned repository.
|
|
||||||
1. (Make sure you have Docker correctly installed, if not: [Click here](https://docs.docker.com/engine/install/)) and run: `docker build . -t <Image name>:<Image tag>` as an example: `docker build . -t dselen/wgdashboard:latest`.<br>
|
|
||||||
|
|
||||||
This will make Docker compile the image from the resources in the directory you mention, in this case the source/root one. Let it compile, it takes only a couple seconds with a minute at most.
|
Examples:
|
||||||
|
```yaml
|
||||||
|
# Individual mapping
|
||||||
|
- 51821:51821/udp
|
||||||
|
|
||||||
1. If all went well, see your image with `docker images`. Example below:
|
# Or port range
|
||||||
|
- 51820-51830:51820-51830/udp
|
||||||
|
```
|
||||||
|
|
||||||
|
> 🚨 **Security Tip:** Only expose ports you actually use.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Building the Image Yourself
|
||||||
|
|
||||||
|
To build from source:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/donaldzou/WGDashboard.git
|
||||||
|
cd WGDashboard
|
||||||
|
docker build . -f docker/Dockerfile -t yourname/wgdashboard:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
```shell
|
```shell
|
||||||
dselen@dev-mach:~/development/WGDashboard/docker$ docker images
|
docker images
|
||||||
|
|
||||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
dselen/wgdashboard latest c96fd96ee3b3 42 minutes ago 314MB
|
yourname/wgdashboard latest c96fd96ee3b3 42 minutes ago 314MB
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧱 Dockerfile Overview
|
||||||
|
|
||||||
|
Here's a brief overview of the Dockerfile stages used in the image build:
|
||||||
|
|
||||||
|
### 1. **Build Tools & Go Compilation**
|
||||||
|
|
||||||
|
```Dockerfile
|
||||||
|
FROM golang:1.24 AS compiler
|
||||||
|
WORKDIR /go
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y ...
|
||||||
|
RUN git clone ... && make
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. **Binary Copy to Scratch**
|
||||||
|
|
||||||
|
```Dockerfile
|
||||||
|
FROM scratch AS bins
|
||||||
|
COPY --from=compiler /go/amneziawg-go/amneziawg-go /amneziawg-go
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. **Final Alpine Container Setup**
|
||||||
|
|
||||||
|
```Dockerfile
|
||||||
|
FROM alpine:latest
|
||||||
|
COPY --from=bins ...
|
||||||
|
RUN apk update && apk add --no-cache ...
|
||||||
|
COPY ./src ${WGDASH}/src
|
||||||
|
COPY ./docker/entrypoint.sh /entrypoint.sh
|
||||||
|
...
|
||||||
|
EXPOSE 10086
|
||||||
|
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Entrypoint Overview
|
||||||
|
|
||||||
|
### Major Functions:
|
||||||
|
|
||||||
|
- **`ensure_installation`**: Sets up the app, database, and Python environment.
|
||||||
|
- **`set_envvars`**: Writes `wg-dashboard.ini` and applies environment variables.
|
||||||
|
- **`start_core`**: Starts the main WGDashboard service.
|
||||||
|
- **`ensure_blocking`**: Tails the error log to keep the container process alive.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Final Notes
|
||||||
|
|
||||||
|
- Use `docker logs wgdashboard` for troubleshooting.
|
||||||
|
- Access the web interface via `http://your-ip:10086` (or whichever port you specified in the compose).
|
||||||
|
- The first time run will auto-generate WireGuard keys and configs (configs are generated from the template).
|
||||||
|
|
||||||
## Closing remarks:
|
## Closing remarks:
|
||||||
|
|
||||||
For feedback please submit an issue to the repository. Or message dselen@nerthus.nl.
|
For feedback please submit an issue to the repository. Or message dselen@nerthus.nl.
|
@ -5,19 +5,19 @@ services:
|
|||||||
container_name: wgdashboard
|
container_name: wgdashboard
|
||||||
#environment:
|
#environment:
|
||||||
#- tz= # <--- Set container timezone, default: Europe/Amsterdam.
|
#- tz= # <--- Set container timezone, default: Europe/Amsterdam.
|
||||||
#- global_dns= # <--- Set global DNS address, default: 1.1.1.1.
|
|
||||||
#- isolate= # <--- Set the interfaces that will disallow peer communication, default: 'none'.
|
|
||||||
#- public_ip= # <--- Set public IP to ensure the correct one is chosen, defaulting to the IP give by ifconfig.me.
|
#- public_ip= # <--- Set public IP to ensure the correct one is chosen, defaulting to the IP give by ifconfig.me.
|
||||||
#- wgd_port= # <--- Set the port WGDashboard will use for its web-server.
|
#- wgd_port= # <--- Set the port WGDashboard will use for its web-server.
|
||||||
ports:
|
ports:
|
||||||
- 10086:10086/tcp
|
- 10086:10086/tcp
|
||||||
- 51820:51820/udp
|
- 51820:51820/udp
|
||||||
volumes:
|
volumes:
|
||||||
|
- aconf:/etc/amnezia/amneziawg
|
||||||
- conf:/etc/wireguard
|
- conf:/etc/wireguard
|
||||||
- data:/data
|
- data:/data
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
|
aconf:
|
||||||
conf:
|
conf:
|
||||||
data:
|
data:
|
||||||
|
@ -7,7 +7,7 @@ trap 'stop_service' SIGTERM
|
|||||||
|
|
||||||
stop_service() {
|
stop_service() {
|
||||||
echo "[WGDashboard] Stopping WGDashboard..."
|
echo "[WGDashboard] Stopping WGDashboard..."
|
||||||
bash ./wgd.sh stop
|
/bin/bash ./wgd.sh stop
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,51 +18,68 @@ ensure_installation() {
|
|||||||
# When using a custom directory to store the files, this part moves over and makes sure the installation continues.
|
# When using a custom directory to store the files, this part moves over and makes sure the installation continues.
|
||||||
echo "Quick-installing..."
|
echo "Quick-installing..."
|
||||||
|
|
||||||
|
# Make the wgd.sh script executable.
|
||||||
chmod +x "${WGDASH}"/src/wgd.sh
|
chmod +x "${WGDASH}"/src/wgd.sh
|
||||||
cd "${WGDASH}"/src || exit
|
cd "${WGDASH}"/src || exit
|
||||||
|
|
||||||
|
# Github issue: https://github.com/donaldzou/WGDashboard/issues/723
|
||||||
|
echo "Checking for stale pids..."
|
||||||
|
if [[ -f ${WGDASH}/src/gunicorn.pid ]]; then
|
||||||
|
echo "Found stale pid, removing..."
|
||||||
|
rm ${WGDASH}/src/gunicorn.pid
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Removing clear shell command from the wgd.sh script to enhance docker logging.
|
||||||
echo "Removing clear command from wgd.sh for better Docker logging."
|
echo "Removing clear command from wgd.sh for better Docker logging."
|
||||||
sed -i '/clear/d' ./wgd.sh
|
sed -i '/clear/d' ./wgd.sh
|
||||||
|
|
||||||
|
# Create the databases directory if it does not exist yet.
|
||||||
if [ ! -d "/data/db" ]; then
|
if [ ! -d "/data/db" ]; then
|
||||||
echo "Creating database dir"
|
echo "Creating database dir"
|
||||||
mkdir /data/db
|
mkdir /data/db
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Linking the database on the persistent directory location to where WGDashboard expects.
|
||||||
if [ ! -d "${WGDASH}/src/db" ]; then
|
if [ ! -d "${WGDASH}/src/db" ]; then
|
||||||
ln -s /data/db "${WGDASH}/src/db"
|
ln -s /data/db "${WGDASH}/src/db"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Create the wg-dashboard.ini file if it does not exist yet.
|
||||||
if [ ! -f "${config_file}" ]; then
|
if [ ! -f "${config_file}" ]; then
|
||||||
echo "Creating wg-dashboard.ini file"
|
echo "Creating wg-dashboard.ini file"
|
||||||
touch "${config_file}"
|
touch "${config_file}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Link the wg-dashboard.ini file from the persistent directory to where WGDashboard expects it.
|
||||||
if [ ! -f "${WGDASH}/src/wg-dashboard.ini" ]; then
|
if [ ! -f "${WGDASH}/src/wg-dashboard.ini" ]; then
|
||||||
ln -s "${config_file}" "${WGDASH}/src/wg-dashboard.ini"
|
ln -s "${config_file}" "${WGDASH}/src/wg-dashboard.ini"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Create the Python virtual environment.
|
||||||
python3 -m venv "${WGDASH}"/src/venv
|
python3 -m venv "${WGDASH}"/src/venv
|
||||||
. "${WGDASH}/src/venv/bin/activate"
|
. "${WGDASH}/src/venv/bin/activate"
|
||||||
|
|
||||||
|
# Due to this pip dependency being available as a system package we can just move it to the venv.
|
||||||
echo "Moving PIP dependency from ephemerality to runtime environment: psutil"
|
echo "Moving PIP dependency from ephemerality to runtime environment: psutil"
|
||||||
mv /usr/lib/python3.12/site-packages/psutil* "${WGDASH}"/src/venv/lib/python3.12/site-packages
|
mv /usr/lib/python3.12/site-packages/psutil* "${WGDASH}"/src/venv/lib/python3.12/site-packages
|
||||||
|
|
||||||
|
# Due to this pip dependency being available as a system package we can just move it to the venv.
|
||||||
echo "Moving PIP dependency from ephemerality to runtime environment: bcrypt"
|
echo "Moving PIP dependency from ephemerality to runtime environment: bcrypt"
|
||||||
mv /usr/lib/python3.12/site-packages/bcrypt* "${WGDASH}"/src/venv/lib/python3.12/site-packages
|
mv /usr/lib/python3.12/site-packages/bcrypt* "${WGDASH}"/src/venv/lib/python3.12/site-packages
|
||||||
|
|
||||||
./wgd.sh install
|
# Use the bash interpreter to install WGDashboard according to the wgd.sh script.
|
||||||
|
/bin/bash ./wgd.sh install
|
||||||
|
|
||||||
echo "Looks like the installation succeeded. Moving on."
|
echo "Looks like the installation succeeded. Moving on."
|
||||||
|
|
||||||
# This first step is to ensure the wg0.conf file exists, and if not, then its copied over from the ephemeral container storage.
|
# This first step is to ensure the wg0.conf file exists, and if not, then its copied over from the ephemeral container storage.
|
||||||
# This is done so WGDashboard it works out of the box
|
# This is done so WGDashboard it works out of the box, it also sets a randomly generated private key.
|
||||||
|
|
||||||
if [ ! -f "/etc/wireguard/wg0.conf" ]; then
|
if [ ! -f "/etc/wireguard/wg0.conf" ]; then
|
||||||
echo "Standard wg0 Configuration file not found, grabbing template."
|
echo "Standard wg0 Configuration file not found, grabbing template."
|
||||||
cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf"
|
cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf"
|
||||||
|
|
||||||
echo "Setting a secure private key." # SORRY 4 BE4 - Daan
|
echo "Setting a secure private key."
|
||||||
|
|
||||||
local privateKey
|
local privateKey
|
||||||
privateKey=$(wg genkey)
|
privateKey=$(wg genkey)
|
||||||
@ -106,6 +123,7 @@ set_envvars() {
|
|||||||
sed -i "s/^peer_global_dns = .*/peer_global_dns = ${global_dns}/" "${config_file}"
|
sed -i "s/^peer_global_dns = .*/peer_global_dns = ${global_dns}/" "${config_file}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Checking the current set public IP and changing it if it has changed.
|
||||||
current_public_ip=$(grep "remote_endpoint = " "${config_file}" | awk '{print $NF}')
|
current_public_ip=$(grep "remote_endpoint = " "${config_file}" | awk '{print $NF}')
|
||||||
if [ "${public_ip}" == "" ]; then
|
if [ "${public_ip}" == "" ]; then
|
||||||
default_ip=$(curl -s ifconfig.me)
|
default_ip=$(curl -s ifconfig.me)
|
||||||
@ -118,6 +136,7 @@ set_envvars() {
|
|||||||
echo "Public-IP is correct, moving on."
|
echo "Public-IP is correct, moving on."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Checking the current WGDashboard web port and changing if needed.
|
||||||
current_wgd_port=$(grep "app_port = " "${config_file}" | awk '{print $NF}')
|
current_wgd_port=$(grep "app_port = " "${config_file}" | awk '{print $NF}')
|
||||||
if [ "${current_wgd_port}" == "${wgd_port}" ]; then
|
if [ "${current_wgd_port}" == "${wgd_port}" ]; then
|
||||||
echo "Current WGD port is set correctly, moving on."
|
echo "Current WGD port is set correctly, moving on."
|
||||||
@ -131,11 +150,18 @@ set_envvars() {
|
|||||||
start_core() {
|
start_core() {
|
||||||
printf "\n---------------------- STARTING CORE -----------------------\n"
|
printf "\n---------------------- STARTING CORE -----------------------\n"
|
||||||
|
|
||||||
|
# Due to some instances complaining about this, making sure its there every time.
|
||||||
|
mkdir -p /dev/net
|
||||||
|
mknod /dev/net/tun c 10 200
|
||||||
|
chmod 600 /dev/net/tun
|
||||||
|
|
||||||
|
# Actually starting WGDashboard
|
||||||
echo "Activating Python venv and executing the WireGuard Dashboard service."
|
echo "Activating Python venv and executing the WireGuard Dashboard service."
|
||||||
bash ./wgd.sh start
|
/bin/bash ./wgd.sh start
|
||||||
}
|
}
|
||||||
|
|
||||||
ensure_blocking() {
|
ensure_blocking() {
|
||||||
|
# Wait a second before continuing, to give the python program some time to get ready.
|
||||||
sleep 1s
|
sleep 1s
|
||||||
echo -e "\nEnsuring container continuation."
|
echo -e "\nEnsuring container continuation."
|
||||||
|
|
||||||
@ -147,9 +173,12 @@ ensure_blocking() {
|
|||||||
# Only tail the logs if they are found
|
# Only tail the logs if they are found
|
||||||
if [ -n "$latestErrLog" ]; then
|
if [ -n "$latestErrLog" ]; then
|
||||||
tail -f "$latestErrLog" &
|
tail -f "$latestErrLog" &
|
||||||
|
|
||||||
|
# Wait for the tail process to end.
|
||||||
wait $!
|
wait $!
|
||||||
else
|
else
|
||||||
echo "No log files found to tail. Something went wrong, exiting..."
|
echo "No log files found to tail. Something went wrong, exiting..."
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
@ -25,7 +25,7 @@ from modules.PeerJob import PeerJob
|
|||||||
from modules.SystemStatus import SystemStatus
|
from modules.SystemStatus import SystemStatus
|
||||||
SystemStatus = SystemStatus()
|
SystemStatus = SystemStatus()
|
||||||
|
|
||||||
DASHBOARD_VERSION = 'v4.2.0'
|
DASHBOARD_VERSION = 'v4.2.4'
|
||||||
|
|
||||||
CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.')
|
CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.')
|
||||||
DB_PATH = os.path.join(CONFIGURATION_PATH, 'db')
|
DB_PATH = os.path.join(CONFIGURATION_PATH, 'db')
|
||||||
@ -180,6 +180,7 @@ class PeerJobs:
|
|||||||
|
|
||||||
def runJob(self):
|
def runJob(self):
|
||||||
needToDelete = []
|
needToDelete = []
|
||||||
|
self.__getJobs()
|
||||||
for job in self.Jobs:
|
for job in self.Jobs:
|
||||||
c = WireguardConfigurations.get(job.Configuration)
|
c = WireguardConfigurations.get(job.Configuration)
|
||||||
if c is not None:
|
if c is not None:
|
||||||
@ -432,7 +433,6 @@ class WireguardConfiguration:
|
|||||||
original = [l.rstrip("\n") for l in f.readlines()]
|
original = [l.rstrip("\n") for l in f.readlines()]
|
||||||
try:
|
try:
|
||||||
start = original.index("[Interface]")
|
start = original.index("[Interface]")
|
||||||
|
|
||||||
# Clean
|
# Clean
|
||||||
for i in range(start, len(original)):
|
for i in range(start, len(original)):
|
||||||
if original[i] == "[Peer]":
|
if original[i] == "[Peer]":
|
||||||
@ -459,7 +459,10 @@ class WireguardConfiguration:
|
|||||||
setattr(self, key, StringToBoolean(value))
|
setattr(self, key, StringToBoolean(value))
|
||||||
else:
|
else:
|
||||||
if len(getattr(self, key)) > 0:
|
if len(getattr(self, key)) > 0:
|
||||||
|
if key not in ["PostUp", "PostDown", "PreUp", "PreDown"]:
|
||||||
setattr(self, key, f"{getattr(self, key)}, {value}")
|
setattr(self, key, f"{getattr(self, key)}, {value}")
|
||||||
|
else:
|
||||||
|
setattr(self, key, f"{getattr(self, key)}; {value}")
|
||||||
else:
|
else:
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
@ -470,11 +473,12 @@ class WireguardConfiguration:
|
|||||||
self.Status = self.getStatus()
|
self.Status = self.getStatus()
|
||||||
|
|
||||||
def __dropDatabase(self):
|
def __dropDatabase(self):
|
||||||
existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
existingTables = [self.Name, f'{self.Name}_restrict_access', f'{self.Name}_transfer', f'{self.Name}_deleted']
|
||||||
|
# existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
||||||
for t in existingTables:
|
for t in existingTables:
|
||||||
sqlUpdate("DROP TABLE '%s'" % t['name'])
|
sqlUpdate("DROP TABLE '%s'" % t)
|
||||||
|
|
||||||
existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
# existingTables = sqlSelect(f"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '{self.Name}%'").fetchall()
|
||||||
|
|
||||||
def createDatabase(self, dbName = None):
|
def createDatabase(self, dbName = None):
|
||||||
if dbName is None:
|
if dbName is None:
|
||||||
@ -805,6 +809,9 @@ class WireguardConfiguration:
|
|||||||
|
|
||||||
self.getPeers()
|
self.getPeers()
|
||||||
|
|
||||||
|
if numOfDeletedPeers == 0 and numOfFailedToDeletePeers == 0:
|
||||||
|
return ResponseObject(False, "No peer(s) to delete found", responseCode=404)
|
||||||
|
|
||||||
if numOfDeletedPeers == len(listOfPublicKeys):
|
if numOfDeletedPeers == len(listOfPublicKeys):
|
||||||
return ResponseObject(True, f"Deleted {numOfDeletedPeers} peer(s)")
|
return ResponseObject(True, f"Deleted {numOfDeletedPeers} peer(s)")
|
||||||
return ResponseObject(False,
|
return ResponseObject(False,
|
||||||
@ -945,7 +952,8 @@ class WireguardConfiguration:
|
|||||||
},
|
},
|
||||||
"ConnectedPeers": len(list(filter(lambda x: x.status == "running", self.Peers))),
|
"ConnectedPeers": len(list(filter(lambda x: x.status == "running", self.Peers))),
|
||||||
"TotalPeers": len(self.Peers),
|
"TotalPeers": len(self.Peers),
|
||||||
"Protocol": self.Protocol
|
"Protocol": self.Protocol,
|
||||||
|
"Table": self.Table,
|
||||||
}
|
}
|
||||||
|
|
||||||
def backupConfigurationFile(self) -> tuple[bool, dict[str, str]]:
|
def backupConfigurationFile(self) -> tuple[bool, dict[str, str]]:
|
||||||
@ -1047,7 +1055,7 @@ class WireguardConfiguration:
|
|||||||
dataChanged = False
|
dataChanged = False
|
||||||
with open(self.configPath, 'r') as f:
|
with open(self.configPath, 'r') as f:
|
||||||
original = [l.rstrip("\n") for l in f.readlines()]
|
original = [l.rstrip("\n") for l in f.readlines()]
|
||||||
allowEdit = ["Address", "PreUp", "PostUp", "PreDown", "PostDown", "ListenPort"]
|
allowEdit = ["Address", "PreUp", "PostUp", "PreDown", "PostDown", "ListenPort", "Table"]
|
||||||
if self.Protocol == 'awg':
|
if self.Protocol == 'awg':
|
||||||
allowEdit += ["Jc", "Jmin", "Jmax", "S1", "S2", "H1", "H2", "H3", "H4"]
|
allowEdit += ["Jc", "Jmin", "Jmax", "S1", "S2", "H1", "H2", "H3", "H4"]
|
||||||
start = original.index("[Interface]")
|
start = original.index("[Interface]")
|
||||||
@ -1204,15 +1212,15 @@ AmneziaWG Configuration
|
|||||||
"""
|
"""
|
||||||
class AmneziaWireguardConfiguration(WireguardConfiguration):
|
class AmneziaWireguardConfiguration(WireguardConfiguration):
|
||||||
def __init__(self, name: str = None, data: dict = None, backup: dict = None, startup: bool = False):
|
def __init__(self, name: str = None, data: dict = None, backup: dict = None, startup: bool = False):
|
||||||
self.Jc = 0
|
self.Jc = ""
|
||||||
self.Jmin = 0
|
self.Jmin = ""
|
||||||
self.Jmax = 0
|
self.Jmax = ""
|
||||||
self.S1 = 0
|
self.S1 = ""
|
||||||
self.S2 = 0
|
self.S2 = ""
|
||||||
self.H1 = 1
|
self.H1 = ""
|
||||||
self.H2 = 2
|
self.H2 = ""
|
||||||
self.H3 = 3
|
self.H3 = ""
|
||||||
self.H4 = 4
|
self.H4 = ""
|
||||||
|
|
||||||
super().__init__(name, data, backup, startup, wg=False)
|
super().__init__(name, data, backup, startup, wg=False)
|
||||||
|
|
||||||
@ -1237,6 +1245,7 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
},
|
},
|
||||||
"ConnectedPeers": len(list(filter(lambda x: x.status == "running", self.Peers))),
|
"ConnectedPeers": len(list(filter(lambda x: x.status == "running", self.Peers))),
|
||||||
"TotalPeers": len(self.Peers),
|
"TotalPeers": len(self.Peers),
|
||||||
|
"Table": self.Table,
|
||||||
"Protocol": self.Protocol,
|
"Protocol": self.Protocol,
|
||||||
"Jc": self.Jc,
|
"Jc": self.Jc,
|
||||||
"Jmin": self.Jmin,
|
"Jmin": self.Jmin,
|
||||||
@ -1434,7 +1443,7 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
f.write(p['preshared_key'])
|
f.write(p['preshared_key'])
|
||||||
|
|
||||||
subprocess.check_output(
|
subprocess.check_output(
|
||||||
f"{self.Protocol} set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip'].replace(' ', '')}{f' preshared-key {uid}' if presharedKeyExist else ''} advanced-security {p['advanced_security']}",
|
f"{self.Protocol} set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip'].replace(' ', '')}{f' preshared-key {uid}' if presharedKeyExist else ''}",
|
||||||
shell=True, stderr=subprocess.STDOUT)
|
shell=True, stderr=subprocess.STDOUT)
|
||||||
if presharedKeyExist:
|
if presharedKeyExist:
|
||||||
os.remove(uid)
|
os.remove(uid)
|
||||||
@ -1713,7 +1722,7 @@ PersistentKeepalive = {str(self.keepalive)}
|
|||||||
f.write(preshared_key)
|
f.write(preshared_key)
|
||||||
newAllowedIPs = allowed_ip.replace(" ", "")
|
newAllowedIPs = allowed_ip.replace(" ", "")
|
||||||
updateAllowedIp = subprocess.check_output(
|
updateAllowedIp = subprocess.check_output(
|
||||||
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if pskExist else 'preshared-key /dev/null'} advanced-security {advanced_security}",
|
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if pskExist else 'preshared-key /dev/null'}",
|
||||||
shell=True, stderr=subprocess.STDOUT)
|
shell=True, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
if pskExist: os.remove(uid)
|
if pskExist: os.remove(uid)
|
||||||
@ -1905,7 +1914,7 @@ class DashboardConfig:
|
|||||||
return False, "Section does not exist"
|
return False, "Section does not exist"
|
||||||
|
|
||||||
if ((key not in self.__config[section].keys() and init) or
|
if ((key not in self.__config[section].keys() and init) or
|
||||||
(key in self.__config[section].keys() and value != self.__config[section][key] and not init)):
|
(key in self.__config[section].keys())):
|
||||||
if type(value) is bool:
|
if type(value) is bool:
|
||||||
if value:
|
if value:
|
||||||
self.__config[section][key] = "true"
|
self.__config[section][key] = "true"
|
||||||
@ -2042,7 +2051,7 @@ def auth_req():
|
|||||||
else:
|
else:
|
||||||
DashboardConfig.APIAccessed = False
|
DashboardConfig.APIAccessed = False
|
||||||
whiteList = [
|
whiteList = [
|
||||||
'/static/', 'validateAuthentication', 'authenticate', 'getDashboardConfiguration',
|
'/static/', 'validateAuthentication', 'authenticate',
|
||||||
'getDashboardTheme', 'getDashboardVersion', 'sharePeer/get', 'isTotpEnabled', 'locale',
|
'getDashboardTheme', 'getDashboardVersion', 'sharePeer/get', 'isTotpEnabled', 'locale',
|
||||||
'/fileDownload'
|
'/fileDownload'
|
||||||
]
|
]
|
||||||
@ -2180,7 +2189,7 @@ def API_addWireguardConfiguration():
|
|||||||
WireguardConfigurations[data['ConfigurationName']] = WireguardConfiguration(data=data) if data.get('Protocol') == 'wg' else AmneziaWireguardConfiguration(data=data)
|
WireguardConfigurations[data['ConfigurationName']] = WireguardConfiguration(data=data) if data.get('Protocol') == 'wg' else AmneziaWireguardConfiguration(data=data)
|
||||||
return ResponseObject()
|
return ResponseObject()
|
||||||
|
|
||||||
@app.get(f'{APP_PREFIX}/api/toggleWireguardConfiguration/')
|
@app.get(f'{APP_PREFIX}/api/toggleWireguardConfiguration')
|
||||||
def API_toggleWireguardConfiguration():
|
def API_toggleWireguardConfiguration():
|
||||||
configurationName = request.args.get('configurationName')
|
configurationName = request.args.get('configurationName')
|
||||||
if configurationName is None or len(
|
if configurationName is None or len(
|
||||||
@ -2434,7 +2443,7 @@ def API_updatePeerSettings(configName):
|
|||||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive)
|
allowed_ip, endpoint_allowed_ip, mtu, keepalive)
|
||||||
|
|
||||||
return peer.updatePeer(name, private_key, preshared_key, dns_addresses,
|
return peer.updatePeer(name, private_key, preshared_key, dns_addresses,
|
||||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive, data.get('advanced_security', 'off'))
|
allowed_ip, endpoint_allowed_ip, mtu, keepalive, "off")
|
||||||
|
|
||||||
return ResponseObject(False, "Peer does not exist")
|
return ResponseObject(False, "Peer does not exist")
|
||||||
|
|
||||||
@ -2463,11 +2472,11 @@ def API_deletePeers(configName: str) -> ResponseObject:
|
|||||||
peers = data['peers']
|
peers = data['peers']
|
||||||
if configName in WireguardConfigurations.keys():
|
if configName in WireguardConfigurations.keys():
|
||||||
if len(peers) == 0:
|
if len(peers) == 0:
|
||||||
return ResponseObject(False, "Please specify one or more peers")
|
return ResponseObject(False, "Please specify one or more peers", status_code=400)
|
||||||
configuration = WireguardConfigurations.get(configName)
|
configuration = WireguardConfigurations.get(configName)
|
||||||
return configuration.deletePeers(peers)
|
return configuration.deletePeers(peers)
|
||||||
|
|
||||||
return ResponseObject(False, "Configuration does not exist")
|
return ResponseObject(False, "Configuration does not exist", status_code=404)
|
||||||
|
|
||||||
@app.post(f'{APP_PREFIX}/api/restrictPeers/<configName>')
|
@app.post(f'{APP_PREFIX}/api/restrictPeers/<configName>')
|
||||||
def API_restrictPeers(configName: str) -> ResponseObject:
|
def API_restrictPeers(configName: str) -> ResponseObject:
|
||||||
@ -2604,7 +2613,7 @@ def API_addPeers(configName):
|
|||||||
"endpoint_allowed_ip": endpoint_allowed_ip,
|
"endpoint_allowed_ip": endpoint_allowed_ip,
|
||||||
"mtu": mtu,
|
"mtu": mtu,
|
||||||
"keepalive": keep_alive,
|
"keepalive": keep_alive,
|
||||||
"advanced_security": data.get("advanced_security", "off")
|
"advanced_security": "off"
|
||||||
})
|
})
|
||||||
if addedCount == bulkAddAmount:
|
if addedCount == bulkAddAmount:
|
||||||
break
|
break
|
||||||
@ -2674,7 +2683,7 @@ def API_addPeers(configName):
|
|||||||
"DNS": dns_addresses,
|
"DNS": dns_addresses,
|
||||||
"mtu": mtu,
|
"mtu": mtu,
|
||||||
"keepalive": keep_alive,
|
"keepalive": keep_alive,
|
||||||
"advanced_security": data.get("advanced_security", "off")
|
"advanced_security": "off"
|
||||||
}]
|
}]
|
||||||
)
|
)
|
||||||
return ResponseObject(status=status, message=result['message'], data=result['peers'])
|
return ResponseObject(status=status, message=result['message'], data=result['peers'])
|
||||||
@ -2952,7 +2961,7 @@ def API_isTotpEnabled():
|
|||||||
@app.get(f'{APP_PREFIX}/api/Welcome_GetTotpLink')
|
@app.get(f'{APP_PREFIX}/api/Welcome_GetTotpLink')
|
||||||
def API_Welcome_GetTotpLink():
|
def API_Welcome_GetTotpLink():
|
||||||
if not DashboardConfig.GetConfig("Account", "totp_verified")[1]:
|
if not DashboardConfig.GetConfig("Account", "totp_verified")[1]:
|
||||||
DashboardConfig.SetConfig("Account", "totp_key", pyotp.random_base32())
|
DashboardConfig.SetConfig("Account", "totp_key", pyotp.random_base32(), True)
|
||||||
return ResponseObject(
|
return ResponseObject(
|
||||||
data=pyotp.totp.TOTP(DashboardConfig.GetConfig("Account", "totp_key")[1]).provisioning_uri(
|
data=pyotp.totp.TOTP(DashboardConfig.GetConfig("Account", "totp_key")[1]).provisioning_uri(
|
||||||
issuer_name="WGDashboard"))
|
issuer_name="WGDashboard"))
|
||||||
@ -3106,9 +3115,12 @@ def peerInformationBackgroundThread():
|
|||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
while True:
|
while True:
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
for c in WireguardConfigurations.values():
|
|
||||||
if c.getStatus():
|
|
||||||
try:
|
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.getPeersTransfer()
|
||||||
c.getPeersLatestHandshake()
|
c.getPeersLatestHandshake()
|
||||||
c.getPeersEndpoint()
|
c.getPeersEndpoint()
|
||||||
|
@ -11,8 +11,8 @@ class EmailSender:
|
|||||||
def __init__(self, DashboardConfig):
|
def __init__(self, DashboardConfig):
|
||||||
self.smtp = None
|
self.smtp = None
|
||||||
self.DashboardConfig = DashboardConfig
|
self.DashboardConfig = DashboardConfig
|
||||||
if not os.path.exists('../attachments'):
|
if not os.path.exists('./attachments'):
|
||||||
os.mkdir('../attachments')
|
os.mkdir('./attachments')
|
||||||
|
|
||||||
def Server(self):
|
def Server(self):
|
||||||
return self.DashboardConfig.GetConfig("Email", "server")[1]
|
return self.DashboardConfig.GetConfig("Email", "server")[1]
|
||||||
@ -33,8 +33,7 @@ class EmailSender:
|
|||||||
return self.DashboardConfig.GetConfig("Email", "send_from")[1]
|
return self.DashboardConfig.GetConfig("Email", "send_from")[1]
|
||||||
|
|
||||||
def ready(self):
|
def ready(self):
|
||||||
print(self.Server())
|
return len(self.Server()) > 0 and len(self.Port()) > 0 and len(self.Encryption()) > 0 and len(self.Username()) > 0 and len(self.Password()) > 0 and len(self.SendFrom())
|
||||||
return len(self.Server()) > 0 and len(self.Port()) > 0 and len(self.Encryption()) > 0 and len(self.Username()) > 0 and len(self.Password()) > 0
|
|
||||||
|
|
||||||
def send(self, receiver, subject, body, includeAttachment = False, attachmentName = ""):
|
def send(self, receiver, subject, body, includeAttachment = False, attachmentName = ""):
|
||||||
if self.ready():
|
if self.ready():
|
||||||
@ -46,7 +45,7 @@ class EmailSender:
|
|||||||
self.smtp.login(self.Username(), self.Password())
|
self.smtp.login(self.Username(), self.Password())
|
||||||
message = MIMEMultipart()
|
message = MIMEMultipart()
|
||||||
message['Subject'] = subject
|
message['Subject'] = subject
|
||||||
message['From'] = formataddr((Header(self.SendFrom()).encode(), self.Username()))
|
message['From'] = self.SendFrom()
|
||||||
message["To"] = receiver
|
message["To"] = receiver
|
||||||
message.attach(MIMEText(body, "plain"))
|
message.attach(MIMEText(body, "plain"))
|
||||||
|
|
||||||
@ -62,7 +61,7 @@ class EmailSender:
|
|||||||
else:
|
else:
|
||||||
self.smtp.close()
|
self.smtp.close()
|
||||||
return False, "Attachment does not exist"
|
return False, "Attachment does not exist"
|
||||||
self.smtp.sendmail(self.Username(), receiver, message.as_string())
|
self.smtp.sendmail(self.SendFrom(), receiver, message.as_string())
|
||||||
self.smtp.close()
|
self.smtp.close()
|
||||||
return True, None
|
return True, None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -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-CUmHRwBw.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-DZliHkQD.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};
|
@ -1 +0,0 @@
|
|||||||
.fade-enter-active[data-v-6451623a]{transition-delay:var(--d75b06ae)!important}.progress-bar[data-v-c7f6d1a1]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.filter a[data-v-ea61b607]{text-decoration:none}
|
|
1
src/static/app/dist/assets/configurationList-BY8izVeQ.css
vendored
Normal file
1
src/static/app/dist/assets/configurationList-BY8izVeQ.css
vendored
Normal file
@ -0,0 +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}
|
1
src/static/app/dist/assets/configurationList-Cznk60kB.js
vendored
Normal file
1
src/static/app/dist/assets/configurationList-Cznk60kB.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
7
src/static/app/dist/assets/editConfiguration-gjtFMIrx.js
vendored
Normal file
7
src/static/app/dist/assets/editConfiguration-gjtFMIrx.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
.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-694cfad1]{--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),#ff4a0052 100%)}.agentContainer.enabled[data-v-694cfad1]{height:calc(var(--agentHeight) - 1rem)}@media screen and (max-width: 768px){.agentContainer[data-v-694cfad1]{--agentHeight: 100vh !important;top:0;left:0;max-height:calc(var(--agentHeight) - 58px - 1rem);width:calc(100% - 1rem)}}.agentChatroomBody[data-v-694cfad1]{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)}}}
|
.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
File diff suppressed because one or more lines are too long
@ -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-CUmHRwBw.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-DZliHkQD.js";/*!
|
||||||
* @kurkle/color v0.3.2
|
* @kurkle/color v0.3.2
|
||||||
* https://github.com/kurkle/color#readme
|
* https://github.com/kurkle/color#readme
|
||||||
* (c) 2023 Jukka Kurkela
|
* (c) 2023 Jukka Kurkela
|
@ -1 +1 @@
|
|||||||
import{_ as e,G as t,a as o,c as a,t as c}from"./index-CUmHRwBw.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-DZliHkQD.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};
|
@ -1 +1 @@
|
|||||||
import{L as l}from"./localeText-DvaqSAco.js";import{d as c}from"./dayjs.min-C3XPfvH9.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-CUmHRwBw.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-DG9SnJT8.js";import{d as c}from"./dayjs.min-PaIL06iQ.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-DZliHkQD.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};
|
1
src/static/app/dist/assets/newConfiguration-CAFzjDsW.css
vendored
Normal file
1
src/static/app/dist/assets/newConfiguration-CAFzjDsW.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.protocolBtnGroup a[data-v-b97242f3]{transition:all .2s ease-in-out}
|
3
src/static/app/dist/assets/newConfiguration-CPAMxqV6.js
vendored
Normal file
3
src/static/app/dist/assets/newConfiguration-CPAMxqV6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
|||||||
.protocolBtnGroup a[data-v-b4bbbc2b]{transition:all .2s ease-in-out}
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
src/static/app/dist/assets/peerAddModal-DD-hu-9U.js
vendored
Normal file
1
src/static/app/dist/assets/peerAddModal-DD-hu-9U.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -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-CUmHRwBw.js";import{L as T}from"./localeText-DvaqSAco.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-DZliHkQD.js";import{L as T}from"./localeText-DG9SnJT8.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};
|
@ -1 +1 @@
|
|||||||
import{S as p,a as b}from"./schedulePeerJob-Rx5QXWIx.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-CUmHRwBw.js";import{L as w}from"./localeText-DvaqSAco.js";import"./vue-datepicker-CUbRHf9G.js";import"./dayjs.min-C3XPfvH9.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-Ci8HK7bA.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-DZliHkQD.js";import{L as w}from"./localeText-DG9SnJT8.js";import"./vue-datepicker-4ltJE5cT.js";import"./dayjs.min-PaIL06iQ.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};
|
@ -1 +1 @@
|
|||||||
import{S as _}from"./schedulePeerJob-Rx5QXWIx.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-CUmHRwBw.js";import{L as x}from"./localeText-DvaqSAco.js";import"./vue-datepicker-CUbRHf9G.js";import"./dayjs.min-C3XPfvH9.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-Ci8HK7bA.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-DZliHkQD.js";import{L as x}from"./localeText-DG9SnJT8.js";import"./vue-datepicker-4ltJE5cT.js";import"./dayjs.min-PaIL06iQ.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
File diff suppressed because one or more lines are too long
2
src/static/app/dist/assets/peerList-CT7gvMs4.js
vendored
Normal file
2
src/static/app/dist/assets/peerList-CT7gvMs4.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
src/static/app/dist/assets/peerQRCode-B62rUhHV.css
vendored
Normal file
1
src/static/app/dist/assets/peerQRCode-B62rUhHV.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
@media screen and (max-width: 768px){#qrcode[data-v-7c287bf3]{width:100%!important;height:auto!important;aspect-ratio:1/1}}
|
1
src/static/app/dist/assets/peerQRCode-Dxvodnam.js
vendored
Normal file
1
src/static/app/dist/assets/peerQRCode-Dxvodnam.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
import{b as i}from"./browser-CjSdxGTc.js";import{L as c}from"./localeText-DG9SnJT8.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-DZliHkQD.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};
|
@ -1 +0,0 @@
|
|||||||
import{b as r}from"./browser-CjSdxGTc.js";import{L as i}from"./localeText-DvaqSAco.js";import{_ as c,D as l,g as p,k as _,a,c as n,b as e,d as m,n as h,e as u}from"./index-CUmHRwBw.js";const f={name:"peerQRCode",components:{LocaleText:i},props:{selectedPeer:Object},setup(){return{dashboardStore:l()}},data(){return{loading:!0}},mounted(){p("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},t=>{this.loading=!1,t.status?r.toCanvas(document.querySelector("#qrcode"),t.data.file,s=>{s&&console.error(s)}):this.dashboardStore.newMessage("Server",t.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},g={class:"container d-flex h-100 w-100"},v={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},x={class:"card rounded-3 shadow"},C={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},w={class:"mb-0"},y={class:"card-body p-4"},S={style:{width:"292px",height:"292px"},class:"d-flex"},k={key:0,class:"spinner-border m-auto",role:"status"};function L(t,s,$,q,o,B){const d=_("LocaleText");return a(),n("div",b,[e("div",g,[e("div",v,[e("div",x,[e("div",C,[e("h4",w,[m(d,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:s[0]||(s[0]=N=>this.$emit("close"))})]),e("div",y,[e("div",S,[e("canvas",{id:"qrcode",class:h(["rounded-3 shadow animate__animated animate__fadeIn animate__faster",{"d-none":o.loading}])},null,2),o.loading?(a(),n("div",k,s[1]||(s[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)]))):u("",!0)])])])])])])}const T=c(f,[["render",L]]);export{T as default};
|
|
@ -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-CUmHRwBw.js";import{L as T}from"./localeText-DvaqSAco.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-DZliHkQD.js";import{L as T}from"./localeText-DG9SnJT8.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};
|
1
src/static/app/dist/assets/peerSettings-BkfvIQvk.css
vendored
Normal file
1
src/static/app/dist/assets/peerSettings-BkfvIQvk.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.toggleShowKey[data-v-12b3ae8e]{position:absolute;top:35px;right:12px}
|
1
src/static/app/dist/assets/peerSettings-Bne_y8f7.js
vendored
Normal file
1
src/static/app/dist/assets/peerSettings-Bne_y8f7.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
|||||||
.toggleShowKey[data-v-2166fcf9]{position:absolute;top:35px;right:12px}
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
import{L as r}from"./localeText-DvaqSAco.js";import{a as t,c as n,f as i,i as s,e as a}from"./index-CUmHRwBw.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-DG9SnJT8.js";import{a as t,c as n,f as i,i as s,e as a}from"./index-DZliHkQD.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
@ -1 +0,0 @@
|
|||||||
.btn.disabled[data-v-6a5aba2a]{opacity:1;background-color:#0d6efd17;border-color:transparent}[data-v-8f3f1b93]{font-size:.875rem}input[data-v-8f3f1b93]{padding:.1rem .4rem}input[data-v-8f3f1b93]:disabled{border-color:transparent;background-color:#0d6efd17;color:#0d6efd}.dp__main[data-v-8f3f1b93]{width:auto;flex-grow:1;--dp-input-padding: 2.5px 30px 2.5px 12px;--dp-border-radius: .5rem}
|
|
1
src/static/app/dist/assets/schedulePeerJob-Ci8HK7bA.js
vendored
Normal file
1
src/static/app/dist/assets/schedulePeerJob-Ci8HK7bA.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/static/app/dist/assets/schedulePeerJob-DPy59wup.css
vendored
Normal file
1
src/static/app/dist/assets/schedulePeerJob-DPy59wup.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.btn.disabled[data-v-6a5aba2a]{opacity:1;background-color:#0d6efd17;border-color:transparent}[data-v-4aa63a3e]{font-size:.875rem}input[data-v-4aa63a3e]{padding:.1rem .4rem}input[data-v-4aa63a3e]:disabled{border-color:transparent;background-color:#0d6efd17;color:#0d6efd}.dp__main[data-v-4aa63a3e]{width:auto;flex-grow:1;--dp-input-padding: 2.5px 30px 2.5px 12px;--dp-border-radius: .5rem}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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-CUmHRwBw.js";import{L as g}from"./localeText-DvaqSAco.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-DZliHkQD.js";import{L as g}from"./localeText-DG9SnJT8.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};
|
@ -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-CUmHRwBw.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-DvaqSAco.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-DZliHkQD.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-DG9SnJT8.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
1
src/static/app/dist/assets/storageMount-Bl6vLa1N.css
vendored
Normal file
1
src/static/app/dist/assets/storageMount-Bl6vLa1N.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.square[data-v-2ad535bb]{height:var(--2ec4d3bc);transition:background-color .5s cubic-bezier(.42,0,.22,1)}.square[data-v-9509d7a0]{height:var(--2dc8ab7e);transition:background-color .5s cubic-bezier(.42,0,.22,1)}
|
@ -1 +0,0 @@
|
|||||||
.square[data-v-70102637]{height:var(--e901480c);transition:background-color .5s cubic-bezier(.42,0,.22,1)}.floatingLabel[data-v-70102637]{top:40px}.square[data-v-a382214a]{height:var(--38705f32);transition:background-color .5s cubic-bezier(.42,0,.22,1)}.floatingLabel[data-v-a382214a]{top:var(--38705f32)}
|
|
@ -0,0 +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-DZliHkQD.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};
|
@ -1 +0,0 @@
|
|||||||
import{_ as i,p as m,r as p,q as b,a as o,c as t,d as g,w as v,n as x,b as r,t as n,e as f,j as C,s as w}from"./index-CUmHRwBw.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=>({e901480c:u.value}));const l=e,a=p(!1),u=b(()=>l.square?"40px":"25px");return(c,s)=>(o(),t("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:s[0]||(s[0]=d=>a.value=!0),onMouseleave:s[1]||(s[1]=d=>a.value=!1),style:w({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[g(C,{name:"zoomReversed"},{default:v(()=>[a.value?(o(),t("div",{key:0,style:{"white-space":"nowrap"},class:x(["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"]])},[r("small",y," Core #"+n(e.core_number+1),1),r("small",_,n(e.percentage)+"% ",1)],2)):f("",!0)]),_:1})],36))}},B=i(k,[["__scopeId","data-v-70102637"]]);export{B as C};
|
|
File diff suppressed because one or more lines are too long
@ -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-CUmHRwBw.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-DvaqSAco.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-DZliHkQD.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-DG9SnJT8.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};
|
@ -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-CUmHRwBw.js";import{O as A}from"./osmap-C861OkPV.js";import{L as w}from"./localeText-DvaqSAco.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-DZliHkQD.js";import{O as A}from"./osmap-CmjRjQ0N.js";import{L as w}from"./localeText-DG9SnJT8.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};
|
File diff suppressed because one or more lines are too long
2
src/static/app/dist/index.html
vendored
2
src/static/app/dist/index.html
vendored
@ -10,7 +10,7 @@
|
|||||||
<link rel="icon" href="/static/app/dist/img/Logo-2-512x512.png">
|
<link rel="icon" href="/static/app/dist/img/Logo-2-512x512.png">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>WGDashboard</title>
|
<title>WGDashboard</title>
|
||||||
<script type="module" crossorigin src="/static/app/dist/assets/index-CUmHRwBw.js"></script>
|
<script type="module" crossorigin src="/static/app/dist/assets/index-DZliHkQD.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/static/app/dist/assets/index-DFl-XeJT.css">
|
<link rel="stylesheet" crossorigin href="/static/app/dist/assets/index-DFl-XeJT.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "app",
|
"name": "app",
|
||||||
"version": "4.2.0",
|
"version": "4.2.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"buildcommitpush": "./build.sh",
|
"buildcommitpush": "./build.sh",
|
||||||
"build electron": "vite build && vite build --mode electron && cd ../../../../WGDashboard-Desktop && electron-builder --mac --win",
|
"build electron": "vite build && vite build --mode electron && cd ../../../../WGDashboard-Desktop && /opt/homebrew/bin/npm run \"electron dist\"",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -36,7 +36,7 @@ const resetForm = () => {
|
|||||||
dataChanged.value = false;
|
dataChanged.value = false;
|
||||||
Object.assign(data, JSON.parse(JSON.stringify(props.configurationInfo)))
|
Object.assign(data, JSON.parse(JSON.stringify(props.configurationInfo)))
|
||||||
}
|
}
|
||||||
const emit = defineEmits(["changed", "close", "refresh"])
|
const emit = defineEmits(["changed", "close", "refresh", "dataChanged"])
|
||||||
const saveForm = () => {
|
const saveForm = () => {
|
||||||
saving.value = true
|
saving.value = true
|
||||||
fetchPost("/api/updateWireguardConfiguration", data, (res) => {
|
fetchPost("/api/updateWireguardConfiguration", data, (res) => {
|
||||||
@ -63,10 +63,12 @@ const editRawConfigurationFileModal = ref(false)
|
|||||||
const backupRestoreModal = ref(false)
|
const backupRestoreModal = ref(false)
|
||||||
const deleteConfigurationModal = ref(false)
|
const deleteConfigurationModal = ref(false)
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll" ref="editConfigurationContainer">
|
<div class="peerSettingContainer w-100 h-100 position-absolute top-0 start-0" ref="editConfigurationContainer">
|
||||||
|
<div class="w-100 h-100 overflow-y-scroll">
|
||||||
<TransitionGroup name="zoom">
|
<TransitionGroup name="zoom">
|
||||||
<EditRawConfigurationFile
|
<EditRawConfigurationFile
|
||||||
name="EditRawConfigurationFile"
|
name="EditRawConfigurationFile"
|
||||||
@ -171,7 +173,19 @@ const deleteConfigurationModal = ref(false)
|
|||||||
id="configuration_listen_port">
|
id="configuration_listen_port">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div v-for="key in ['PreUp', 'PreDown', 'PostUp', 'PostDown']">
|
<div class="accordion mt-2" id="editConfigurationOptionalAccordion">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header">
|
||||||
|
<button class="accordion-button collapsed px-3 py-2" type="button" data-bs-toggle="collapse" data-bs-target="#editOptionalAccordionCollapse">
|
||||||
|
<small class="text-muted">
|
||||||
|
<LocaleText t="Optional Settings"></LocaleText>
|
||||||
|
</small>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="editOptionalAccordionCollapse"
|
||||||
|
class="accordion-collapse collapse" data-bs-parent="#editConfigurationOptionalAccordion">
|
||||||
|
<div class="accordion-body d-flex flex-column gap-3">
|
||||||
|
<div v-for="key in ['Table', 'PreUp', 'PreDown', 'PostUp', 'PostDown']">
|
||||||
<label :for="'configuration_' + key" class="form-label">
|
<label :for="'configuration_' + key" class="form-label">
|
||||||
<small class="text-muted">
|
<small class="text-muted">
|
||||||
<LocaleText :t="key"></LocaleText>
|
<LocaleText :t="key"></LocaleText>
|
||||||
@ -194,6 +208,13 @@ const deleteConfigurationModal = ref(false)
|
|||||||
v-model="data[key]"
|
v-model="data[key]"
|
||||||
:id="'configuration_' + key">
|
:id="'configuration_' + key">
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="d-flex align-items-center gap-2 mt-4">
|
<div class="d-flex align-items-center gap-2 mt-4">
|
||||||
<button class="btn bg-secondary-subtle border-secondary-subtle text-secondary-emphasis rounded-3 shadow ms-auto"
|
<button class="btn bg-secondary-subtle border-secondary-subtle text-secondary-emphasis rounded-3 shadow ms-auto"
|
||||||
@click="resetForm()"
|
@click="resetForm()"
|
||||||
@ -242,6 +263,7 @@ const deleteConfigurationModal = ref(false)
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@ -98,15 +98,6 @@ export default {
|
|||||||
<samp>{{Peer.allowed_ip}}</samp>
|
<samp>{{Peer.allowed_ip}}</samp>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="Peer.advanced_security"
|
|
||||||
:class="{'d-flex gap-2 align-items-center' : dashboardStore.Configuration.Server.dashboard_peer_list_display === 'list'}">
|
|
||||||
<small class="text-muted">
|
|
||||||
<LocaleText t="Advanced Security"></LocaleText>
|
|
||||||
</small>
|
|
||||||
<small class="d-block">
|
|
||||||
<samp>{{Peer.advanced_security}}</samp>
|
|
||||||
</small>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex align-items-end ms-auto">
|
<div class="d-flex align-items-end ms-auto">
|
||||||
<div class="ms-auto px-2 rounded-3 subMenuBtn"
|
<div class="ms-auto px-2 rounded-3 subMenuBtn"
|
||||||
:class="{active: this.subMenuOpened}"
|
:class="{active: this.subMenuOpened}"
|
||||||
|
@ -102,11 +102,12 @@ watch(() => {
|
|||||||
<div class="card-body px-4 pb-4">
|
<div class="card-body px-4 pb-4">
|
||||||
<div class="d-flex flex-column gap-2">
|
<div class="d-flex flex-column gap-2">
|
||||||
<BulkAdd :saving="saving" :data="peerData" :availableIp="availableIp"></BulkAdd>
|
<BulkAdd :saving="saving" :data="peerData" :availableIp="availableIp"></BulkAdd>
|
||||||
|
<template v-if="!peerData.bulkAdd">
|
||||||
<hr class="mb-0 mt-2">
|
<hr class="mb-0 mt-2">
|
||||||
<NameInput :saving="saving" :data="peerData" v-if="!peerData.bulkAdd"></NameInput>
|
<NameInput :saving="saving" :data="peerData"></NameInput>
|
||||||
<PrivatePublicKeyInput :saving="saving" :data="peerData" v-if="!peerData.bulkAdd"></PrivatePublicKeyInput>
|
<PrivatePublicKeyInput :saving="saving" :data="peerData"></PrivatePublicKeyInput>
|
||||||
<AllowedIPsInput :availableIp="availableIp" :saving="saving" :data="peerData" v-if="!peerData.bulkAdd"></AllowedIPsInput>
|
<AllowedIPsInput :availableIp="availableIp" :saving="saving" :data="peerData"></AllowedIPsInput>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="accordion mb-3" id="peerAddModalAccordion">
|
<div class="accordion mb-3" id="peerAddModalAccordion">
|
||||||
@ -155,36 +156,6 @@ watch(() => {
|
|||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="getProtocol === 'awg'">
|
|
||||||
<h5>
|
|
||||||
<LocaleText t="AmneziaWG Peer Setting"></LocaleText>
|
|
||||||
</h5>
|
|
||||||
<div >
|
|
||||||
<label class="form-label d-block"><small class="text-muted">
|
|
||||||
<LocaleText t="Advanced Security"></LocaleText>
|
|
||||||
</small></label>
|
|
||||||
|
|
||||||
<div class="btn-group" role="group">
|
|
||||||
<input type="radio" class="btn-check"
|
|
||||||
v-model="peerData.advanced_security"
|
|
||||||
value="on"
|
|
||||||
name="advanced_security_radio" id="advanced_security_on" autocomplete="off">
|
|
||||||
<label class="btn btn-outline-primary btn-sm" for="advanced_security_on">
|
|
||||||
<LocaleText t="On"></LocaleText>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<input type="radio"
|
|
||||||
v-model="peerData.advanced_security"
|
|
||||||
value="off"
|
|
||||||
class="btn-check" name="advanced_security_radio" id="advanced_security_off" autocomplete="off">
|
|
||||||
<label class="btn btn-outline-primary btn-sm" for="advanced_security_off">
|
|
||||||
<LocaleText t="Off"></LocaleText>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="d-flex mt-2">
|
<div class="d-flex mt-2">
|
||||||
<button class="ms-auto btn btn-dark btn-brand rounded-3 px-3 py-2 shadow"
|
<button class="ms-auto btn btn-dark btn-brand rounded-3 px-3 py-2 shadow"
|
||||||
:disabled="!allRequireFieldsFilled || saving"
|
:disabled="!allRequireFieldsFilled || saving"
|
||||||
|
@ -157,35 +157,6 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div v-if="this.getProtocol === 'awg'">
|
|
||||||
<h5>
|
|
||||||
<LocaleText t="AmneziaWG Peer Setting"></LocaleText>
|
|
||||||
</h5>
|
|
||||||
<div >
|
|
||||||
<label class="form-label d-block"><small class="text-muted">
|
|
||||||
<LocaleText t="Advanced Security"></LocaleText>
|
|
||||||
</small></label>
|
|
||||||
|
|
||||||
<div class="btn-group" role="group">
|
|
||||||
<input type="radio" class="btn-check"
|
|
||||||
v-model="this.data.advanced_security"
|
|
||||||
value="on"
|
|
||||||
name="advanced_security_radio" id="advanced_security_on" autocomplete="off">
|
|
||||||
<label class="btn btn-outline-primary btn-sm" for="advanced_security_on">
|
|
||||||
<LocaleText t="On"></LocaleText>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<input type="radio"
|
|
||||||
v-model="this.data.advanced_security"
|
|
||||||
value="off"
|
|
||||||
class="btn-check" name="advanced_security_radio" id="advanced_security_off" autocomplete="off">
|
|
||||||
<label class="btn btn-outline-primary btn-sm" for="advanced_security_off">
|
|
||||||
<LocaleText t="Off"></LocaleText>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="d-flex mt-2">
|
<div class="d-flex mt-2">
|
||||||
<button class="ms-auto btn btn-dark btn-brand rounded-3 px-3 py-2 shadow"
|
<button class="ms-auto btn btn-dark btn-brand rounded-3 px-3 py-2 shadow"
|
||||||
:disabled="!this.allRequireFieldsFilled || this.saving"
|
:disabled="!this.allRequireFieldsFilled || this.saving"
|
||||||
|
@ -197,7 +197,7 @@ export default {
|
|||||||
methods:{
|
methods:{
|
||||||
toggle(){
|
toggle(){
|
||||||
this.configurationToggling = true;
|
this.configurationToggling = true;
|
||||||
fetchGet("/api/toggleWireguardConfiguration/", {
|
fetchGet("/api/toggleWireguardConfiguration", {
|
||||||
configurationName: this.configurationInfo.Name
|
configurationName: this.configurationInfo.Name
|
||||||
}, (res) => {
|
}, (res) => {
|
||||||
if (res.status){
|
if (res.status){
|
||||||
|
@ -118,7 +118,7 @@ watch(() => {
|
|||||||
// Toggle Configuration Method =====================================
|
// Toggle Configuration Method =====================================
|
||||||
const toggleConfiguration = async () => {
|
const toggleConfiguration = async () => {
|
||||||
configurationToggling.value = true;
|
configurationToggling.value = true;
|
||||||
await fetchGet("/api/toggleWireguardConfiguration/", {
|
await fetchGet("/api/toggleWireguardConfiguration", {
|
||||||
configurationName: configurationInfo.value.Name
|
configurationName: configurationInfo.value.Name
|
||||||
}, (res) => {
|
}, (res) => {
|
||||||
if (res.status){
|
if (res.status){
|
||||||
|
@ -24,7 +24,29 @@ export default {
|
|||||||
}, (res) => {
|
}, (res) => {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
if (res.status){
|
if (res.status){
|
||||||
QRCode.toCanvas(document.querySelector("#qrcode"), res.data.file, (error) => {
|
let data = ""
|
||||||
|
if (this.selectedPeer.configuration.Protocol === "awg"){
|
||||||
|
let awgQRCodeObject = {
|
||||||
|
containers: [
|
||||||
|
{
|
||||||
|
awg: {
|
||||||
|
isThirdPartyConfig: true,
|
||||||
|
last_config: res.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
|
||||||
|
}
|
||||||
|
data = btoa(JSON.stringify(awgQRCodeObject))
|
||||||
|
}else{
|
||||||
|
data = res.data.file
|
||||||
|
}
|
||||||
|
QRCode.toCanvas(document.querySelector("#qrcode"), data, (error) => {
|
||||||
if (error) console.error(error)
|
if (error) console.error(error)
|
||||||
})
|
})
|
||||||
}else{
|
}else{
|
||||||
@ -47,8 +69,10 @@ export default {
|
|||||||
<button type="button" class="btn-close ms-auto" @click="this.$emit('close')"></button>
|
<button type="button" class="btn-close ms-auto" @click="this.$emit('close')"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div style="width: 292px; height: 292px;" class="d-flex">
|
<div class="d-flex">
|
||||||
<canvas id="qrcode" class="rounded-3 shadow animate__animated animate__fadeIn animate__faster" :class="{'d-none': loading}"></canvas>
|
<canvas id="qrcode" class="rounded-3 shadow animate__animated animate__fadeIn animate__faster"
|
||||||
|
|
||||||
|
:class="{'d-none': loading}"></canvas>
|
||||||
<div class="spinner-border m-auto" role="status" v-if="loading">
|
<div class="spinner-border m-auto" role="status" v-if="loading">
|
||||||
<span class="visually-hidden">Loading...</span>
|
<span class="visually-hidden">Loading...</span>
|
||||||
</div>
|
</div>
|
||||||
@ -61,4 +85,11 @@ export default {
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
#qrcode{
|
||||||
|
width: 100% !important;
|
||||||
|
height: auto !important;
|
||||||
|
aspect-ratio: 1/1;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
@ -46,7 +46,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
save(){
|
save(){
|
||||||
if (this.job.Field && this.job.Operator && this.job.Action && this.job.Value){
|
if (this.job.Field && this.job.Operator && this.job.Action && this.job.Value){
|
||||||
fetchPost(`/api/savePeerScheduleJob/`, {
|
fetchPost(`/api/savePeerScheduleJob`, {
|
||||||
Job: this.job
|
Job: this.job
|
||||||
}, (res) => {
|
}, (res) => {
|
||||||
if (res.status){
|
if (res.status){
|
||||||
@ -84,7 +84,7 @@ export default {
|
|||||||
},
|
},
|
||||||
delete(){
|
delete(){
|
||||||
if(this.job.CreationDate){
|
if(this.job.CreationDate){
|
||||||
fetchPost(`/api/deletePeerScheduleJob/`, {
|
fetchPost(`/api/deletePeerScheduleJob`, {
|
||||||
Job: this.job
|
Job: this.job
|
||||||
}, (res) => {
|
}, (res) => {
|
||||||
if (!res.status){
|
if (!res.status){
|
||||||
|
@ -198,30 +198,6 @@ export default {
|
|||||||
v-model="this.data.keepalive"
|
v-model="this.data.keepalive"
|
||||||
id="peer_keep_alive">
|
id="peer_keep_alive">
|
||||||
</div>
|
</div>
|
||||||
<div v-if="this.data.advanced_security">
|
|
||||||
<label for="peer_advance_security" class="form-label d-block">
|
|
||||||
<small class="text-muted">
|
|
||||||
<LocaleText t="Advanced Security"></LocaleText>
|
|
||||||
</small>
|
|
||||||
</label>
|
|
||||||
<div class="btn-group" role="group">
|
|
||||||
<input type="radio" class="btn-check"
|
|
||||||
v-model="this.data.advanced_security"
|
|
||||||
value="on"
|
|
||||||
name="advanced_security_radio" id="advanced_security_on" autocomplete="off">
|
|
||||||
<label class="btn btn-outline-primary btn-sm" for="advanced_security_on">
|
|
||||||
<LocaleText t="On"></LocaleText>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<input type="radio"
|
|
||||||
v-model="this.data.advanced_security"
|
|
||||||
value="off"
|
|
||||||
class="btn-check" name="advanced_security_radio" id="advanced_security_off" autocomplete="off">
|
|
||||||
<label class="btn btn-outline-primary btn-sm" for="advanced_security_off">
|
|
||||||
<LocaleText t="Off"></LocaleText>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,7 +29,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
toggle(){
|
toggle(){
|
||||||
this.configurationToggling = true;
|
this.configurationToggling = true;
|
||||||
fetchGet("/api/toggleWireguardConfiguration/", {
|
fetchGet("/api/toggleWireguardConfiguration", {
|
||||||
configurationName: this.c.Name
|
configurationName: this.c.Name
|
||||||
}, (res) => {
|
}, (res) => {
|
||||||
if (res.status){
|
if (res.status){
|
||||||
|
@ -75,7 +75,7 @@ const store = DashboardConfigurationStore()
|
|||||||
width: 450px;
|
width: 450px;
|
||||||
box-shadow: 0px 10px 30px rgba(0, 0, 0, 0.3);
|
box-shadow: 0px 10px 30px rgba(0, 0, 0, 0.3);
|
||||||
backdrop-filter: blur(8px);
|
backdrop-filter: blur(8px);
|
||||||
background: linear-gradient(var(--degree), #009dff52 var(--distance2), #ff4a0052 100%);
|
background: linear-gradient(var(--degree), #009dff52 var(--distance2), #F9464752 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.agentContainer.enabled{
|
.agentContainer.enabled{
|
||||||
|
@ -27,6 +27,7 @@ const squareHeight = computed(() => {
|
|||||||
<div
|
<div
|
||||||
v-if="show"
|
v-if="show"
|
||||||
style="white-space: nowrap;"
|
style="white-space: nowrap;"
|
||||||
|
:style="{'top': squareHeight}"
|
||||||
class="floatingLabel z-3 border position-absolute d-block p-1 px-2
|
class="floatingLabel z-3 border position-absolute d-block p-1 px-2
|
||||||
bg-body text-body rounded-3 border shadow d-flex"
|
bg-body text-body rounded-3 border shadow d-flex"
|
||||||
:class="[align ? 'end-0':'start-0']"
|
:class="[align ? 'end-0':'start-0']"
|
||||||
@ -48,7 +49,4 @@ const squareHeight = computed(() => {
|
|||||||
transition: background-color 0.5s cubic-bezier(0.42, 0, 0.22, 1.0);
|
transition: background-color 0.5s cubic-bezier(0.42, 0, 0.22, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.floatingLabel{
|
|
||||||
top: 40px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
@ -23,6 +23,7 @@ const squareHeight = computed(() => {
|
|||||||
<div
|
<div
|
||||||
v-if="show"
|
v-if="show"
|
||||||
style="white-space: nowrap;"
|
style="white-space: nowrap;"
|
||||||
|
:style="{'top': squareHeight}"
|
||||||
class="floatingLabel z-3 border position-absolute d-block p-1 px-2
|
class="floatingLabel z-3 border position-absolute d-block p-1 px-2
|
||||||
bg-body text-body rounded-3 border shadow d-flex"
|
bg-body text-body rounded-3 border shadow d-flex"
|
||||||
:class="[align ? 'end-0':'start-0']"
|
:class="[align ? 'end-0':'start-0']"
|
||||||
@ -43,8 +44,4 @@ const squareHeight = computed(() => {
|
|||||||
height: v-bind(squareHeight);
|
height: v-bind(squareHeight);
|
||||||
transition: background-color 0.5s cubic-bezier(0.42, 0, 0.22, 1.0);
|
transition: background-color 0.5s cubic-bezier(0.42, 0, 0.22, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.floatingLabel{
|
|
||||||
top: v-bind(squareHeight);
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
@ -66,7 +66,7 @@ const data = computed(() => {
|
|||||||
</h6>
|
</h6>
|
||||||
<h6 class="ms-auto">
|
<h6 class="ms-auto">
|
||||||
<span v-if="data">
|
<span v-if="data">
|
||||||
{{ data?.Disks.find(x => x.mountPoint === '/').percent }}%
|
{{ data.Disks.find(x => x.mountPoint === '/') ? data?.Disks.find(x => x.mountPoint === '/').percent : data?.Disks[0].percent }}%
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="spinner-border spinner-border-sm"></span>
|
<span v-else class="spinner-border spinner-border-sm"></span>
|
||||||
</h6>
|
</h6>
|
||||||
|
@ -35,39 +35,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Sidebar
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*.sidebar {*/
|
|
||||||
/* position: fixed;*/
|
|
||||||
/* top: 0;*/
|
|
||||||
/* bottom: 0;*/
|
|
||||||
/* left: 0;*/
|
|
||||||
/* z-index: 100;*/
|
|
||||||
/* !* Behind the navbar *!*/
|
|
||||||
/* padding: 48px 0 0;*/
|
|
||||||
/* !* Height of navbar *!*/
|
|
||||||
/* box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*.sidebar-sticky {*/
|
|
||||||
/* position: relative;*/
|
|
||||||
/* top: 0;*/
|
|
||||||
/* height: calc(100vh - 48px);*/
|
|
||||||
/* padding-top: .5rem;*/
|
|
||||||
/* overflow-x: hidden;*/
|
|
||||||
/* overflow-y: auto;*/
|
|
||||||
/* !* Scrollable contents if viewport is shorter than content. *!*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*@supports ((position: -webkit-sticky) or (position: sticky)) {*/
|
|
||||||
/* .sidebar-sticky {*/
|
|
||||||
/* position: -webkit-sticky;*/
|
|
||||||
/* position: sticky;*/
|
|
||||||
/* }*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
@property --brandColor1 {
|
@property --brandColor1 {
|
||||||
syntax: '<color>';
|
syntax: '<color>';
|
||||||
initial-value: #009dff;
|
initial-value: #009dff;
|
||||||
@ -1273,7 +1240,6 @@ samp{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.wireguardBg{
|
.wireguardBg{
|
||||||
|
|
||||||
background: rgb(125,32,32);
|
background: rgb(125,32,32);
|
||||||
background: linear-gradient(90deg, rgba(125,32,32,1) 0%, rgba(255,56,56,1) 100%);
|
background: linear-gradient(90deg, rgba(125,32,32,1) 0%, rgba(255,56,56,1) 100%);
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ export default {
|
|||||||
PreDown: "",
|
PreDown: "",
|
||||||
PostUp: "",
|
PostUp: "",
|
||||||
PostDown: "",
|
PostDown: "",
|
||||||
|
Table: "",
|
||||||
Protocol: "wg",
|
Protocol: "wg",
|
||||||
Jc: 5,
|
Jc: 5,
|
||||||
Jmin: 49,
|
Jmin: 49,
|
||||||
@ -342,6 +343,7 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<div class="accordion" id="newConfigurationOptionalAccordion">
|
<div class="accordion" id="newConfigurationOptionalAccordion">
|
||||||
<div class="accordion-item">
|
<div class="accordion-item">
|
||||||
@ -353,7 +355,7 @@ export default {
|
|||||||
<div id="newConfigurationOptionalAccordionCollapse"
|
<div id="newConfigurationOptionalAccordionCollapse"
|
||||||
class="accordion-collapse collapse" data-bs-parent="#newConfigurationOptionalAccordion">
|
class="accordion-collapse collapse" data-bs-parent="#newConfigurationOptionalAccordion">
|
||||||
<div class="accordion-body d-flex flex-column gap-3">
|
<div class="accordion-body d-flex flex-column gap-3">
|
||||||
<div class="card rounded-3" v-for="key in ['PreUp', 'PreDown', 'PostUp', 'PostDown']">
|
<div class="card rounded-3" v-for="key in ['Table', 'PreUp', 'PreDown', 'PostUp', 'PostDown']">
|
||||||
<div class="card-header">{{ key }}</div>
|
<div class="card-header">{{ key }}</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<input type="text"
|
<input type="text"
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"lang_id": "id",
|
||||||
|
"lang_name": "Bahasa Indonesia",
|
||||||
|
"lang_name_localized": "Bahasa Indonesia"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"lang_id": "zh-cn",
|
"lang_id": "zh-cn",
|
||||||
"lang_name": "Chinese (Simplified)",
|
"lang_name": "Chinese (Simplified)",
|
||||||
@ -9,6 +14,11 @@
|
|||||||
"lang_name": "Belarusian",
|
"lang_name": "Belarusian",
|
||||||
"lang_name_localized": "Беларуская"
|
"lang_name_localized": "Беларуская"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"lang_id": "ca",
|
||||||
|
"lang_name": "Catalan",
|
||||||
|
"lang_name_localized": "Català"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"lang_id": "zh-hk",
|
"lang_id": "zh-hk",
|
||||||
"lang_name": "Chinese (Traditional)",
|
"lang_name": "Chinese (Traditional)",
|
||||||
@ -44,11 +54,21 @@
|
|||||||
"lang_name": "French (Quebec)",
|
"lang_name": "French (Quebec)",
|
||||||
"lang_name_localized": "Français (Québec)"
|
"lang_name_localized": "Français (Québec)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"lang_id": "fr-fr",
|
||||||
|
"lang_name": "French (France)",
|
||||||
|
"lang_name_localized": "Français (France)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"lang_id": "de-de",
|
"lang_id": "de-de",
|
||||||
"lang_name": "German",
|
"lang_name": "German",
|
||||||
"lang_name_localized": "Deutsch"
|
"lang_name_localized": "Deutsch"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"lang_id": "hu-hu",
|
||||||
|
"lang_name": "Hungarian",
|
||||||
|
"lang_name_localized": "Magyar"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"lang_id": "it-it",
|
"lang_id": "it-it",
|
||||||
"lang_name": "Italian",
|
"lang_name": "Italian",
|
||||||
|
@ -278,7 +278,6 @@
|
|||||||
"Create Backup": "إنشاء نسخة احتياطية",
|
"Create Backup": "إنشاء نسخة احتياطية",
|
||||||
"No backup yet, click the button above to create backup\\.": "لا توجد نسخة احتياطية حتى الآن، انقر على الزر أعلاه لإنشاء نسخة احتياطية",
|
"No backup yet, click the button above to create backup\\.": "لا توجد نسخة احتياطية حتى الآن، انقر على الزر أعلاه لإنشاء نسخة احتياطية",
|
||||||
"Are you sure to delete this backup\\?": "هل أنت متأكد من حذف هذه النسخة الاحتياطية؟",
|
"Are you sure to delete this backup\\?": "هل أنت متأكد من حذف هذه النسخة الاحتياطية؟",
|
||||||
"Are you sure to restore this backup?\\": "هل أنت متأكد من استعادة هذه النسخة الاحتياطية؟",
|
|
||||||
"Backup Date": "تاريخ النسخة الاحتياطية",
|
"Backup Date": "تاريخ النسخة الاحتياطية",
|
||||||
"File": "الملف",
|
"File": "الملف",
|
||||||
"Are you sure to delete this configuration\\?": "هل أنت متأكد من حذف هذا الإعداد؟",
|
"Are you sure to delete this configuration\\?": "هل أنت متأكد من حذف هذا الإعداد؟",
|
||||||
@ -308,5 +307,63 @@
|
|||||||
"Deleted ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين)",
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين)",
|
||||||
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين) بنجاح. فشل في حذف $2 قرين(قرين)",
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين) بنجاح. فشل في حذف $2 قرين(قرين)",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين).",
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين).",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين) بنجاح. فشل في تقييد $2 قرين(قرين)."
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين) بنجاح. فشل في تقييد $2 قرين(قرين).",
|
||||||
|
"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\\?": ""
|
||||||
}
|
}
|
@ -278,7 +278,6 @@
|
|||||||
"Create Backup": "Стварыць рэзервовую копію",
|
"Create Backup": "Стварыць рэзервовую копію",
|
||||||
"No backup yet, click the button above to create backup\\.": "Рэзервовых копій яшчэ няма, націсніце кнопку вышэй, каб стварыць рэзервовую копію.",
|
"No backup yet, click the button above to create backup\\.": "Рэзервовых копій яшчэ няма, націсніце кнопку вышэй, каб стварыць рэзервовую копію.",
|
||||||
"Are you sure to delete this backup\\?": "Вы ўпэўнены, што хочаце выдаліць гэтую рэзервовую копію?",
|
"Are you sure to delete this backup\\?": "Вы ўпэўнены, што хочаце выдаліць гэтую рэзервовую копію?",
|
||||||
"Are you sure to restore this backup?\\": "Вы ўпэўнены, што хочаце аднавіць гэтую рэзервовую копію?",
|
|
||||||
"Backup Date": "Дата рэзервовай копіі",
|
"Backup Date": "Дата рэзервовай копіі",
|
||||||
"File": "Файл",
|
"File": "Файл",
|
||||||
"Are you sure to delete this configuration\\?": "Вы ўпэўнены, што хочаце выдаліць гэтую канфігурацыю?",
|
"Are you sure to delete this configuration\\?": "Вы ўпэўнены, што хочаце выдаліць гэтую канфігурацыю?",
|
||||||
@ -308,5 +307,63 @@
|
|||||||
"Deleted ([0-9]{1,}) peer\\(s\\)": "Выдалена $1 кліент(аў)",
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "Выдалена $1 кліент(аў)",
|
||||||
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Выдалена $1 кліент(аў) паспяхова. Не ўдалося выдаліць $2 кліент(аў)",
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Выдалена $1 кліент(аў) паспяхова. Не ўдалося выдаліць $2 кліент(аў)",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\)": "Абмежавана $1 кліент(аў)",
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "Абмежавана $1 кліент(аў)",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Абмежавана $1 кліент(аў) паспяхова. Не ўдалося абмежаваць $2 кліент(аў)"
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Абмежавана $1 кліент(аў) паспяхова. Не ўдалося абмежаваць $2 кліент(аў)",
|
||||||
|
"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\\?": ""
|
||||||
}
|
}
|
369
src/static/locale/ca.json
Normal file
369
src/static/locale/ca.json
Normal file
@ -0,0 +1,369 @@
|
|||||||
|
{
|
||||||
|
"Welcome to": "Benvingut",
|
||||||
|
"Username": "Usuari",
|
||||||
|
"Password": "Contrasenya",
|
||||||
|
"OTP from your authenticator": "OTP del seu autenticador",
|
||||||
|
"Sign In": "Iniciar sessió",
|
||||||
|
"Signing In\\.\\.\\.": "Iniciant sessió\\.\\.\\.",
|
||||||
|
"Access Remote Server": "Accedir al servidor remot",
|
||||||
|
"Server": "Servidor",
|
||||||
|
"Click": "Clic",
|
||||||
|
"Pinging...": "S'està fent ping...",
|
||||||
|
"to add your server": "per afegir el vostre servidor",
|
||||||
|
"Server List": "Llista de servidors:",
|
||||||
|
"Sorry, your username or password is incorrect.": "Ho sentim, el seu nom d'usuari o contrasenya són incorrectes",
|
||||||
|
"Home": "Inici",
|
||||||
|
"Settings": "Paràmetres",
|
||||||
|
"Tools": "Eines",
|
||||||
|
"Sign Out": "Tancar sessió",
|
||||||
|
"Checking for update...": "Comprovant actualitzacions...",
|
||||||
|
"You're on the latest version": "Està a l'última versió",
|
||||||
|
"WireGuard Configurations": "Configuració de 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.": "Encara no teniu cap configuració de WireGuard. Si us plau, comproveu la carpeta de configuració o canvieu-la a Configuració. Per defecte, la carpeta és /etc/wireguard.",
|
||||||
|
"Configuration": "Configuració",
|
||||||
|
"Configurations": "Configuracions",
|
||||||
|
"Peers Default Settings": "Paràmetres per defecte de Peers",
|
||||||
|
"Dashboard Theme": "Tema del tauler",
|
||||||
|
"Light": "Clar",
|
||||||
|
"Dark": "Fosc",
|
||||||
|
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Això es canviarà globalment i s'aplicarà a tots els codis QR i fitxers de configuració dels peer.",
|
||||||
|
"WireGuard Configurations Settings": "Paràmetres de Configuració del WireGuard",
|
||||||
|
"Configurations Directory": "Carpeta de configuracions",
|
||||||
|
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Recordi eliminar / al final de la vostra ruta. p. ex. /etc/wireguard",
|
||||||
|
"WGDashboard Account Settings": "Paràmetres el Compte WGDashboard",
|
||||||
|
"Current Password": "Contrasenya Actual",
|
||||||
|
"New Password": "Nova Contrasenya",
|
||||||
|
"Repeat New Password": "Repeteixi la Nova Contrasenya",
|
||||||
|
"Update Password": "Actualitzar Contrasenya",
|
||||||
|
"Multi-Factor Authentication \\(MFA\\)": "Autenticació Multifactor \\(MFA\\)",
|
||||||
|
"Reset": "Restablir",
|
||||||
|
"Setup": "Configuració",
|
||||||
|
"API Keys": "Claus API",
|
||||||
|
"API Key": "Clau API",
|
||||||
|
"Key": "Clau",
|
||||||
|
"Enabled": "Habilitat",
|
||||||
|
"Disabled": "Deshabilitat",
|
||||||
|
"No WGDashboard API Key": "No hi ha clau API de WGDashboard",
|
||||||
|
"Expire At": "Caduca al",
|
||||||
|
"Are you sure to delete this API key\\?": "Està segur que vol eliminar aquesta clau API\\?",
|
||||||
|
"Create API Key": "Crear clau d'API",
|
||||||
|
"When should this API Key expire\\?": "Quan hauria de caducar aquesta clau API\\?",
|
||||||
|
"Never Expire": "Mai Expira",
|
||||||
|
"Don't think that's a good idea": "No crec que sigui una bona idea",
|
||||||
|
"Creating\\.\\.\\.": "Creant\\.\\.\\.",
|
||||||
|
"Create": "Crear",
|
||||||
|
"Status": "Estatus",
|
||||||
|
"On": "Iniciar",
|
||||||
|
"Off": "Parar",
|
||||||
|
"Turning On\\.\\.\\.": "S'està encenent\\.\\.\\.",
|
||||||
|
"Turning Off\\.\\.\\.": "S'estat apagant\\.\\.\\.",
|
||||||
|
"Address": "Adreça",
|
||||||
|
"Listen Port": "Port d'escolta",
|
||||||
|
"Public Key": "Clau Pública",
|
||||||
|
"Connected Peers": "Peers Connectats",
|
||||||
|
"Total Usage": "Total usat",
|
||||||
|
"Total Received": "Total Rebut",
|
||||||
|
"Total Sent": "Total Enviat",
|
||||||
|
"Peers Data Usage": "Ús de dades dels Peers",
|
||||||
|
"Real Time Received Data Usage": "Ús de Dades Rebudes en Temps Real",
|
||||||
|
"Real Time Sent Data Usage": "Úsde Dades Eviades en Temps Real",
|
||||||
|
"Peer": "Peer",
|
||||||
|
"Peers": "Peers",
|
||||||
|
"Peer Settings": "Paràmetres del Peer",
|
||||||
|
"Download All": "Descarregar Tot",
|
||||||
|
"Search": "Cercar",
|
||||||
|
"Search Peers\\.\\.\\.": "Cercar Peers\\.\\.\\.",
|
||||||
|
"Display": "Mostrar",
|
||||||
|
"Sort By": "Ordenar Per",
|
||||||
|
"Refresh Interval": "Interval de Refresc",
|
||||||
|
"Name": "Nom",
|
||||||
|
"Allowed IPs": "IPs Permeses",
|
||||||
|
"Restricted": "Restringit",
|
||||||
|
"(.*) Seconds": "(.*) Segons",
|
||||||
|
"(.*) Minutes": "(.*) Minuts",
|
||||||
|
"Configuration Settings": "Paràmetres de Configuracio",
|
||||||
|
"Peer Jobs": "Feines Peer",
|
||||||
|
"Active Jobs": "Feines Actives",
|
||||||
|
"All Active Jobs": "Totes les Feines Actives",
|
||||||
|
"Logs": "Registres",
|
||||||
|
"Private Key": "Clau Privada",
|
||||||
|
"\\(Required for QR Code and Download\\)": "\\(Obligatori pel Codi QR i la Descàrrega\\)",
|
||||||
|
"\\(Required\\)": "\\(Obligatori\\)",
|
||||||
|
"Endpoint Allowed IPs": "IPs Permeses del Punt Final",
|
||||||
|
"DNS": "DNS",
|
||||||
|
"Optional Settings": "Paràmetres Opcionals",
|
||||||
|
"Pre-Shared Key": "Clau Precompartida",
|
||||||
|
"MTU": "MTU",
|
||||||
|
"Persistent Keepalive": "Keepalive Persistent",
|
||||||
|
"Reset Data Usage": "Restablir l'Ús de Dades",
|
||||||
|
"Total": "Total",
|
||||||
|
"Sent": "Enviat",
|
||||||
|
"Received": "Rebut",
|
||||||
|
"Revert": "Desfer",
|
||||||
|
"Save Peer": "Desar Peer",
|
||||||
|
"QR Code": "Codi QR",
|
||||||
|
"Schedule Jobs": "Feines Programades",
|
||||||
|
"Job": "Feina",
|
||||||
|
"Job ID": "Feina ID",
|
||||||
|
"Unsaved Job": "Feina no desada",
|
||||||
|
"This peer does not have any job yet\\.": "Aquest peer encara no te cap feina\\.",
|
||||||
|
"if": "si",
|
||||||
|
"is": "és",
|
||||||
|
"then": "aleshores",
|
||||||
|
"larger than": "més llarg que",
|
||||||
|
"Date": "Data",
|
||||||
|
"Restrict Peer": "Restringir Peer",
|
||||||
|
"Delete Peer": "Eliminar Peer",
|
||||||
|
"Edit": "Editar",
|
||||||
|
"Delete": "Eliminar",
|
||||||
|
"Deleting...": "Eliminant...",
|
||||||
|
"Cancel": "Cancel·lar",
|
||||||
|
"Save": "Desar",
|
||||||
|
"No active job at the moment\\.": "No hi ha cap feina activa ara mateix\\.",
|
||||||
|
"Jobs Logs": "Registres de Feines",
|
||||||
|
"Updated at": "Actualitzat a",
|
||||||
|
"Refresh": "Refrescar",
|
||||||
|
"Filter": "Filtrar",
|
||||||
|
"Success": "Èxit",
|
||||||
|
"Failed": "Fallat",
|
||||||
|
"Log ID": "ID Registre",
|
||||||
|
"Message": "Missatge",
|
||||||
|
"Share Peer": "Compartir Peer",
|
||||||
|
"Currently the peer is not sharing": "Actualment el peer no s'està compartint",
|
||||||
|
"Sharing\\.\\.\\.": "Compartint\\.\\.\\.",
|
||||||
|
"Start Sharing": "Començar a Compartir",
|
||||||
|
"Stop Sharing\\.\\.\\.": "Parar de Compartir\\.\\.\\.",
|
||||||
|
"Stop Sharing": "Para de Compartir",
|
||||||
|
"Access Restricted": "Accés Restringit",
|
||||||
|
"Restrict Access": "Àrea Restringida",
|
||||||
|
"Restricting\\.\\.\\.": "Restringint\\.\\.\\.",
|
||||||
|
"Allow Access": "Permetre Accés",
|
||||||
|
"Allowing Access\\.\\.\\.": "Permetent Accés\\.\\.\\.",
|
||||||
|
"Download \\& QR Code is not available due to no private key set for this peer": "La descàrrega del codi QR \\& no està disponible perquè no s'ha establert cap clau privada per a aquest peer",
|
||||||
|
"Add Peers": "Afegir Peers",
|
||||||
|
"Bulk Add": "Afegir en Massa",
|
||||||
|
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "En afegir peers en massa, el nom de cada peer es generarà automàticament i la IP permesa s'assignarà a la següent IP disponible\\.",
|
||||||
|
"How many peers you want to add\\?": "Quants peers voleu afegir\\?",
|
||||||
|
"You can add up to (.*) peers": "Pot afegir fins a (.*) peers",
|
||||||
|
"Use your own Private and Public Key": "Utilitzi la seva pròpia Clau Privada i Pública",
|
||||||
|
"Enter IP Address/CIDR": "Introdueixi l'adreça IP/CIDR",
|
||||||
|
"IP Address/CIDR": "Adreça IP/CDIR",
|
||||||
|
"or": "o",
|
||||||
|
"Pick Available IP": "Seleccioni una IP disponible",
|
||||||
|
"No available IP containing": "No conté cap IP disponible",
|
||||||
|
"Add": "Afegir",
|
||||||
|
"Adding\\.\\.\\.": "Afegint\\.\\.\\.",
|
||||||
|
"Failed to check available update": "No s'ha pogut comprovar l'actualització disponible",
|
||||||
|
"Nice to meet you!": "Encantat de conèixer-lo",
|
||||||
|
"Please fill in the following fields to finish setup": "Si us plau, ompli els següets camps per finalitzar la configuració",
|
||||||
|
"Create an account": "Crear un compte",
|
||||||
|
"Enter an username you like": "Introdueixi un nom d'usuari que li agradi",
|
||||||
|
"Enter a password": "Introduir una contrasenya",
|
||||||
|
"\\(At least 8 characters and make sure is strong enough!\\)": "\\(Com a mínim 8 caràcters i asseguri's que és suficietment forta!\\)",
|
||||||
|
"Confirm password": "Confirmar contrasenya",
|
||||||
|
"Next": "Seguent",
|
||||||
|
"Saving\\.\\.\\.": "Desant\\.\\.\\.",
|
||||||
|
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1\\. Si us plau, escanegi el següent codi QR per generar TOTP amb l'autenticador que triï",
|
||||||
|
"Or you can click the link below:": "O bé pot clicar l'enllaç següent:",
|
||||||
|
"2\\. Enter the TOTP generated by your authenticator to verify": "2\\. Introdueixi el TOTP generat pel seu autentitador per feriricar",
|
||||||
|
"TOTP verified!": "TOTP verificat!",
|
||||||
|
"I don't need MFA": "No necessito MFA",
|
||||||
|
"Complete": "Completat",
|
||||||
|
"(v[0-9.]{1,}) is now available for update!": "(v[0-9.]{1,}) ara està disponible per actualitzar!",
|
||||||
|
"Current Version:": "Versió Actual",
|
||||||
|
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh no\\.\\.\\. Aquest enllaç ha caducat o no és vàlid",
|
||||||
|
"Scan QR Code with the WireGuard App to add peer": "Escanegi el codi QR amb l'aplicació WireGuard per afegir el peer",
|
||||||
|
"or click the button below to download the ": "o faci clic al botó següent per descarrer el ",
|
||||||
|
" file": " fitxer",
|
||||||
|
"FROM ": "DE",
|
||||||
|
"(.*) is on": "(.*) està encès",
|
||||||
|
"(.*) is off": "(.*) està parat",
|
||||||
|
"Allowed IPs is invalid": "Les IPs Permeses no són vàlides",
|
||||||
|
"Peer created successfully": "Pere creat satisfactoriament",
|
||||||
|
"Please fill in all required box": "Si us plau, empleni tots els espais necessaris",
|
||||||
|
"Please specify amount of peers you want to add": "Si us plau, especifiqueu la quantitat de persones del mateix nivell que vol afegir",
|
||||||
|
"No more available IP can assign": "No hi ha cap més IP disponible per assignar",
|
||||||
|
"The maximum number of peers can add is (.*)": "El màxim nombre de peers que es poden afegir és (.*)",
|
||||||
|
"Generating key pairs by bulk failed": "No s'ha pogut generar parells de claus de manera massiva",
|
||||||
|
"Failed to add peers in bulk": "No s'ha pogut afegir peers de manera massiva",
|
||||||
|
"This peer already exist": "Aquest peer ja existeix",
|
||||||
|
"This IP is not available: (.*)": "Aquesta IP no està disponible: (.*)",
|
||||||
|
"Configuration does not exist": "La configuració no existeix",
|
||||||
|
"Peer does not exist": "El Pere no existeix",
|
||||||
|
"Please provide a valid configuration name": "Si us plau, proporcioneu un nom de configuració vàlid",
|
||||||
|
"Peer saved": "Peter desat",
|
||||||
|
"Allowed IPs already taken by another peer": "Les IPs permeses ja estan ocupades per un altre peer",
|
||||||
|
"Endpoint Allowed IPs format is incorrect": "El format de les IPs permeses del punt final és incorrecte",
|
||||||
|
"DNS format is incorrect": "El DNS és incorrecte",
|
||||||
|
"MTU format is not correct": "El format MTU no és correcte",
|
||||||
|
"Persistent Keepalive format is not correct": "El format de Keepalive persistent no és correcte",
|
||||||
|
"Private key does not match with the public key": "La clau privada no coincideix amb la clau pública",
|
||||||
|
"Update peer failed when updating Pre-Shared Key": "L'actualització del peer ha fallat en actualitzar la clau precompartida",
|
||||||
|
"Update peer failed when updating Allowed IPs": "L'actualització del peer ha fallat en actualitzar les IP permeses",
|
||||||
|
"Update peer failed when saving the configuration": "L'actualització del peer ha fallat en desar la configuració",
|
||||||
|
"Peer data usage reset successfully": "L'ús de dades del peer s'ha reiniciat correctament",
|
||||||
|
"Peer download started": "La descàrrega del peer s'ha iniciat",
|
||||||
|
"Please specify one or more peers": "Si us plau, especifiqueu un o més peers",
|
||||||
|
"Share link failed to create. Reason: (.*)": "No s'ha pogut crear l'enllaç de compartició. Motiu: (.*)",
|
||||||
|
"Link expire date updated": "La data de caducitat de l'enllaç s'ha actualitzat",
|
||||||
|
"Link expire date failed to update. Reason: (.*)": "No s'ha pogut actualitzar la data de caducitat de l'enllaç. Mtoiu: (.*)",
|
||||||
|
"Peer job saved": "Feina del peer desat",
|
||||||
|
"Please specify job": "Si us plau, especifiqui la tasca",
|
||||||
|
"Please specify peer and configuration": "Si us plau, esficiqui el peer i la configuració",
|
||||||
|
"Peer job deleted": "Feina del peer suprimida",
|
||||||
|
"API Keys function is successfully enabled": "La funció de claus API s'ha activat correctament",
|
||||||
|
"API Keys function is successfully disabled": "La funció de claus API s'ha descativat correctament",
|
||||||
|
"API Keys function is failed to enable": "No s'ha pogut habilitar la funció de claus API",
|
||||||
|
"API Keys function is failed to disable": "No s'ha pogut desactivar la funció de claus API",
|
||||||
|
"WGDashboard API Keys function is disabled": "La funció de claus API de WGDashboard està desactivada",
|
||||||
|
"WireGuard configuration path saved": "Ruta de configuracio del WireGuard desada",
|
||||||
|
"API Key deleted": "Clau API eliminada",
|
||||||
|
"API Key created": "Clau API creada",
|
||||||
|
"Sign in session ended, please sign in again": "La sessió d'inici ha finalitzat. Si us plau, torni a iniciar",
|
||||||
|
"Please specify an IP Address (v4/v6)": "Si us plau, espqcifiqui una adreça IP (v4/v6)",
|
||||||
|
"Please provide ipAddress and count": "Si us plau, proporcioni l'adreça IP i el recompte",
|
||||||
|
"Please provide ipAddress": "Si us plau, proporcioni l'adreça IP",
|
||||||
|
"Dashboard Language": "Idioma del tauler de control",
|
||||||
|
"Dashboard language update failed": "Error d'actualització de l'idioma del tauler de control",
|
||||||
|
"Peer Remote Endpoint": "Punt Final Remot del Peer",
|
||||||
|
"New Configuration": "Nova Configuració",
|
||||||
|
"Configuration Name": "Nom de Configuració",
|
||||||
|
"Configuration name is invalid. Possible reasons:": "Nom de configuració no vàlid. Possibles raons:",
|
||||||
|
"Configuration name already exist\\.": "El nom de configuració ja existeix\\.",
|
||||||
|
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "El nom de configuració només pot contenir 15 caràcters en majúsucules/minúscules, números, subratllat, signe igual, signe més, punt i guionet\\.",
|
||||||
|
"Invalid Port": "Port Invàlid",
|
||||||
|
"Save Configuration": "Desar Configuració",
|
||||||
|
"IP Address/CIDR is invalid": "L'adreça IP/CIDR no és vàlida",
|
||||||
|
"IP Address": "Adreça IP",
|
||||||
|
"Enter IP Address / Hostname": "Introdueixi l'adreça IP / nom de l'amfitrió",
|
||||||
|
"IP Address / Hostname": "Adreça IP / Hostname",
|
||||||
|
"Dashboard IP Address \\& Listen Port": "L'adreça IP del tauler de control\\& Port d'Escolta",
|
||||||
|
"Count": "Comptar",
|
||||||
|
"Geolocation": "Geolocalització",
|
||||||
|
"Is Alive": "Estpa Viu",
|
||||||
|
"Average / Min / Max Round Trip Time": "Temps mitjà / Min / Max d'anada i tornada",
|
||||||
|
"Sent / Received / Lost Package": "Enviat / Rebut / Paquets Perduts",
|
||||||
|
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Cal reiniciar manualment WGDashboard per aplicar els canvis a l'adreça IP i al Port d'Escolta",
|
||||||
|
"Restore Configuration": "Restaurar Configuració",
|
||||||
|
"Step (.*)": "Pas (.*)",
|
||||||
|
"Select a backup you want to restore": "Seleccioni una còpia de seguretat que vulgui restaurar",
|
||||||
|
"Click to change a backup": "Faci clic per canviar una còpia de seguretat",
|
||||||
|
"Selected Backup": "Còpia de seguretat seleccionada",
|
||||||
|
"You don't have any configuration to restore": "No té cap configuració per restaurar",
|
||||||
|
"Help": "Ajuda",
|
||||||
|
"Backup": "Còpia de Seguretat",
|
||||||
|
"([0-9].*) Backups?": "([0-9].*) Còpia de Seguretat?",
|
||||||
|
"Yes": "Sí",
|
||||||
|
"No": "No",
|
||||||
|
"Backup not selected": "Còpia de seguretat no seleccionada",
|
||||||
|
"Confirm \\& edit restore information": "Confirmar \\& editar restaurar informació?",
|
||||||
|
"(.*) Available IP Address": "(.*) Adreces IP Disponibles",
|
||||||
|
"Database File": "Fitxer de Base de Dades",
|
||||||
|
"Contain": "Conté",
|
||||||
|
"Restricted Peers?": "Peers restringuits?",
|
||||||
|
"Restore": "Restaurar",
|
||||||
|
"Restoring": "Restaurant",
|
||||||
|
"WGDashboard Settings": "Paràmetres del WGDashboard",
|
||||||
|
"Peers Settings": "Paràmetres de Peers",
|
||||||
|
"WireGuard Configuration Settings": "Paràmetres de Configuració de WireGuard",
|
||||||
|
"Appearance": "Aparença",
|
||||||
|
"Theme": "Tema",
|
||||||
|
"Language": "Idioma",
|
||||||
|
"Account Settings": "Paràmetres del Compte",
|
||||||
|
"Peer Default Settings": "Paràmetres per Defecte del Peer",
|
||||||
|
"Toggle When Start Up": "Canviar Quan s'Iniciï",
|
||||||
|
"Other Settings": "Altres Paràmetres",
|
||||||
|
"Select Peers": "Seleccioni Peers",
|
||||||
|
"Backup & Restore": "Còpia de seguretat & Restaurar",
|
||||||
|
"Delete Configuration": "Eliminar Configuració",
|
||||||
|
"Create Backup": "Crear Còpia de Seguretat",
|
||||||
|
"No backup yet, click the button above to create backup\\.": "Encara no hi ha cap còpia de seguretat, faci clic al botó de dalt per crear una còpia de seguretat\\.",
|
||||||
|
"Are you sure to delete this backup\\?": "Està segur que vol suprimir aquesta còpia de seguretat\\?",
|
||||||
|
"Backup Date": "Data de la Còpia de Seguretat",
|
||||||
|
"File": "Fitxer",
|
||||||
|
"Are you sure to delete this configuration\\?": "Segur que vol suprimir aquesta configuració?",
|
||||||
|
"Once you deleted this configuration\\:": "Un cop hagi suprimit aquesta configuració\\:",
|
||||||
|
"All connected peers will get disconnected": "Tots els Peers connectats es desconnectaran",
|
||||||
|
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Tant el fitxer de configuració \\(\\.conf\\) com la taula de la base de dades relacionada amb aquesta configuració s'eliminarà",
|
||||||
|
"Checking backups...": "Comprovant còpies de seguretat",
|
||||||
|
"This configuration have ([0-9].*) backups": "Aquesta configuració té ([0-9].*) còpies de seguretat",
|
||||||
|
"This configuration have no backup": "Aquesta configuració no té cap còpia de seguretat",
|
||||||
|
"If you're sure, please type in the configuration name below and click Delete": "Si està segur, escrigui el nom de la configuració qa continuació i faci clic a Eliminar",
|
||||||
|
"Select All": "Seleccionar Tot",
|
||||||
|
"Clear Selection": "Netejar Selecció",
|
||||||
|
"([0-9].*) Peers?": "([0-9].*) Peers?",
|
||||||
|
"Download": "Descarregar",
|
||||||
|
"Downloading": "Descarregant",
|
||||||
|
"Download Finished": "Descàrrega Finalitzada",
|
||||||
|
"Done": "Fet",
|
||||||
|
"Are you sure to delete": "Està segur que vol eliminar",
|
||||||
|
"Are you sure to delete this peer\\?": "Està segur que vol eliminar aquest peer\\?",
|
||||||
|
"Configuration deleted": "Configuració eliminada",
|
||||||
|
"Configuration saved": "Configuració desada",
|
||||||
|
"WGDashboard language update failed": "L'actualització de l'idioma de WGDashboard ha fallat",
|
||||||
|
"Configuration restored": "Configuració restaurada",
|
||||||
|
"Allowed IP already taken by another peer": "IP permesa ja ocupada per un altre peer",
|
||||||
|
"Failed to allow access of peer (.*)": "No s'ha pogut permetre l'accés al peer (.*)",
|
||||||
|
"Failed to save configuration through WireGuard": "No s'ha pogut desar la configuració mitjançant WireGuard",
|
||||||
|
"Allow access successfully": "Accés permès correctament",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "Els ([0-9]{1,}) peer\\(s\\) s'han suprimit",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Els ([0-9]{1,}) peer\\(s\\) s'han suprimit correctament. No s'ha pgout suprimir els ([0-9]{1,}) peer\\(s\\)",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "Els ([0-9]{1,}) peer\\(s\\) s'han restringit",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Els ([0-9]{1,}) peer\\(s\\) s'han restringit correctament. No s'ha pogut restringuir els ([0-9]{1,}) peer\\(s\\)",
|
||||||
|
"Display As": "Mostrar com a",
|
||||||
|
"List": "Llista",
|
||||||
|
"Grid": "Graella",
|
||||||
|
"Protocol": "Protocol",
|
||||||
|
"Open File": "Obrir Fitxer",
|
||||||
|
"Advanced Options": "Opcions Avançades",
|
||||||
|
"Allowed IPs Validation": "Validació d'IPs permeses",
|
||||||
|
"Update Name": "Actualitzar Nom",
|
||||||
|
"To update this configuration's name, WGDashboard will execute the following operations:": "Per actualitzar el nom d'aquesta configuració, WGDashboard executarà les operacions següents:",
|
||||||
|
"Duplicate current configuration's database table and \\.conf file with the new name": "Duplicar la taula de base de dades i el fitxer \\.conf amb el nou nom",
|
||||||
|
"Delete current configuration's database table and \\.conf file": "Eliminarla taula de base de dades i el fitxer \\.conf de la configuració actual",
|
||||||
|
"Danger Zone": "Zona de Perill",
|
||||||
|
"Configuration File": "Fitxer de Configuració",
|
||||||
|
"Edit Raw Configuration File": "Editar el fitxer de configuració en brut",
|
||||||
|
"Peer Configuration File": "Fitxer de Configuració del Peer",
|
||||||
|
"Share with Email": "Compartir per correu electrònic",
|
||||||
|
"Email Account": "Compte de correu electrònic",
|
||||||
|
"Ready": "Preparat",
|
||||||
|
"Port": "Port",
|
||||||
|
"Encryption": "Encriptació",
|
||||||
|
"No Encryption": "No encriptació",
|
||||||
|
"Send From": "Enviar des de",
|
||||||
|
"Send Test Email": "Enviar correu electrònic de prova",
|
||||||
|
"Email Body Template": "Plantilla del cos del correu electrònic",
|
||||||
|
"Live Preview": "Vista prèvia en directe",
|
||||||
|
"Include configuration file as an attachment": "Inclogui el fitxer de configuració com a fitxer adjunt",
|
||||||
|
"Send": "Enviar",
|
||||||
|
"Sending\\.\\.\\.": "Enviant\\.\\.\\.",
|
||||||
|
"Email sent successfully!": "Correu elctrònic enviat correctament!",
|
||||||
|
"AmneziaWG Peer Setting": "Paràmetre del Peer d'AmneziaQG",
|
||||||
|
"System Status": "Estat del sistema",
|
||||||
|
"CPU": "CPU",
|
||||||
|
"Memory": "Memòria",
|
||||||
|
"Swap Memory": "Memòria Swap",
|
||||||
|
"Processes": "Processos",
|
||||||
|
"CPU Usage": "Ús de CPU",
|
||||||
|
"Memory Usage": "Memòria Utilitzada",
|
||||||
|
"Swap Memory Usage": "Ús de Memoria Swap",
|
||||||
|
"Network": "Xarxa",
|
||||||
|
"([0-9]{1,}) Interfaces": "([0-9]{1,}) Interfícies",
|
||||||
|
"Storage": "Emmagatzematge",
|
||||||
|
"([0-9]{1,}) Partitions": "([0-9]{1,}) Particions",
|
||||||
|
"(.*) Used": "(.*) Utilitzat",
|
||||||
|
"Untitled Peer": "Peer sense títol",
|
||||||
|
"Table": "",
|
||||||
|
"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\\?": "",
|
||||||
|
"Who are you sending to\\?": "",
|
||||||
|
"What\\'s the subject\\?": "",
|
||||||
|
"What\\'s the body\\?": ""
|
||||||
|
}
|
@ -257,7 +257,6 @@
|
|||||||
"Create Backup": "Vytvořit zálohu",
|
"Create Backup": "Vytvořit zálohu",
|
||||||
"No backup yet, click the button above to create backup\\.": "Žádná dostupná záloha, klikněte na tlačítko výše pro vytvoření",
|
"No backup yet, click the button above to create backup\\.": "Žádná dostupná záloha, klikněte na tlačítko výše pro vytvoření",
|
||||||
"Are you sure to delete this backup\\?": "Určitě chcete smazat tuto zálohu?",
|
"Are you sure to delete this backup\\?": "Určitě chcete smazat tuto zálohu?",
|
||||||
"Are you sure to restore this backup?\\": "Určitě chcete obnovit tuto zálohu?",
|
|
||||||
"Backup Date": "Datum zálohy",
|
"Backup Date": "Datum zálohy",
|
||||||
"File": "Soubor",
|
"File": "Soubor",
|
||||||
"Are you sure to delete this configuration\\?": "Určitě chcete smazat tuto konfiguraci?",
|
"Are you sure to delete this configuration\\?": "Určitě chcete smazat tuto konfiguraci?",
|
||||||
@ -308,5 +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\\.": "Při hromadném importu bude jméno každého peera vygenerované automaticky, a povolená IP adresa bude nastavena na další v pořadí",
|
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Při hromadném importu bude jméno každého peera vygenerované automaticky, a povolená IP adresa bude nastavena na další v pořadí",
|
||||||
"How many peers you want to add\\?": "Kolik peerů chcete přidat?",
|
"How many peers you want to add\\?": "Kolik peerů chcete přidat?",
|
||||||
"Adding\\.\\.\\.": "Přidávám...",
|
"Adding\\.\\.\\.": "Přidávám...",
|
||||||
"Dashboard IP Address \\& Listen Port": "Dashboard IP adresa a otevřený port"
|
"Dashboard IP Address \\& Listen Port": "Dashboard IP adresa a otevřený 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": "",
|
||||||
|
"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\\?": ""
|
||||||
}
|
}
|
@ -308,5 +308,62 @@
|
|||||||
"How many peers you want to add\\?": "Wie viele Peers möchtest du hinzufügen?",
|
"How many peers you want to add\\?": "Wie viele Peers möchtest du hinzufügen?",
|
||||||
"Adding\\.\\.\\.": "Füge hinzu...",
|
"Adding\\.\\.\\.": "Füge hinzu...",
|
||||||
"Dashboard IP Address \\& Listen Port": "",
|
"Dashboard IP Address \\& Listen Port": "",
|
||||||
"Are you sure to restore this backup?\\": "Sind Sie sicher, dass Sie dieses Backup wiederherstellen möchten?"
|
"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\\?": ""
|
||||||
}
|
}
|
@ -31,10 +31,6 @@
|
|||||||
"Configurations Directory": "پوشه پیکربندیها",
|
"Configurations Directory": "پوشه پیکربندیها",
|
||||||
"Remember to remove / at the end of your path. e.g /etc/wireguard": "به یاد داشته باشید که / را در انتهای مسیر خود حذف کنید. به عنوان مثال: /etc/wireguard",
|
"Remember to remove / at the end of your path. e.g /etc/wireguard": "به یاد داشته باشید که / را در انتهای مسیر خود حذف کنید. به عنوان مثال: /etc/wireguard",
|
||||||
"WGDashboard Account Settings": "تنظیمات حساب WGDashboard",
|
"WGDashboard Account Settings": "تنظیمات حساب WGDashboard",
|
||||||
"رمز عبور فعلی": "",
|
|
||||||
"رمز عبور جدید": "",
|
|
||||||
"تکرار رمز عبور جدید": "",
|
|
||||||
"بروزرسانی رمز عبور": "",
|
|
||||||
"Multi-Factor Authentication \\(MFA\\)": "احراز هویت چند عاملی (MFA)",
|
"Multi-Factor Authentication \\(MFA\\)": "احراز هویت چند عاملی (MFA)",
|
||||||
"Reset": "بازنشانی",
|
"Reset": "بازنشانی",
|
||||||
"Setup": "نصب",
|
"Setup": "نصب",
|
||||||
@ -228,15 +224,12 @@
|
|||||||
"New Configuration": "پیکربندی جدید",
|
"New Configuration": "پیکربندی جدید",
|
||||||
"Configuration Name": "نام پیکربندی",
|
"Configuration Name": "نام پیکربندی",
|
||||||
"Configuration name is invalid. Possible reasons:": "نام پیکربندی نامعتبر است. دلایل احتمالی:",
|
"Configuration name is invalid. Possible reasons:": "نام پیکربندی نامعتبر است. دلایل احتمالی:",
|
||||||
"Configuration name already exist.": "این نام پیکربندی از قبل وجود دارد.",
|
|
||||||
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen.": "نام پیکربندی فقط میتواند حداکثر شامل ۱۵ حرف کوچک/بزرگ، عدد، زیرخط، مساوی، علامت مثبت، نقطه و خط تیره باشد.",
|
|
||||||
"Invalid Port": "پورت نامعتبر است.",
|
"Invalid Port": "پورت نامعتبر است.",
|
||||||
"Save Configuration": "ذخیره پیکربندی",
|
"Save Configuration": "ذخیره پیکربندی",
|
||||||
"IP Address/CIDR is invalid": "آدرس IP یا CIDR نامعتبر است.",
|
"IP Address/CIDR is invalid": "آدرس IP یا CIDR نامعتبر است.",
|
||||||
"IP Address": "آدرس IP",
|
"IP Address": "آدرس IP",
|
||||||
"Enter IP Address / Hostname": "آدرس IP یا نام میزبان را وارد کنید",
|
"Enter IP Address / Hostname": "آدرس IP یا نام میزبان را وارد کنید",
|
||||||
"IP Address / Hostname": "آدرس IP / نام میزبان",
|
"IP Address / Hostname": "آدرس IP / نام میزبان",
|
||||||
"Dashboard IP Address & Listen Port": "آدرس IP و پورت شنود داشبورد",
|
|
||||||
"Count": "تعداد",
|
"Count": "تعداد",
|
||||||
"Geolocation": "موقعیت جغرافیایی",
|
"Geolocation": "موقعیت جغرافیایی",
|
||||||
"Is Alive": "در دسترس است",
|
"Is Alive": "در دسترس است",
|
||||||
@ -255,7 +248,6 @@
|
|||||||
"Yes": "بله",
|
"Yes": "بله",
|
||||||
"No": "خیر",
|
"No": "خیر",
|
||||||
"Backup not selected": "نسخه پشتیبان انتخاب نشده است.",
|
"Backup not selected": "نسخه پشتیبان انتخاب نشده است.",
|
||||||
"Confirm & edit restore information": "تأیید و ویرایش اطلاعات بازیابی",
|
|
||||||
"(.*) Available IP Address": "$1 آدرس IP در دسترس",
|
"(.*) Available IP Address": "$1 آدرس IP در دسترس",
|
||||||
"Database File": "فایل پایگاه داده",
|
"Database File": "فایل پایگاه داده",
|
||||||
"Contain": "شامل",
|
"Contain": "شامل",
|
||||||
@ -276,15 +268,9 @@
|
|||||||
"Backup & Restore": "پشتیبانگیری و بازیابی",
|
"Backup & Restore": "پشتیبانگیری و بازیابی",
|
||||||
"Delete Configuration": "حذف پیکربندی",
|
"Delete Configuration": "حذف پیکربندی",
|
||||||
"Create Backup": "ایجاد نسخه پشتیبان",
|
"Create Backup": "ایجاد نسخه پشتیبان",
|
||||||
"No backup yet, click the button above to create backup.": "هنوز نسخه پشتیبانی وجود ندارد، برای ایجاد نسخه پشتیبان روی دکمه بالا کلیک کنید.",
|
|
||||||
"Are you sure to delete this backup?": "آیا از حذف این نسخه پشتیبان مطمئن هستید؟",
|
|
||||||
"Are you sure to restore this backup?": "آیا از بازیابی این نسخه پشتیبان مطمئن هستید؟",
|
|
||||||
"Backup Date": "تاریخ پشتیبانگیری",
|
"Backup Date": "تاریخ پشتیبانگیری",
|
||||||
"File": "فایل",
|
"File": "فایل",
|
||||||
"Are you sure to delete this configuration?": "آیا از حذف این پیکربندی مطمئن هستید؟",
|
|
||||||
"Once you deleted this configuration:": "پس از حذف این پیکربندی:",
|
|
||||||
"All connected peers will get disconnected": "تمام peerهای متصل قطع خواهند شد.",
|
"All connected peers will get disconnected": "تمام peerهای متصل قطع خواهند شد.",
|
||||||
"Both configuration file (.conf) and database table related to this configuration will get deleted": "هم فایل پیکربندی (.conf) و هم جدول پایگاه داده مرتبط با این پیکربندی حذف خواهند شد.",
|
|
||||||
"Checking backups...": "در حال بررسی نسخههای پشتیبان...",
|
"Checking backups...": "در حال بررسی نسخههای پشتیبان...",
|
||||||
"This configuration have ([0-9].*) backups": "این پیکربندی $1 نسخه پشتیبان دارد.",
|
"This configuration have ([0-9].*) backups": "این پیکربندی $1 نسخه پشتیبان دارد.",
|
||||||
"This configuration have no backup": "این پیکربندی هیچ نسخه پشتیبانی ندارد.",
|
"This configuration have no backup": "این پیکربندی هیچ نسخه پشتیبانی ندارد.",
|
||||||
@ -296,7 +282,6 @@
|
|||||||
"Download Finished": "دانلود به پایان رسید",
|
"Download Finished": "دانلود به پایان رسید",
|
||||||
"Done": "انجام شد",
|
"Done": "انجام شد",
|
||||||
"Are you sure to delete": "آیا از حذف مطمئن هستید؟",
|
"Are you sure to delete": "آیا از حذف مطمئن هستید؟",
|
||||||
"Are you sure to delete this peer?": "آیا از حذف این peer مطمئن هستید؟",
|
|
||||||
"Configuration deleted": "پیکربندی حذف شد.",
|
"Configuration deleted": "پیکربندی حذف شد.",
|
||||||
"Configuration saved": "پیکربندی ذخیره شد.",
|
"Configuration saved": "پیکربندی ذخیره شد.",
|
||||||
"WGDashboard language update failed": "بهروزرسانی زبان WGDashboard با شکست مواجه شد.",
|
"WGDashboard language update failed": "بهروزرسانی زبان WGDashboard با شکست مواجه شد.",
|
||||||
@ -305,8 +290,80 @@
|
|||||||
"Failed to allow access of peer (.*)": "اجازه دسترسی به peer ($1) با شکست مواجه شد.",
|
"Failed to allow access of peer (.*)": "اجازه دسترسی به peer ($1) با شکست مواجه شد.",
|
||||||
"Failed to save configuration through WireGuard": "ذخیره پیکربندی از طریق WireGuard با شکست مواجه شد.",
|
"Failed to save configuration through WireGuard": "ذخیره پیکربندی از طریق WireGuard با شکست مواجه شد.",
|
||||||
"Allow access successfully": "دسترسی با موفقیت فعال شد.",
|
"Allow access successfully": "دسترسی با موفقیت فعال شد.",
|
||||||
"Deleted ([0-9]{1,}) peer(s)": "$1 peer حذف شد.",
|
"Current Password": "",
|
||||||
"Deleted ([0-9]{1,}) peer(s) successfully. Failed to delete ([0-9]{1,}) peer(s)": "$1 peer با موفقیت حذف شد. حذف $2 peer با شکست مواجه شد.",
|
"New Password": "",
|
||||||
"Restricted ([0-9]{1,}) peer(s)": "$1 peer محدود شد.",
|
"Repeat New Password": "",
|
||||||
"Restricted ([0-9]{1,}) peer(s) successfully. Failed to restrict ([0-9]{1,}) peer(s)": "$1 peer با موفقیت محدود شد. محدودسازی $2 peer با شکست مواجه شد."
|
"Update Password": "",
|
||||||
|
"Table": "",
|
||||||
|
"Search": "",
|
||||||
|
"Configuration name already exist\\.": "",
|
||||||
|
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "",
|
||||||
|
"Dashboard IP Address \\& Listen Port": "",
|
||||||
|
"Hop": "",
|
||||||
|
"Average RTT \\(ms\\)": "",
|
||||||
|
"Min RTT \\(ms\\)": "",
|
||||||
|
"Max RTT \\(ms\\)": "",
|
||||||
|
"You can visit our: ": "",
|
||||||
|
"Official Documentation": "",
|
||||||
|
"Discord Server": "",
|
||||||
|
"Confirm \\& edit restore information": "",
|
||||||
|
"No backup yet, click the button above to create backup\\.": "",
|
||||||
|
"Are you sure to delete this backup\\?": "",
|
||||||
|
"Are you sure to restore this backup\\?": "",
|
||||||
|
"Are you sure to delete this configuration\\?": "",
|
||||||
|
"Once you deleted this configuration\\:": "",
|
||||||
|
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "",
|
||||||
|
"Download": "",
|
||||||
|
"Are you sure to delete this peer\\?": "",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
|
"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\\?": ""
|
||||||
}
|
}
|
@ -278,7 +278,6 @@
|
|||||||
"Create Backup": "Créer une sauvegarde",
|
"Create Backup": "Créer une sauvegarde",
|
||||||
"No backup yet, click the button above to create backup\\.": "Aucune sauvegarde, appuyez sur le bouton ci-dessus pour en créer une.",
|
"No backup yet, click the button above to create backup\\.": "Aucune sauvegarde, appuyez sur le bouton ci-dessus pour en créer une.",
|
||||||
"Are you sure to delete this backup\\?": "Êtes-vous certains de supprimer cette sauvegarde?",
|
"Are you sure to delete this backup\\?": "Êtes-vous certains de supprimer cette sauvegarde?",
|
||||||
"Are you sure to restore this backup?\\": "Êtes-vous certains de rétablir cette sauvegarde?",
|
|
||||||
"Backup Date": "Date de la sauvegarde",
|
"Backup Date": "Date de la sauvegarde",
|
||||||
"File": "Fichier",
|
"File": "Fichier",
|
||||||
"Are you sure to delete this configuration\\?": "Êtes-vous certains de supprimer cette configuration",
|
"Are you sure to delete this configuration\\?": "Êtes-vous certains de supprimer cette configuration",
|
||||||
@ -308,5 +307,63 @@
|
|||||||
"Deleted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s)",
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s)",
|
||||||
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s). Échec de la suppression du(des) pair(s) $2",
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s). Échec de la suppression du(des) pair(s) $2",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limités",
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limités",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limité(s). Échec de la limitation du(des) pair(s) $2"
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limité(s). Échec de la limitation du(des) pair(s) $2",
|
||||||
|
"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\\?": ""
|
||||||
}
|
}
|
369
src/static/locale/fr-fr.json
Normal file
369
src/static/locale/fr-fr.json
Normal file
@ -0,0 +1,369 @@
|
|||||||
|
{
|
||||||
|
"Welcome to": "Bienvenue à",
|
||||||
|
"Username": "Nom d'Utilisateur",
|
||||||
|
"Password": "Mot de passe",
|
||||||
|
"OTP from your authenticator": "Code à usage unique de votre application d'authentification",
|
||||||
|
"Sign In": "Se connecter",
|
||||||
|
"Signing In\\.\\.\\.": "Connexion en cours...",
|
||||||
|
"Access Remote Server": "Accéder à distance au serveur",
|
||||||
|
"Server": "Serveur",
|
||||||
|
"Click": "Clique",
|
||||||
|
"Pinging...": "Pinging...",
|
||||||
|
"to add your server": "pour ajouter votre serveur",
|
||||||
|
"Server List": "Liste des serveurs",
|
||||||
|
"Sorry, your username or password is incorrect.": "Désolé, le nom d'utilisateur ou le mot de passe est incorrect.",
|
||||||
|
"Home": "Accueil",
|
||||||
|
"Settings": "Paramètres",
|
||||||
|
"Tools": "Outils",
|
||||||
|
"Sign Out": "Se déconnecter",
|
||||||
|
"Checking for update...": "Recherche des mises à jour",
|
||||||
|
"You're on the latest version": "Vous êtes à jour",
|
||||||
|
"WireGuard Configurations": "Configurations de 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.": "Vous n'avez pas encore de configurations de WireGuard. Veuillez vérifier le dossier de configuration ou les « Paramètres ». Par défaut, le dossier est /etc/wireguard.",
|
||||||
|
"Configuration": "Configuration",
|
||||||
|
"Configurations": "Configurations",
|
||||||
|
"Peers Default Settings": "Paramètres par défaut des pairs",
|
||||||
|
"Dashboard Theme": "Thème du tableau de bord",
|
||||||
|
"Light": "Clair",
|
||||||
|
"Dark": "Sombre",
|
||||||
|
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "C'est un changement global, qui s'appliquera sur tout les codes QR des pairs ainsi que leur fichier de configuration",
|
||||||
|
"WireGuard Configurations Settings": "Paramètre des configurations de WireGuard",
|
||||||
|
"Configurations Directory": "Dossier des configurations",
|
||||||
|
"Remember to remove / at the end of your path. e.g /etc/wireguard": "N'oubliez pas de retirer le dernier / à la fin du chemin vers le dossier. ex: /etc/wireguard",
|
||||||
|
"WGDashboard Account Settings": "Paramètres du compte WGDashboard",
|
||||||
|
"Current Password": "Mot de passe actuel",
|
||||||
|
"New Password": "Nouveau mot de passe",
|
||||||
|
"Repeat New Password": "Répétez le nouveau mot de passe",
|
||||||
|
"Update Password": "Mettre à jour le mot de passe",
|
||||||
|
"Multi-Factor Authentication \\(MFA\\)": "Authentification à plusieurs facteurs",
|
||||||
|
"Reset": "Réinitialiser",
|
||||||
|
"Setup": "Installer",
|
||||||
|
"API Keys": "Clés d'API",
|
||||||
|
"API Key": "Clé d'API",
|
||||||
|
"Key": "Clé",
|
||||||
|
"Enabled": "Activé",
|
||||||
|
"Disabled": "Désactivé",
|
||||||
|
"No WGDashboard API Key": "Aucune Clé d'API pour WGDashboard",
|
||||||
|
"Expire At": "Expire le",
|
||||||
|
"Are you sure to delete this API key\\?": "Êtes-vous sur de supprimer cette clé d'API",
|
||||||
|
"Create API Key": "Créer une clé d'API",
|
||||||
|
"When should this API Key expire\\?": "Quand est-ce que cette clé devrait expirer ?",
|
||||||
|
"Never Expire": "N'expire jamais",
|
||||||
|
"Don't think that's a good idea": "Ceci n'est probablement pas une bonne idée",
|
||||||
|
"Creating\\.\\.\\.": "En cours de création...",
|
||||||
|
"Create": "Créer",
|
||||||
|
"Status": "Statut",
|
||||||
|
"On": "Marche",
|
||||||
|
"Off": "Arrêt",
|
||||||
|
"Turning On\\.\\.\\.": "Mise en Marche..",
|
||||||
|
"Turning Off\\.\\.\\.": "Mise à l'Arrêt...",
|
||||||
|
"Address": "Adresse",
|
||||||
|
"Listen Port": "Port d'écoute",
|
||||||
|
"Public Key": "Clé publique",
|
||||||
|
"Connected Peers": "Pairs connectés",
|
||||||
|
"Total Usage": "Utilisation totale",
|
||||||
|
"Total Received": "Total reçu",
|
||||||
|
"Total Sent": "Total envoyé",
|
||||||
|
"Peers Data Usage": "Utilisation de données des pairs",
|
||||||
|
"Real Time Received Data Usage": "Réception de données en temps réel",
|
||||||
|
"Real Time Sent Data Usage": "Envoie de données en temps réel",
|
||||||
|
"Peer": "Pair",
|
||||||
|
"Peers": "Pairs",
|
||||||
|
"Peer Settings": "Paramètres des pairs",
|
||||||
|
"Download All": "Télécharger tout",
|
||||||
|
"Search Peers\\.\\.\\.": "Rechercher les pairs...",
|
||||||
|
"Display": "Affichage",
|
||||||
|
"Sort By": "Trier par",
|
||||||
|
"Refresh Interval": "Intervalle d'actualisation",
|
||||||
|
"Name": "Nom",
|
||||||
|
"Allowed IPs": "IPs autorisées",
|
||||||
|
"Restricted": "Limité",
|
||||||
|
"(.*) Seconds": "$1s",
|
||||||
|
"(.*) Minutes": "$1min",
|
||||||
|
"Configuration Settings": "Paramètres des configurations",
|
||||||
|
"Peer Jobs": "Tâches des pairs",
|
||||||
|
"Active Jobs": "Tâches actives",
|
||||||
|
"All Active Jobs": "Toutes les tâches actives",
|
||||||
|
"Logs": "Journaux",
|
||||||
|
"Private Key": "Clé privée",
|
||||||
|
"\\(Required for QR Code and Download\\)": "(Nécessaire pour code QR et téléchargement",
|
||||||
|
"\\(Required\\)": "(Nécessaire)",
|
||||||
|
"Endpoint Allowed IPs": "adresses autorisées au Endpoint",
|
||||||
|
"DNS": "DNS",
|
||||||
|
"Optional Settings": "Paramètres optionnels",
|
||||||
|
"Pre-Shared Key": "Clé prépartagée",
|
||||||
|
"MTU": "MTU",
|
||||||
|
"Persistent Keepalive": "Keepalive permanent",
|
||||||
|
"Reset Data Usage": "Réinitialiser l'utilisation des données",
|
||||||
|
"Total": "Total",
|
||||||
|
"Sent": "Envoyé",
|
||||||
|
"Received": "Reçu",
|
||||||
|
"Revert": "Revenir",
|
||||||
|
"Save Peer": "Enregistrer le pair",
|
||||||
|
"QR Code": "Code QR",
|
||||||
|
"Schedule Jobs": "Panifier les tâches",
|
||||||
|
"Job": "Tâche",
|
||||||
|
"Job ID": "ID de la tâche",
|
||||||
|
"Unsaved Job": "Tâche non-enregistrée",
|
||||||
|
"This peer does not have any job yet\\.": "Ce pair n'a pas encore de tâche",
|
||||||
|
"if": "si",
|
||||||
|
"is": "est",
|
||||||
|
"then": "alors",
|
||||||
|
"larger than": "plus grand que",
|
||||||
|
"Date": "Date",
|
||||||
|
"Restrict Peer": "Limiter le pair",
|
||||||
|
"Delete Peer": "Supprimer le pair",
|
||||||
|
"Edit": "Modifier",
|
||||||
|
"Delete": "Supprimer",
|
||||||
|
"Deleting...": "Suppression...",
|
||||||
|
"Cancel": "Annuler",
|
||||||
|
"Save": "Enregistrer",
|
||||||
|
"No active job at the moment\\.": "Pas de tâche active",
|
||||||
|
"Jobs Logs": "Journaux des tâches",
|
||||||
|
"Updated at": "Mis à jour le",
|
||||||
|
"Refresh": "Rafraîchir",
|
||||||
|
"Filter": "Filtrer",
|
||||||
|
"Success": "Succès",
|
||||||
|
"Failed": "Échec",
|
||||||
|
"Log ID": "ID du journal",
|
||||||
|
"Message": "Message",
|
||||||
|
"Share Peer": "Partager le pair",
|
||||||
|
"Currently the peer is not sharing": "Le pair ne partage pas présentement",
|
||||||
|
"Sharing\\.\\.\\.": "Partage en cours...",
|
||||||
|
"Start Sharing": "Commencer le partage",
|
||||||
|
"Stop Sharing\\.\\.\\.": "Arrêt du partage...",
|
||||||
|
"Stop Sharing": "Le partage est arrêté",
|
||||||
|
"Access Restricted": "Accès limité",
|
||||||
|
"Restrict Access": "Limiter l'accès",
|
||||||
|
"Restricting\\.\\.\\.": "Restriction en cours...",
|
||||||
|
"Allow Access": "Autoriser l'accès",
|
||||||
|
"Allowing Access\\.\\.\\.": "Autorisation de l'accès",
|
||||||
|
"Download \\& QR Code is not available due to no private key set for this peer": "Le téléchargement et le code QR ne sont pas disponible car il n'y a pas de clé privée associée à ce pair",
|
||||||
|
"Add Peers": "Ajouter des pairs",
|
||||||
|
"Bulk Add": "Ajout groupé",
|
||||||
|
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "En ajoutant des pairs de manière groupé, le nom de chaque pair sera généré automatiquement, et l'adresse autorisée sera attribuée selon la prochaine adresse disponible.",
|
||||||
|
"How many peers you want to add\\?": "Combien de pairs voulez-vous ajouter ?",
|
||||||
|
"You can add up to (.*) peers": "Vous pouvez ajouter jusqu'à $1 pairs",
|
||||||
|
"Use your own Private and Public Key": "Utiliser vos proprés clés privée & publique",
|
||||||
|
"Enter IP Address/CIDR": "Entrer l'adresse avec le format IP/CIDR",
|
||||||
|
"IP Address/CIDR": "adresse IP/CIDR",
|
||||||
|
"or": "ou",
|
||||||
|
"Pick Available IP": "Choisir une IP disponible",
|
||||||
|
"No available IP containing": "Aucune IP disponible contenant",
|
||||||
|
"Add": "Ajouter",
|
||||||
|
"Adding\\.\\.\\.": "Ajout...",
|
||||||
|
"Failed to check available update": "Échec de la vérification des mises à jour",
|
||||||
|
"Nice to meet you!": "Content de faire votre connaissance !",
|
||||||
|
"Please fill in the following fields to finish setup": "Veuillez remplir les champs suivants pour terminer la configuration",
|
||||||
|
"Create an account": "Créer un compte",
|
||||||
|
"Enter an username you like": "Entrez le nom d'utilisateur souhaité",
|
||||||
|
"Enter a password": "Entrez un mot de passe",
|
||||||
|
"\\(At least 8 characters and make sure is strong enough!\\)": "(Assurez vous d'avoir un mot de passe fort, d'au moins 8 charactères !)",
|
||||||
|
"Confirm password": "Confirmer le mot de passe",
|
||||||
|
"Next": "Suivant",
|
||||||
|
"Saving\\.\\.\\.": "Enregistrement...",
|
||||||
|
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Veuillez scanner le code QR pour générer un code à usage unique chronométré avec l'application d'authentification de votre choix",
|
||||||
|
"Or you can click the link below:": "Ou vous pouvez cliquer sur le lien ci-dessous",
|
||||||
|
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Entrez le code code à usage unique chronométré généré par votre l'application d'authentification",
|
||||||
|
"TOTP verified!": "Code à usage unique chronométré vérifié !",
|
||||||
|
"I don't need MFA": "Je n'ai pas besoin de l'authentification à plusieurs facteurs",
|
||||||
|
"Complete": "Complet",
|
||||||
|
"(v[0-9.]{1,}) is now available for update!": "Mise à jour $1 disponible !",
|
||||||
|
"Current Version:": "Version actuelle",
|
||||||
|
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh non, il semble que ce lien est expiré ou invalide.",
|
||||||
|
"Scan QR Code with the WireGuard App to add peer": "Balayez le code QR avec l'application WireGuard pour ajouter le pair",
|
||||||
|
"or click the button below to download the ": "ou cliquez sur le boutton ci-dessous pour télécharger le ",
|
||||||
|
" file": " fichier",
|
||||||
|
"FROM ": "DE",
|
||||||
|
"(.*) is on": "$1 est en marche",
|
||||||
|
"(.*) is off": "$1 est à l'arrêt",
|
||||||
|
"Allowed IPs is invalid": "Les adresses autorisées sont invalides",
|
||||||
|
"Peer created successfully": "Pair créé avec succès",
|
||||||
|
"Please fill in all required box": "Veuillez remplir toutes les cases",
|
||||||
|
"Please specify amount of peers you want to add": "Veuillez préciser le nombre de pair à ajouter",
|
||||||
|
"No more available IP can assign": "Il n'y a plus d'adresses disponible",
|
||||||
|
"The maximum number of peers can add is (.*)": "On peut ajouter au maximum $1 pairs",
|
||||||
|
"Generating key pairs by bulk failed": "La génération des clés groupé a échouée",
|
||||||
|
"Failed to add peers in bulk": "L'ajout de pairs groupé a échoué",
|
||||||
|
"This peer already exist": "Ce pair existe déja",
|
||||||
|
"This IP is not available: (.*)": "Cette adresse n'est pas disponible: $1",
|
||||||
|
"Configuration does not exist": "La configuration n'existe pas",
|
||||||
|
"Peer does not exist": "Le pair n'existe pas",
|
||||||
|
"Please provide a valid configuration name": "Veuillez entrer un nom de configuration valide",
|
||||||
|
"Peer saved": "Pair enregistré",
|
||||||
|
"Allowed IPs already taken by another peer": "Les adresse autorisées sont déja prises par un autre pair",
|
||||||
|
"Endpoint Allowed IPs format is incorrect": "Le format des IPs autorisées est incorrect",
|
||||||
|
"DNS format is incorrect": "Le format du DNS est incorrect",
|
||||||
|
"MTU format is not correct": "Le format du MTU est incorrect",
|
||||||
|
"Persistent Keepalive format is not correct": "Le format du Keepalive permanent est incorrect",
|
||||||
|
"Private key does not match with the public key": "La clé privée ne correspond pas à la clé publique",
|
||||||
|
"Update peer failed when updating Pre-Shared Key": "La modification du pair a échouée en changeant la clé prépartagée",
|
||||||
|
"Update peer failed when updating Allowed IPs": "La modification du pair a échouée en changeant les adresses autorisées",
|
||||||
|
"Update peer failed when saving the configuration": "La modification du pair a échouée en enregistrant la configuration",
|
||||||
|
"Peer data usage reset successfully": "L'utilisation des données du pairs a été réinitialisée",
|
||||||
|
"Peer download started": "Téléchargement du pair en cours",
|
||||||
|
"Please specify one or more peers": "Veuillez spécifier un ou plusieurs pairs",
|
||||||
|
"Share link failed to create. Reason: (.*)": "Échec de la création du lien: $1",
|
||||||
|
"Link expire date updated": "Date d'expiration du lien changée",
|
||||||
|
"Link expire date failed to update. Reason: (.*)": "Échec de la modification de la date d'expiration: $1",
|
||||||
|
"Peer job saved": "Tâche du pair enregistré",
|
||||||
|
"Please specify job": "Veuillez spécifier une tâche",
|
||||||
|
"Please specify peer and configuration": "Veuillez spécifier un pair et une configuration",
|
||||||
|
"Peer job deleted": "Tâche du pair supprimée",
|
||||||
|
"API Keys function is successfully enabled": "La clé d'API est activée",
|
||||||
|
"API Keys function is successfully disabled": "La clé d'API est désactivé",
|
||||||
|
"API Keys function is failed to enable": "Échec de l'activation de la clé",
|
||||||
|
"API Keys function is failed to disable": "Échec de la désactivation de la clé",
|
||||||
|
"WGDashboard API Keys function is disabled": "Les clés d'API WGDashboard sont désactivées",
|
||||||
|
"WireGuard configuration path saved": "Chemin de la configuration WireGuard enregistré",
|
||||||
|
"API Key deleted": "Clé d'API supprimée",
|
||||||
|
"API Key created": "Clé d'API créée",
|
||||||
|
"Sign in session ended, please sign in again": "La session est terminée, veuillez vous reconnecter",
|
||||||
|
"Please specify an IP Address (v4/v6)": "Veuillez préciser une adresse (IPv4/IPv6)",
|
||||||
|
"Please provide ipAddress and count": "Veuillez fournir l'adresse IP et le compte",
|
||||||
|
"Please provide ipAddress": "Veuillez fournir l'adresse IP",
|
||||||
|
"Dashboard Language": "Langage du tableau de bord",
|
||||||
|
"Dashboard language update failed": "Échec du changement de langage",
|
||||||
|
"Peer Remote Endpoint": "Endpoint externe du pair",
|
||||||
|
"New Configuration": "Nouvelle configuration",
|
||||||
|
"Configuration Name": "Nom de la configuration",
|
||||||
|
"Configuration name is invalid. Possible reasons:": "Le nom est invalide, raisons possuibles:",
|
||||||
|
"Configuration name already exist\\.": "Le nom est déja utilisé",
|
||||||
|
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Le nom ne peut contenir que 15 charactère. Lettres minuscules/majuscules, nombres,tirer, tiret bas, égal, plus et point",
|
||||||
|
"Invalid Port": "Port invalide",
|
||||||
|
"Save Configuration": "Enregistrer la configuration",
|
||||||
|
"IP Address/CIDR is invalid": "L'adresse IP/CIDR est invalide",
|
||||||
|
"IP Address": "adresse IP",
|
||||||
|
"Enter IP Address / Hostname": "Entrez l'adresse",
|
||||||
|
"IP Address / Hostname": "Adresse IP / Nom d'hôte",
|
||||||
|
"Dashboard IP Address \\& Listen Port": "IP et port du tableau de bord",
|
||||||
|
"Count": "Compte:",
|
||||||
|
"Geolocation": "Géolocalisation",
|
||||||
|
"Is Alive": "est actif",
|
||||||
|
"Average / Min / Max Round Trip Time": "Moyenne / Min / Max latence allez-retour",
|
||||||
|
"Sent / Received / Lost Package": "Paquets Envoyés / Reçus / Perdus",
|
||||||
|
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Un redémarrage de WGDashboard est nécessaire pour appliquer le changement d'IP/port",
|
||||||
|
"Restore Configuration": "Rétablir la configuration",
|
||||||
|
"Step (.*)": "Étape N°$1",
|
||||||
|
"Select a backup you want to restore": "Sélectionnez la sauvegarde à Rétablir",
|
||||||
|
"Click to change a backup": "Cliquez pour changer la sauvegarde",
|
||||||
|
"Selected Backup": "Sauvegarde sélectionnée",
|
||||||
|
"You don't have any configuration to restore": "Vous n'avez pas de configruations à Rétablir",
|
||||||
|
"Help": "Assistance",
|
||||||
|
"Backup": "Sauvegarde",
|
||||||
|
"([0-9].*) Backups?": "$1 sauvegardes ?",
|
||||||
|
"Yes": "Oui",
|
||||||
|
"No": "Non",
|
||||||
|
"Backup not selected": "Aucune sauvegarde sélectionnée",
|
||||||
|
"Confirm \\& edit restore information": "Valider et modifier les information à Rétablir",
|
||||||
|
"(.*) Available IP Address": "$1 adresses IP disponible",
|
||||||
|
"Database File": "Fichier de base de donnée",
|
||||||
|
"Contain": "Contiens",
|
||||||
|
"Restricted Peers?": "Pairs limités ?",
|
||||||
|
"Restore": "Rétablir",
|
||||||
|
"Restoring": "Rétablissement",
|
||||||
|
"WGDashboard Settings": "Paramètres de WGDashboard",
|
||||||
|
"Peers Settings": "Paramètres des pairs",
|
||||||
|
"WireGuard Configuration Settings": "Paramètre des configurations WireGuard",
|
||||||
|
"Appearance": "Apparence",
|
||||||
|
"Theme": "Thème",
|
||||||
|
"Language": "Langue",
|
||||||
|
"Account Settings": "Paramètres du compte",
|
||||||
|
"Peer Default Settings": "Paramètres par défaut des pairs",
|
||||||
|
"Toggle When Start Up": "Activer au démarrage",
|
||||||
|
"Other Settings": "Autre paramètres",
|
||||||
|
"Select Peers": "Sélectionnez les pairs",
|
||||||
|
"Backup & Restore": "Sauvegarde & Rétablissement",
|
||||||
|
"Delete Configuration": "Supprimer la configuration",
|
||||||
|
"Create Backup": "Créer une sauvegarde",
|
||||||
|
"No backup yet, click the button above to create backup\\.": "Aucune sauvegarde, appuyez sur le bouton ci-dessus pour en créer une.",
|
||||||
|
"Are you sure to delete this backup\\?": "Êtes-vous certains de supprimer cette sauvegarde ?",
|
||||||
|
"Backup Date": "Date de la sauvegarde",
|
||||||
|
"File": "Fichier",
|
||||||
|
"Are you sure to delete this configuration\\?": "Êtes-vous certains de supprimer cette configuration ?",
|
||||||
|
"Once you deleted this configuration\\:": "Quand vous aurez supprimer cette configuration:",
|
||||||
|
"All connected peers will get disconnected": "Tout les pairs seront déconnectés",
|
||||||
|
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Tous les fichiers de configurations ainsi que le tableau de la base de donnée relié à cette configuration seront supprimés",
|
||||||
|
"Checking backups...": "Vérification des sauvegardes...",
|
||||||
|
"This configuration have ([0-9].*) backups": "Cette configuration a $1 sauvegardes",
|
||||||
|
"This configuration have no backup": "Cette configuration n'a pas de sauvegarde",
|
||||||
|
"If you're sure, please type in the configuration name below and click Delete": "Si vous êtez certains, veuillez entrer le nom de la configuration, puis appuyez sur Supprimer",
|
||||||
|
"Select All": "Tout sélectionner",
|
||||||
|
"Clear Selection": "Vider la sélection",
|
||||||
|
"([0-9].*) Peers?": "$1 pairs ?",
|
||||||
|
"Downloading": "Téléchargement",
|
||||||
|
"Download Finished": "Téléchargement complété",
|
||||||
|
"Done": "Terminé",
|
||||||
|
"Are you sure to delete": "Êtes-vous certains de supprimer",
|
||||||
|
"Are you sure to delete this peer\\?": "Êtes-vous certains de supprimer ce pair ?",
|
||||||
|
"Configuration deleted": "Configuration supprimée",
|
||||||
|
"Configuration saved": "Configuration enregistrée",
|
||||||
|
"WGDashboard language update failed": "Échec de la modification de la langue de WGDashboard",
|
||||||
|
"Configuration restored": "Configuration rétablie",
|
||||||
|
"Allowed IP already taken by another peer": "L'IP autorisée est déja prise par un autre pair",
|
||||||
|
"Failed to allow access of peer (.*)": "Échec de l'autorisation d'accès au pair",
|
||||||
|
"Failed to save configuration through WireGuard": "Échec de l'enregistrement de la configuration sur WireGuard",
|
||||||
|
"Allow access successfully": "Accès autorisé avec succès",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s)",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s). Échec de la suppression du(des) pair(s) $2",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limités",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limité(s). Échec de la limitation du(des) pair(s) $2",
|
||||||
|
"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\\?": ""
|
||||||
|
}
|
369
src/static/locale/hu-hu.json
Normal file
369
src/static/locale/hu-hu.json
Normal 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?"
|
||||||
|
}
|
361
src/static/locale/id.json
Normal file
361
src/static/locale/id.json
Normal file
@ -0,0 +1,361 @@
|
|||||||
|
{
|
||||||
|
"Welcome to": "Selamat Datang di",
|
||||||
|
"Username": "Nama Pengguna",
|
||||||
|
"Password": "Kata Sandi",
|
||||||
|
"OTP from your authenticator": "OTP dari autentikator Anda",
|
||||||
|
"Sign In": "Masuk",
|
||||||
|
"Signing In\\.\\.\\.": "Masuk...",
|
||||||
|
"Access Remote Server": "Akses Server Remot",
|
||||||
|
"Server": "server",
|
||||||
|
"Click": "Klik",
|
||||||
|
"Pinging...": "Pinging...",
|
||||||
|
"to add your server": "untuk menambahkan server Anda",
|
||||||
|
"Server List": "Daftar Server",
|
||||||
|
"Sorry, your username or password is incorrect.": "Maaf, nama pengguna atau kata sandi Anda salah",
|
||||||
|
"Home": "Beranda",
|
||||||
|
"Settings": "Pengaturan",
|
||||||
|
"Tools": "Peralatan",
|
||||||
|
"Sign Out": "Keluar",
|
||||||
|
"Checking for update...": "Memeriksa Pembaruan...",
|
||||||
|
"You're on the latest version": "Anda berada pada versi paling baru",
|
||||||
|
"WireGuard Configurations": "Konfigurasi 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.": "Anda belum memiliki konfigurasi WireGuard. Mohon periksa folder konfigurasi atau ubah di Pengaturan. Secara bawaan folder nya adalah /etc/wireguard.",
|
||||||
|
"Configuration": "Konfigurasi",
|
||||||
|
"Configurations": "Konfigurasi",
|
||||||
|
"Peers Default Settings": "Pengaturan Bawaan Peers",
|
||||||
|
"Dashboard Theme": "Tema Dasbor",
|
||||||
|
"Light": "Terang",
|
||||||
|
"Dark": "Gelap",
|
||||||
|
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Perubahan ini akan di ubah secara global, dan akan berlaku ke semua kode QR peer dan file konfigurasi.",
|
||||||
|
"WireGuard Configurations Settings": "Pengaturan Konfigurasi WireGuard",
|
||||||
|
"Configurations Directory": "Direktori Konfigurasi",
|
||||||
|
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Jangan lupa untuk menghapus / di akhir path Anda. Contoh /etc/wireguard",
|
||||||
|
"WGDashboard Account Settings": "Pengaturan Akun WGDashboard",
|
||||||
|
"Current Password": "Kata Sandi Saat Ini",
|
||||||
|
"New Password": "Kata Sandi Baru",
|
||||||
|
"Repeat New Password": "Ulangi Kata Sandi Baru",
|
||||||
|
"Update Password": "Perbarui Kata Sandi",
|
||||||
|
"Multi-Factor Authentication \\(MFA\\)": "Autentikasi Multi-Faktor (MFA)",
|
||||||
|
"Reset": "Atur Ulang",
|
||||||
|
"Setup": "Pengaturan",
|
||||||
|
"API Keys": "Kunci API",
|
||||||
|
"API Key": "Kunci API",
|
||||||
|
"Key": "Kunci",
|
||||||
|
"Enabled": "Diaktifkan",
|
||||||
|
"Disabled": "Dimatikan",
|
||||||
|
"No WGDashboard API Key": "Tidak Ada Kunci API WGDashboard",
|
||||||
|
"Expire At": "Kedaluwarsa pada",
|
||||||
|
"Are you sure to delete this API key\\?": "Apa Anda yakin ingin menghapus kunci API berikut?",
|
||||||
|
"Create API Key": "Buat Kunci API",
|
||||||
|
"When should this API Key expire\\?": "Kapan kunci API berikut kedaluwarsa?",
|
||||||
|
"Never Expire": "Tidak Pernah Kedaluwarsa",
|
||||||
|
"Don't think that's a good idea": "Sepertinya itu bukan ide yang bagus",
|
||||||
|
"Creating\\.\\.\\.": "Membuat...",
|
||||||
|
"Create": "Buat",
|
||||||
|
"Status": "Keadaan",
|
||||||
|
"On": "Aktif",
|
||||||
|
"Off": "Mati",
|
||||||
|
"Turning On\\.\\.\\.": "Mengaktifkan...",
|
||||||
|
"Turning Off\\.\\.\\.": "Mematikan...",
|
||||||
|
"Address": "Alamat",
|
||||||
|
"Listen Port": "Mendengarkan Port",
|
||||||
|
"Public Key": "Kunci Publik",
|
||||||
|
"Connected Peers": "Peers Terhubung",
|
||||||
|
"Total Usage": "Penggunaan Total",
|
||||||
|
"Total Received": "Total Diterima",
|
||||||
|
"Total Sent": "Total Dikirim",
|
||||||
|
"Peers Data Usage": "Penggunaan Data Peers",
|
||||||
|
"Real Time Received Data Usage": "Waktu Nyata Menerima Penggunaan Data",
|
||||||
|
"Real Time Sent Data Usage": "Waktu Nyata Mengirim Penggunaan Data",
|
||||||
|
"Peer": "Peer",
|
||||||
|
"Peers": "Peers",
|
||||||
|
"Peer Settings": "Pengaturan Peer",
|
||||||
|
"Download All": "Unduh Semua",
|
||||||
|
"Search": "Cari",
|
||||||
|
"Search Peers\\.\\.\\.": "Cari Peer...",
|
||||||
|
"Display": "Tampilan",
|
||||||
|
"Sort By": "Urutkan",
|
||||||
|
"Refresh Interval": "Memperbarui Interval",
|
||||||
|
"Name": "Nama",
|
||||||
|
"Allowed IPs": "Allowed IPs",
|
||||||
|
"Restricted": "Terbatas",
|
||||||
|
"(.*) Seconds": "$1 Detik",
|
||||||
|
"(.*) Minutes": "$1 Menit",
|
||||||
|
"Configuration Settings": "Pengaturan Konfigurasi",
|
||||||
|
"Peer Jobs": "Pekerjaan Peer",
|
||||||
|
"Active Jobs": "Pekerjaan Aktif",
|
||||||
|
"All Active Jobs": "Semua Pekerjaan Aktif",
|
||||||
|
"Logs": "Log",
|
||||||
|
"Private Key": "Kunci Pribadi",
|
||||||
|
"\\(Required for QR Code and Download\\)": "(Diperlukan untuk Kode QR dan Unduh)",
|
||||||
|
"\\(Required\\)": "Diperlukan",
|
||||||
|
"Endpoint Allowed IPs": "Endpoint IP Allowed IPs",
|
||||||
|
"DNS": "DNS",
|
||||||
|
"Optional Settings": "Pengaturan Opsional",
|
||||||
|
"Pre-Shared Key": "Kunci Pra-Berbagi",
|
||||||
|
"MTU": "MTU",
|
||||||
|
"Persistent Keepalive": "Persistent Keepalive",
|
||||||
|
"Reset Data Usage": "Atur Ulang Penggunaan Data",
|
||||||
|
"Total": "Total",
|
||||||
|
"Sent": "Dikirim",
|
||||||
|
"Received": "Diterima",
|
||||||
|
"Revert": "Kembalikan",
|
||||||
|
"Save Peer": "Simpan Peer",
|
||||||
|
"QR Code": "Kode QR",
|
||||||
|
"Schedule Jobs": "Jadwalkan Pekerjaan",
|
||||||
|
"Job": "Pekerjaan",
|
||||||
|
"Job ID": "ID Pekerjaan",
|
||||||
|
"Unsaved Job": "Pekerjaan yang belum Tersimpan",
|
||||||
|
"This peer does not have any job yet\\.": "Peer ini belum memiliki pekerjaan",
|
||||||
|
"if": "jika",
|
||||||
|
"is": "adalah",
|
||||||
|
"then": "maka",
|
||||||
|
"larger than": "lebih besar dari",
|
||||||
|
"Date": "Tanggal",
|
||||||
|
"Restrict Peer": "Batasi Peer",
|
||||||
|
"Delete Peer": "Hapus Peer",
|
||||||
|
"Edit": "Ubah",
|
||||||
|
"Delete": "Hapus",
|
||||||
|
"Deleting...": "Menghapus...",
|
||||||
|
"Cancel": "Batal",
|
||||||
|
"Save": "Simpan",
|
||||||
|
"No active job at the moment\\.": "Tidak ada pekerjaan aktif untuk saat ini.",
|
||||||
|
"Jobs Logs": "Log Pekerjaan",
|
||||||
|
"Updated at": "Diperbarui pada",
|
||||||
|
"Refresh": "Perbarui",
|
||||||
|
"Filter": "Penyaring",
|
||||||
|
"Success": "Sukses",
|
||||||
|
"Failed": "Gagal",
|
||||||
|
"Log ID": "ID Log",
|
||||||
|
"Message": "Pesan",
|
||||||
|
"Share Peer": "Membagikan Peer",
|
||||||
|
"Currently the peer is not sharing": "Saat ini peer tidak berbagi",
|
||||||
|
"Sharing\\.\\.\\.": "Membagikan...",
|
||||||
|
"Start Sharing": "Mulai Membagikan",
|
||||||
|
"Stop Sharing\\.\\.\\.": "Berhenti Membagikan...",
|
||||||
|
"Stop Sharing": "Berhenti Membagikan",
|
||||||
|
"Access Restricted": "Akses Terbatas",
|
||||||
|
"Restrict Access": "Batasi Akses",
|
||||||
|
"Restricting\\.\\.\\.": "Membatasi...",
|
||||||
|
"Allow Access": "Izinkan Akses",
|
||||||
|
"Allowing Access\\.\\.\\.": "Mengizinkan Akses...",
|
||||||
|
"Download \\& QR Code is not available due to no private key set for this peer": "Unduh & Kode QR tidak tersedia karena kunci pribadi tidak di atur untuk peer ini",
|
||||||
|
"Add Peers": "Tambah Peers",
|
||||||
|
"Bulk Add": "Tambah Massal",
|
||||||
|
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Dengan menambahkan peers secara massal, setiap nama peer akan dibuat secara otomatis, dan Allowed IP akan ditetapkan ke IP berikutnya yang tersedia.",
|
||||||
|
"How many peers you want to add\\?": "Berapa banyak peers yang ingin Anda tambah?",
|
||||||
|
"You can add up to (.*) peers": "Anda dapat menambahkan sebanyak $1 peers",
|
||||||
|
"Use your own Private and Public Key": "Gunakan kunci pribadi dan kunci publik milik Anda",
|
||||||
|
"Enter IP Address/CIDR": "Masukkan Alamat IP/CIDR",
|
||||||
|
"IP Address/CIDR": "Alamat IP/CIDR",
|
||||||
|
"or": "atau",
|
||||||
|
"Pick Available IP": "Pilih IP yang Tersedia",
|
||||||
|
"No available IP containing": "Tidak ada IP yang Tersedia yang memiliki",
|
||||||
|
"Add": "Tambah",
|
||||||
|
"Adding\\.\\.\\.": "Menambahkan...",
|
||||||
|
"Failed to check available update": "Gagal untuk memeriksa pembaruan yang tersedia",
|
||||||
|
"Nice to meet you!": "Senang bertemu dengan Anda!",
|
||||||
|
"Please fill in the following fields to finish setup": "Silakan isi kolom berikut untuk menyelesaikan pengaturan",
|
||||||
|
"Create an account": "Buat akun baru",
|
||||||
|
"Enter an username you like": "Masukkan nama pengguna yang Anda sukai",
|
||||||
|
"Enter a password": "Masukkan kata sandi",
|
||||||
|
"\\(At least 8 characters and make sure is strong enough!\\)": "(Setidaknya 8 karakter dan pastikan cukup kuat!)",
|
||||||
|
"Confirm password": "Konfirmasi kata sandi",
|
||||||
|
"Next": "Lanjut",
|
||||||
|
"Saving\\.\\.\\.": "Menyimpan...",
|
||||||
|
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Silakan pindai Kode QR berikut untuk menghasilkan TOTP dengan pilihan autentikator Anda",
|
||||||
|
"Or you can click the link below:": "Atau Anda bisa klik tautan di bawah",
|
||||||
|
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Masukkan TOTP yang dihasilkan oleh autentikator anda untuk verifikasi",
|
||||||
|
"TOTP verified!": "TOTP terverifikasi!",
|
||||||
|
"I don't need MFA": "Saya tidak membutuhkan MFA",
|
||||||
|
"Complete": "Selesai",
|
||||||
|
"(v[0-9.]{1,}) is now available for update!": "v$1 telah tersedia untuk pembaruan!",
|
||||||
|
"Current Version:": "Versi Saat Ini:",
|
||||||
|
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh tidak... Tautan ini sudah kedaluwarsa atau salah.",
|
||||||
|
"Scan QR Code with the WireGuard App to add peer": "Pindai Kode QR menggunakan Aplikasi WireGuard untuk menambahkan peer",
|
||||||
|
"or click the button below to download the ": "atau klik tomboh di bawah untuk mengunduh",
|
||||||
|
" file": " file",
|
||||||
|
"FROM ": "DARI",
|
||||||
|
"(.*) is on": "$1 aktif",
|
||||||
|
"(.*) is off": "$1 mati",
|
||||||
|
"Allowed IPs is invalid": "Allowed IPs salah",
|
||||||
|
"Peer created successfully": "Peer berhasil terbuat",
|
||||||
|
"Please fill in all required box": "Silakan isi semua kolom diperlukan",
|
||||||
|
"Please specify amount of peers you want to add": "Silakan tentukan jumlah peers yang ingin Anda tambahkan",
|
||||||
|
"No more available IP can assign": "Tidak ada lagi IP yang tersedia yang dapat ditetapkan",
|
||||||
|
"The maximum number of peers can add is (.*)": "Jumlah maksimal peers yang dapat ditambahkan adalah $1",
|
||||||
|
"Generating key pairs by bulk failed": "Gagal menghasilkan pasangan kunci secara massal",
|
||||||
|
"Failed to add peers in bulk": "Gagal untuk menambahkan peers secara massal",
|
||||||
|
"This peer already exist": "Peer ini sudah ada",
|
||||||
|
"This IP is not available: (.*)": "IP ini sudah tidak tersedia: $1",
|
||||||
|
"Configuration does not exist": "Konfigurasi tidak ada",
|
||||||
|
"Peer does not exist": "Peer tidak ada",
|
||||||
|
"Please provide a valid configuration name": "Harap berikan nama konfigurasi yang benar",
|
||||||
|
"Peer saved": "Peer tersimpan",
|
||||||
|
"Allowed IPs already taken by another peer": "Allowed IPs sudah diambil oleh peer lain",
|
||||||
|
"Endpoint Allowed IPs format is incorrect": "Bentuk Endpoint Allowed IPs tidak tepat",
|
||||||
|
"DNS format is incorrect": "Bentuk DNS tidak tepat",
|
||||||
|
"MTU format is not correct": "Bentuk MTU tidak tepat",
|
||||||
|
"Persistent Keepalive format is not correct": "Bentuk Persistent Keepalive tidak tepat",
|
||||||
|
"Private key does not match with the public key": "Kunci pribadi tidak cocok dengan kunci publik",
|
||||||
|
"Update peer failed when updating Pre-Shared Key": "Pembaruan peer gagal saat memperbarui Kunci Pra-Berbagi",
|
||||||
|
"Update peer failed when updating Allowed IPs": "Pembaruan peer gagal saat memperbarui Allowed IPs",
|
||||||
|
"Update peer failed when saving the configuration": "Pembaruan peer gagal saat menyimpan konfigurasi",
|
||||||
|
"Peer data usage reset successfully": "Penggunaan data peer berhasi di atur ulang",
|
||||||
|
"Peer download started": "Unduh peer dimulai",
|
||||||
|
"Please specify one or more peers": "Silakan tentukan satu atau lebih peer",
|
||||||
|
"Share link failed to create. Reason: (.*)": "Tautan berbagi gagal dibuat. Alasan: $1",
|
||||||
|
"Link expire date updated": "Tanggal kedaluwarsa tautan diperbarui",
|
||||||
|
"Link expire date failed to update. Reason: (.*)": "Tanggal kedaluwarsa tautan gagal diperbarui. Alasan: $1",
|
||||||
|
"Peer job saved": "Pekerjaan peer tersimpan",
|
||||||
|
"Please specify job": "Silakan tentukan pekerjaan",
|
||||||
|
"Please specify peer and configuration": "Silakan tentukan peer dan konfigurasi",
|
||||||
|
"Peer job deleted": "Pekerjaan peer terhapus",
|
||||||
|
"API Keys function is successfully enabled": "Fungsi Kunci API berhasil diaktifkan",
|
||||||
|
"API Keys function is successfully disabled": "Fungsi Kunci API berhasil dimatikan",
|
||||||
|
"API Keys function is failed to enable": "Fungsi Kunci API gagal diaktifkan",
|
||||||
|
"API Keys function is failed to disable": "Fungsi Kunci API gagal dimatikan",
|
||||||
|
"WGDashboard API Keys function is disabled": "Fungsi Kunci API WGDashboard dimatikan",
|
||||||
|
"WireGuard configuration path saved": "path konfigurasi WireGuard tersimpan",
|
||||||
|
"API Key deleted": "Kunci API terhapus",
|
||||||
|
"API Key created": "Kunci API terbuat",
|
||||||
|
"Sign in session ended, please sign in again": "Sesi masuk berakhir, silakan masuk kembali",
|
||||||
|
"Please specify an IP Address (v4/v6)": "Silakan tentukan alamat IP (v4/v6)",
|
||||||
|
"Please provide ipAddress and count": "Harap berikan Alamat IP dan count",
|
||||||
|
"Please provide ipAddress": "Harap berikan Alamat IP",
|
||||||
|
"Dashboard Language": "Bahasa Dasbor",
|
||||||
|
"Dashboard language update failed": "Pembaruan bahasa dasbor gagal",
|
||||||
|
"Peer Remote Endpoint": "Endpoint Remot Peer",
|
||||||
|
"New Configuration": "Konfigurasi Baru",
|
||||||
|
"Configuration Name": "Nama Konfigurasi",
|
||||||
|
"Configuration name is invalid. Possible reasons:": "Nama konfigurasi salah. Kemungkinan alasan:",
|
||||||
|
"Configuration name already exist\\.": "Nama konfigurasi sudah ada.",
|
||||||
|
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Nama konfigurasi hanya bisa memiliki 15 huruf kecil/ huruf besar alfabet, angka, underscore, simbol sama dengan, simbol tambah, titik dan tanda penghubung.",
|
||||||
|
"Invalid Port": "Port Salah",
|
||||||
|
"Save Configuration": "Simpan Konfigurasi",
|
||||||
|
"IP Address/CIDR is invalid": "Alamat IP/CIDR salah",
|
||||||
|
"IP Address": "Alamat IP",
|
||||||
|
"Enter IP Address / Hostname": "Masukkan Alamat IP / Nama Host",
|
||||||
|
"IP Address / Hostname": "Alamat IP / Nama Host",
|
||||||
|
"Dashboard IP Address \\& Listen Port": "Alamat IP & Mendengarkan Port Dasbor",
|
||||||
|
"Count": "Count",
|
||||||
|
"Geolocation": "Lokasi Geografis",
|
||||||
|
"Is Alive": "Masih Hidup",
|
||||||
|
"Average / Min / Max Round Trip Time": "Rata - rata / Min / Maks Round Trip Time",
|
||||||
|
"Sent / Received / Lost Package": "Terkirim / Diterima / Paket Hilang",
|
||||||
|
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Memulai ulang WGDashboard dibutuhkan untuk menerapkan perubahan pada Alamat IP dan Mendengarkan Port",
|
||||||
|
"Restore Configuration": "Pulihkan Konfigurasi",
|
||||||
|
"Step (.*)": "Step $1",
|
||||||
|
"Select a backup you want to restore": "Pilih cadangan yang ingin dipulihkan",
|
||||||
|
"Click to change a backup": "Klik untuk mengganti cadangan",
|
||||||
|
"Selected Backup": "Cadangan yang dipilih",
|
||||||
|
"You don't have any configuration to restore": "Anda tidak memiliki konfigurasi untuk dipulihkan",
|
||||||
|
"Help": "Tolong",
|
||||||
|
"Backup": "Cadangan",
|
||||||
|
"([0-9].*) Backups?": "$1 Cadangan?",
|
||||||
|
"Yes": "Ya",
|
||||||
|
"No": "Tidak",
|
||||||
|
"Backup not selected": "Cadangan belum dipilih",
|
||||||
|
"Confirm \\& edit restore information": "Konfirmasi & ubah informasi pemulihan",
|
||||||
|
"(.*) Available IP Address": "$1 Alamat IP Tersedia",
|
||||||
|
"Database File": "File Basis Data",
|
||||||
|
"Contain": "Memiliki",
|
||||||
|
"Restricted Peers?": "Peers Terbatas?",
|
||||||
|
"Restore": "Pemulihan",
|
||||||
|
"Restoring": "Memulihkan",
|
||||||
|
"WGDashboard Settings": "Pengaturan WGDashboard",
|
||||||
|
"Peers Settings": "Pengaturan Peers",
|
||||||
|
"WireGuard Configuration Settings": "Pengaturan Konfigurasi WireGuard",
|
||||||
|
"Appearance": "Penampilan",
|
||||||
|
"Theme": "Tema",
|
||||||
|
"Language": "Bahasa",
|
||||||
|
"Account Settings": "Pengaturan Akun",
|
||||||
|
"Peer Default Settings": "Pengaturan Bawaan Peer",
|
||||||
|
"Toggle When Start Up": "Beralih Kapan Memulai",
|
||||||
|
"Other Settings": "Pengaturan Lainnya",
|
||||||
|
"Select Peers": "Pilih Peers",
|
||||||
|
"Backup & Restore": "Cadangan & Pemulihan",
|
||||||
|
"Delete Configuration": "Hapus Konfigurasi",
|
||||||
|
"Create Backup": "Buat Cadangan",
|
||||||
|
"No backup yet, click the button above to create backup\\.": "Belum ada cadangan, klik tombol di atas untuk membuat cadangan.",
|
||||||
|
"Are you sure to delete this backup\\?": "Apakah Anda yakin untuk menghaus cadangan ini?",
|
||||||
|
"Are you sure to restore this backup?\\": "Apakah Anda yakin untuk memulihkan cadangan ini?",
|
||||||
|
"Backup Date": "Tanggal Cadangan",
|
||||||
|
"File": "File",
|
||||||
|
"Are you sure to delete this configuration\\?": "Apakah Anda yakin untuk menghapus konfigurasi ini?",
|
||||||
|
"Once you deleted this configuration\\:": "Setelah Anda menghapus konfigurasi ini:",
|
||||||
|
"All connected peers will get disconnected": "Semua peers yang terhubung akan terputus",
|
||||||
|
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "File Konfigurasi (.conf) dan tabel basis data yang terkait dengan konfigurasi ini akan terhapus",
|
||||||
|
"Checking backups...": "Memeriksa cadangan...",
|
||||||
|
"This configuration have ([0-9].*) backups": "Konfigurasi ini memiliki $1 cadangan",
|
||||||
|
"This configuration have no backup": "Konfigurasi ini tidak memiliki cadangan",
|
||||||
|
"If you're sure, please type in the configuration name below and click Delete": "Jika Anda yakin, silakan ketik nama konfigurasi dibawah dan klik Hapus",
|
||||||
|
"Select All": "Pilih Semua",
|
||||||
|
"Clear Selection": "Hapus Pilihan",
|
||||||
|
"([0-9].*) Peers?": "$1 Peers?",
|
||||||
|
"Download": "Unduh",
|
||||||
|
"Downloading": "Mengunduh",
|
||||||
|
"Download Finished": "Unduh Selesai",
|
||||||
|
"Done": "Selesai",
|
||||||
|
"Are you sure to delete": "Apakah Anda yakin untuk menghapus",
|
||||||
|
"Are you sure to delete this peer\\?": "Apakah Anda yakin untuk menghapus peer ini?",
|
||||||
|
"Configuration deleted": "Konfigurasi terhapus",
|
||||||
|
"Configuration saved": "Konfigurasi tersimpan",
|
||||||
|
"WGDashboard language update failed": "Pembaruan bahasa WGDashboard gagal",
|
||||||
|
"Configuration restored": "Konfigurasi terpulihkan",
|
||||||
|
"Allowed IP already taken by another peer": "Allowed IP telah digunakan oleh peer lain",
|
||||||
|
"Failed to allow access of peer (.*)": "Gagal untuk mengizinkan akses ke peer $1",
|
||||||
|
"Failed to save configuration through WireGuard": "Gagal untuk menyimpan konfigurasi melalui WireGuard",
|
||||||
|
"Allow access successfully": "Berhasil mengizinkan akses",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) terhapus",
|
||||||
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) berhasil terhapus. Gagal untuk menghapus $2 peer(s)",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) terbatas",
|
||||||
|
"Display As": "Tampilkan Sebagai",
|
||||||
|
"List": "Daftar",
|
||||||
|
"Grid": "Kisi",
|
||||||
|
"Protocol": "Protokol",
|
||||||
|
"Open File": "Buka File",
|
||||||
|
"Advanced Options": "Opsi Lanjutan",
|
||||||
|
"Allowed IPs Validation": "Validasi Allowed IPs",
|
||||||
|
"Update Name": "Pembaruan Nama",
|
||||||
|
"To update this configuration's name, WGDashboard will execute the following operations:": "Untuk memperbarui konfigurasi nama berikut, WGDashboard akan mengeksekusi operasi berikut:",
|
||||||
|
"Duplicate current configuration's database table and \\.conf file with the new name": "Duplikat konfigurasi tabel basis data saat ini dan file .conf dengan nama baru",
|
||||||
|
"Delete current configuration's database table and \\.conf file": "Hapus konfigurasi tabel basis data saat ini dan file .conf",
|
||||||
|
"Danger Zone": "Zona Berbahaya",
|
||||||
|
"Configuration File": "File Konfigurasi",
|
||||||
|
"Edit Raw Configuration File": "Edit File Konfigurasi Mentah",
|
||||||
|
"Peer Configuration File": "File Konfigurasi Peer",
|
||||||
|
"Share with Email": "Berbagi dengan Email",
|
||||||
|
"Who are you sending to?": "Anda ingin kirim ke siapa?",
|
||||||
|
"What's the subject?": "Apa subjeknya?",
|
||||||
|
"What's the body?": "Apa isiannya?",
|
||||||
|
"Email Account": "Akun Email",
|
||||||
|
"Ready": "Siap",
|
||||||
|
"Port": "Port",
|
||||||
|
"Encryption": "Enkripsi",
|
||||||
|
"No Encryption": "Tidak Ada Enkripsi",
|
||||||
|
"Send From": "Kirim Dari",
|
||||||
|
"Send Test Email": "Kirim Email Tes",
|
||||||
|
"Email Body Template": "Template Isi Email",
|
||||||
|
"Live Preview": "Pratinjau Langsung",
|
||||||
|
"Include configuration file as an attachment": "Sertakan file konfigurasi sebagai lampiran",
|
||||||
|
"Send": "Kirim",
|
||||||
|
"Sending\\.\\.\\.": "Mengirim...",
|
||||||
|
"Email sent successfully!": "Email berhasil terkirim!",
|
||||||
|
"AmneziaWG Peer Setting": "Pengaturan Peer AmneziaWG",
|
||||||
|
"System Status": "Keadaan Sistem",
|
||||||
|
"CPU": "CPU",
|
||||||
|
"Memory": "Memori",
|
||||||
|
"Swap Memory": "Memori Swap",
|
||||||
|
"Processes": "Proses",
|
||||||
|
"CPU Usage": "Penggunaan CPU",
|
||||||
|
"Memory Usage": "Penggunaan Memori",
|
||||||
|
"Swap Memory Usage": "Penggunaan Memori Swap",
|
||||||
|
"Network": "Jaringan",
|
||||||
|
"([0-9]{1,}) Interfaces": "$1 Antarmuka",
|
||||||
|
"Storage": "Penyimpanan",
|
||||||
|
"([0-9]{1,}) Partitions": "$1 Partisi",
|
||||||
|
"(.*) Used": "$1 terpakai",
|
||||||
|
"Untitled Peer": "Peer Tanpa Judul",
|
||||||
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) berhasil terbatas. Gagal untuk membatasi $2 peer(s)"
|
||||||
|
}
|
@ -278,7 +278,6 @@
|
|||||||
"Create Backup": "",
|
"Create Backup": "",
|
||||||
"No backup yet, click the button above to create backup\\.": "",
|
"No backup yet, click the button above to create backup\\.": "",
|
||||||
"Are you sure to delete this backup\\?": "",
|
"Are you sure to delete this backup\\?": "",
|
||||||
"Are you sure to restore this backup?\\": "",
|
|
||||||
"Backup Date": "",
|
"Backup Date": "",
|
||||||
"File": "",
|
"File": "",
|
||||||
"Are you sure to delete this configuration\\?": "",
|
"Are you sure to delete this configuration\\?": "",
|
||||||
@ -308,5 +307,63 @@
|
|||||||
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
|
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
|
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
|
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": ""
|
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "",
|
||||||
|
"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\\?": ""
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user