mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-03-20 09:35:48 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b03e9d919 | ||
|
|
7e9c3bdbaf | ||
|
|
957f3dbb54 | ||
|
|
05e60af283 | ||
|
|
5e40458116 | ||
|
|
baf6fdd29d | ||
|
|
45f78d3521 | ||
|
|
01f984e054 | ||
|
|
e4ba5ba53a | ||
|
|
6ff555c8bb | ||
|
|
3c1634ca7c | ||
|
|
561c4810be | ||
|
|
eb1b96643d | ||
|
|
de5314c01f | ||
|
|
1088d1faf3 | ||
|
|
267024c43f | ||
|
|
0d595f56e4 | ||
|
|
a4c4f9efb3 |
2
.github/workflows/docker.yml
vendored
2
.github/workflows/docker.yml
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
87
.github/workflows/release.yml
vendored
87
.github/workflows/release.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
|||||||
- 386
|
- 386
|
||||||
- armv5
|
- armv5
|
||||||
- s390x
|
- s390x
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -42,51 +42,54 @@ jobs:
|
|||||||
go-version-file: go.mod
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
if [ "${{ matrix.platform }}" == "arm64" ]; then
|
|
||||||
sudo apt install gcc-aarch64-linux-gnu
|
|
||||||
elif [ "${{ matrix.platform }}" == "armv7" ]; then
|
|
||||||
sudo apt install gcc-arm-linux-gnueabihf
|
|
||||||
elif [ "${{ matrix.platform }}" == "armv6" ]; then
|
|
||||||
sudo apt install gcc-arm-linux-gnueabihf
|
|
||||||
elif [ "${{ matrix.platform }}" == "386" ]; then
|
|
||||||
sudo apt install gcc-i686-linux-gnu
|
|
||||||
elif [ "${{ matrix.platform }}" == "armv5" ]; then
|
|
||||||
sudo apt install gcc-arm-linux-gnueabi
|
|
||||||
elif [ "${{ matrix.platform }}" == "s390x" ]; then
|
|
||||||
sudo apt install gcc-s390x-linux-gnu
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build 3x-ui
|
- name: Build 3x-ui
|
||||||
run: |
|
run: |
|
||||||
export CGO_ENABLED=1
|
export CGO_ENABLED=1
|
||||||
export GOOS=linux
|
export GOOS=linux
|
||||||
export GOARCH=${{ matrix.platform }}
|
export GOARCH=${{ matrix.platform }}
|
||||||
if [ "${{ matrix.platform }}" == "arm64" ]; then
|
TOOLCHAIN_URL=""
|
||||||
export GOARCH=arm64
|
MUSL_CC_HOST="https://github.com/musl-cc/musl.cc/releases/download/v0.0.1" #http://musl.cc
|
||||||
export CC=aarch64-linux-gnu-gcc
|
case "${{ matrix.platform }}" in
|
||||||
elif [ "${{ matrix.platform }}" == "armv7" ]; then
|
amd64)
|
||||||
export GOARCH=arm
|
TOOLCHAIN_URL="$MUSL_CC_HOST/x86_64-linux-musl-cross.tgz"
|
||||||
export GOARM=7
|
;;
|
||||||
export CC=arm-linux-gnueabihf-gcc
|
arm64)
|
||||||
elif [ "${{ matrix.platform }}" == "armv6" ]; then
|
TOOLCHAIN_URL="$MUSL_CC_HOST/aarch64-linux-musl-cross.tgz"
|
||||||
export GOARCH=arm
|
;;
|
||||||
export GOARM=6
|
armv7)
|
||||||
export CC=arm-linux-gnueabihf-gcc
|
TOOLCHAIN_URL="$MUSL_CC_HOST/armv7l-linux-musleabihf-cross.tgz"
|
||||||
elif [ "${{ matrix.platform }}" == "386" ]; then
|
export GOARCH=arm
|
||||||
export GOARCH=386
|
export GOARM=7
|
||||||
export CC=i686-linux-gnu-gcc
|
;;
|
||||||
elif [ "${{ matrix.platform }}" == "armv5" ]; then
|
armv6)
|
||||||
export GOARCH=arm
|
TOOLCHAIN_URL="$MUSL_CC_HOST/armv6-linux-musleabihf-cross.tgz"
|
||||||
export GOARM=5
|
export GOARCH=arm
|
||||||
export CC=arm-linux-gnueabi-gcc
|
export GOARM=6
|
||||||
elif [ "${{ matrix.platform }}" == "s390x" ]; then
|
;;
|
||||||
export GOARCH=s390x
|
armv5)
|
||||||
export CC=s390x-linux-gnu-gcc
|
TOOLCHAIN_URL="$MUSL_CC_HOST/arm-linux-musleabi-cross.tgz"
|
||||||
fi
|
export GOARCH=arm
|
||||||
go build -ldflags "-w -s" -o xui-release -v main.go
|
export GOARM=5
|
||||||
|
;;
|
||||||
|
386)
|
||||||
|
TOOLCHAIN_URL="$MUSL_CC_HOST/i686-linux-musl-cross.tgz"
|
||||||
|
;;
|
||||||
|
s390x)
|
||||||
|
TOOLCHAIN_URL="$MUSL_CC_HOST/s390x-linux-musl-cross.tgz"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo "Downloading musl toolchain for ${{ matrix.platform }}"
|
||||||
|
curl -LO "$TOOLCHAIN_URL"
|
||||||
|
tar -xf *.tgz
|
||||||
|
TOOLCHAIN_DIR=$(find . -maxdepth 1 -type d -name "*-cross" | head -n1)
|
||||||
|
TOOLCHAIN_DIR=$(realpath "$TOOLCHAIN_DIR")
|
||||||
|
export PATH="$TOOLCHAIN_DIR/bin:$PATH"
|
||||||
|
# Detect compiler
|
||||||
|
export CC=$(find $TOOLCHAIN_DIR/bin -name '*-gcc' | head -n1)
|
||||||
|
echo "Using CC=$CC"
|
||||||
|
go build -ldflags "-w -s -linkmode external -extldflags '-static'" -o xui-release -v main.go
|
||||||
|
file xui-release
|
||||||
|
ldd xui-release || echo "Static binary confirmed"
|
||||||
|
|
||||||
mkdir x-ui
|
mkdir x-ui
|
||||||
cp xui-release x-ui/
|
cp xui-release x-ui/
|
||||||
@@ -97,7 +100,7 @@ jobs:
|
|||||||
cd x-ui/bin
|
cd x-ui/bin
|
||||||
|
|
||||||
# Download dependencies
|
# Download dependencies
|
||||||
Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.7.26/"
|
Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.8.3/"
|
||||||
if [ "${{ matrix.platform }}" == "amd64" ]; then
|
if [ "${{ matrix.platform }}" == "amd64" ]; then
|
||||||
wget -q ${Xray_URL}Xray-linux-64.zip
|
wget -q ${Xray_URL}Xray-linux-64.zip
|
||||||
unzip Xray-linux-64.zip
|
unzip Xray-linux-64.zip
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ case $1 in
|
|||||||
esac
|
esac
|
||||||
mkdir -p build/bin
|
mkdir -p build/bin
|
||||||
cd build/bin
|
cd build/bin
|
||||||
wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.7.26/Xray-linux-${ARCH}.zip"
|
wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.8.3/Xray-linux-${ARCH}.zip"
|
||||||
unzip "Xray-linux-${ARCH}.zip"
|
unzip "Xray-linux-${ARCH}.zip"
|
||||||
rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat
|
rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat
|
||||||
mv xray "xray-linux-${FNAME}"
|
mv xray "xray-linux-${FNAME}"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.6.3
|
2.6.5
|
||||||
22
go.mod
22
go.mod
@@ -14,22 +14,22 @@ require (
|
|||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4
|
github.com/pelletier/go-toml/v2 v2.2.4
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/shirou/gopsutil/v4 v4.25.6
|
github.com/shirou/gopsutil/v4 v4.25.7
|
||||||
github.com/valyala/fasthttp v1.63.0
|
github.com/valyala/fasthttp v1.64.0
|
||||||
github.com/xlzd/gotp v0.1.0
|
github.com/xlzd/gotp v0.1.0
|
||||||
github.com/xtls/xray-core v1.250726.0
|
github.com/xtls/xray-core v1.250803.0
|
||||||
go.uber.org/atomic v1.11.0
|
go.uber.org/atomic v1.11.0
|
||||||
golang.org/x/crypto v0.40.0
|
golang.org/x/crypto v0.40.0
|
||||||
golang.org/x/text v0.27.0
|
golang.org/x/text v0.27.0
|
||||||
google.golang.org/grpc v1.74.2
|
google.golang.org/grpc v1.74.2
|
||||||
gorm.io/driver/sqlite v1.6.0
|
gorm.io/driver/sqlite v1.6.0
|
||||||
gorm.io/gorm v1.30.0
|
gorm.io/gorm v1.30.1
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/andybalholm/brotli v1.2.0 // indirect
|
github.com/andybalholm/brotli v1.2.0 // indirect
|
||||||
github.com/bytedance/sonic v1.13.3 // indirect
|
github.com/bytedance/sonic v1.14.0 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.2.4 // indirect
|
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
||||||
github.com/cloudflare/circl v1.6.1 // indirect
|
github.com/cloudflare/circl v1.6.1 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.5 // indirect
|
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||||
github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33 // indirect
|
github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33 // indirect
|
||||||
@@ -52,13 +52,13 @@ require (
|
|||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/juju/ratelimit v1.0.2 // indirect
|
github.com/juju/ratelimit v1.0.2 // indirect
|
||||||
github.com/klauspost/compress v1.18.0 // indirect
|
github.com/klauspost/compress v1.18.0 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.11 // indirect
|
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect
|
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.28 // indirect
|
github.com/mattn/go-sqlite3 v1.14.30 // indirect
|
||||||
github.com/miekg/dns v1.1.67 // indirect
|
github.com/miekg/dns v1.1.68 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/pires/go-proxyproto v0.8.1 // indirect
|
github.com/pires/go-proxyproto v0.8.1 // indirect
|
||||||
@@ -81,7 +81,7 @@ require (
|
|||||||
github.com/valyala/fastjson v1.6.4 // indirect
|
github.com/valyala/fastjson v1.6.4 // indirect
|
||||||
github.com/vishvananda/netlink v1.3.1 // indirect
|
github.com/vishvananda/netlink v1.3.1 // indirect
|
||||||
github.com/vishvananda/netns v0.0.5 // indirect
|
github.com/vishvananda/netns v0.0.5 // indirect
|
||||||
github.com/xtls/reality v0.0.0-20250725142056-5b52a03d4fb7 // indirect
|
github.com/xtls/reality v0.0.0-20250727231020-de3bb4d08f5a // indirect
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
go.uber.org/mock v0.5.2 // indirect
|
go.uber.org/mock v0.5.2 // indirect
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
||||||
@@ -94,7 +94,7 @@ require (
|
|||||||
golang.org/x/tools v0.35.0 // indirect
|
golang.org/x/tools v0.35.0 // indirect
|
||||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
|
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
|
||||||
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect
|
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 // indirect
|
||||||
google.golang.org/protobuf v1.36.6 // indirect
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 // indirect
|
gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 // indirect
|
||||||
|
|||||||
44
go.sum
44
go.sum
@@ -2,11 +2,11 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg
|
|||||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
|
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
|
||||||
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
|
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
|
||||||
github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
|
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
|
||||||
github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
|
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
|
||||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||||
github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
|
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
|
||||||
github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||||
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
||||||
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||||
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
||||||
@@ -88,8 +88,8 @@ github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSg
|
|||||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU=
|
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
@@ -101,10 +101,10 @@ github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr32
|
|||||||
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
|
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
|
github.com/mattn/go-sqlite3 v1.14.30 h1:bVreufq3EAIG1Quvws73du3/QgdeZ3myglJlrzSYYCY=
|
||||||
github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
github.com/mattn/go-sqlite3 v1.14.30/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
|
github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA=
|
||||||
github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
|
github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -146,8 +146,8 @@ github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287 h1:qIQ0tWF9vxGtkJa2
|
|||||||
github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg=
|
github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg=
|
||||||
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 h1:emzAzMZ1L9iaKCTxdy3Em8Wv4ChIAGnfiz18Cda70g4=
|
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 h1:emzAzMZ1L9iaKCTxdy3Em8Wv4ChIAGnfiz18Cda70g4=
|
||||||
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg=
|
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs=
|
github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c=
|
github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
@@ -171,8 +171,8 @@ github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e h1:5QefA066A1tF
|
|||||||
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e/go.mod h1:5t19P9LBIrNamL6AcMQOncg/r10y3Pc01AbHeMhwlpU=
|
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e/go.mod h1:5t19P9LBIrNamL6AcMQOncg/r10y3Pc01AbHeMhwlpU=
|
||||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
github.com/valyala/fasthttp v1.63.0 h1:DisIL8OjB7ul2d7cBaMRcKTQDYnrGy56R4FCiuDP0Ns=
|
github.com/valyala/fasthttp v1.64.0 h1:QBygLLQmiAyiXuRhthf0tuRkqAFcrC42dckN2S+N3og=
|
||||||
github.com/valyala/fasthttp v1.63.0/go.mod h1:REc4IeW+cAEyLrRPa5A81MIjvz0QE1laoTX2EaPHKJM=
|
github.com/valyala/fasthttp v1.64.0/go.mod h1:dGmFxwkWXSK0NbOSJuF7AMVzU+lkHz0wQVvVITv2UQA=
|
||||||
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
|
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
|
||||||
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
|
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
|
||||||
github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0=
|
github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0=
|
||||||
@@ -181,10 +181,10 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd
|
|||||||
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||||
github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po=
|
github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po=
|
||||||
github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg=
|
github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg=
|
||||||
github.com/xtls/reality v0.0.0-20250725142056-5b52a03d4fb7 h1:Ript0vN+nSO33+Vj4n0mgNY5M+oOxFQJdrJ1VnwTBO0=
|
github.com/xtls/reality v0.0.0-20250727231020-de3bb4d08f5a h1:Fs8Pc0JAc/LDOf9Q4DzKrk+Ujf4ILlyvfvDVZcmOZ2o=
|
||||||
github.com/xtls/reality v0.0.0-20250725142056-5b52a03d4fb7/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0=
|
github.com/xtls/reality v0.0.0-20250727231020-de3bb4d08f5a/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0=
|
||||||
github.com/xtls/xray-core v1.250726.0 h1:uTUHUt/CQ1JQLip1pLkiwoS0pMvl6oCHJgur4M4orWQ=
|
github.com/xtls/xray-core v1.250803.0 h1:sYdRC243UsujnePINH4IfM4MfHE4lj2p4wZFAfeE2GI=
|
||||||
github.com/xtls/xray-core v1.250726.0/go.mod h1:z2vn2o30flYEgpSz1iEhdZP1I46UZ3+gXINZyohH3yE=
|
github.com/xtls/xray-core v1.250803.0/go.mod h1:z2vn2o30flYEgpSz1iEhdZP1I46UZ3+gXINZyohH3yE=
|
||||||
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||||
@@ -235,8 +235,8 @@ golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeu
|
|||||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
|
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
|
||||||
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4=
|
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4=
|
||||||
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA=
|
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074 h1:qJW29YvkiJmXOYMu5Tf8lyrTp3dOS+K4z6IixtLaCf8=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||||
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
|
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
|
||||||
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
|
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
|
||||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||||
@@ -252,8 +252,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
|
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
|
||||||
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
|
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
|
||||||
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
|
gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
|
||||||
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
|
gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
|
||||||
gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 h1:sfK5nHuG7lRFZ2FdTT3RimOqWBg8IrVm+/Vko1FVOsk=
|
gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 h1:sfK5nHuG7lRFZ2FdTT3RimOqWBg8IrVm+/Vko1FVOsk=
|
||||||
gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5/go.mod h1:3r5CMtNQMKIvBlrmM9xWUNamjKBYPOWyXOjmg5Kts3g=
|
gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5/go.mod h1:3r5CMtNQMKIvBlrmM9xWUNamjKBYPOWyXOjmg5Kts3g=
|
||||||
lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
|
lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
|
||||||
|
|||||||
@@ -437,6 +437,11 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string {
|
|||||||
params["fp"] = fp
|
params["fp"] = fp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if pqvValue, ok := searchKey(realitySettings, "mldsa65Verify"); ok {
|
||||||
|
if pqv, ok := pqvValue.(string); ok && len(pqv) > 0 {
|
||||||
|
params["pqv"] = pqv
|
||||||
|
}
|
||||||
|
}
|
||||||
params["spx"] = "/" + random.Seq(15)
|
params["spx"] = "/" + random.Seq(15)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -627,6 +632,11 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string
|
|||||||
params["fp"] = fp
|
params["fp"] = fp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if pqvValue, ok := searchKey(realitySettings, "mldsa65Verify"); ok {
|
||||||
|
if pqv, ok := pqvValue.(string); ok && len(pqv) > 0 {
|
||||||
|
params["pqv"] = pqv
|
||||||
|
}
|
||||||
|
}
|
||||||
params["spx"] = "/" + random.Seq(15)
|
params["spx"] = "/" + random.Seq(15)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -559,7 +559,9 @@ class TlsStreamSettings extends XrayCommonClass {
|
|||||||
disableSystemRoot = false,
|
disableSystemRoot = false,
|
||||||
enableSessionResumption = false,
|
enableSessionResumption = false,
|
||||||
certificates = [new TlsStreamSettings.Cert()],
|
certificates = [new TlsStreamSettings.Cert()],
|
||||||
alpn = [ALPN_OPTION.H3, ALPN_OPTION.H2, ALPN_OPTION.HTTP1],
|
alpn = [ALPN_OPTION.H2, ALPN_OPTION.HTTP1],
|
||||||
|
echServerKeys = '',
|
||||||
|
echForceQuery = 'none',
|
||||||
settings = new TlsStreamSettings.Settings()
|
settings = new TlsStreamSettings.Settings()
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
@@ -573,6 +575,8 @@ class TlsStreamSettings extends XrayCommonClass {
|
|||||||
this.enableSessionResumption = enableSessionResumption;
|
this.enableSessionResumption = enableSessionResumption;
|
||||||
this.certs = certificates;
|
this.certs = certificates;
|
||||||
this.alpn = alpn;
|
this.alpn = alpn;
|
||||||
|
this.echServerKeys = echServerKeys;
|
||||||
|
this.echForceQuery = echForceQuery;
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -592,7 +596,7 @@ class TlsStreamSettings extends XrayCommonClass {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!ObjectUtil.isEmpty(json.settings)) {
|
if (!ObjectUtil.isEmpty(json.settings)) {
|
||||||
settings = new TlsStreamSettings.Settings(json.settings.allowInsecure, json.settings.fingerprint, json.settings.serverName, json.settings.domains);
|
settings = new TlsStreamSettings.Settings(json.settings.allowInsecure, json.settings.fingerprint, json.settings.echConfigList);
|
||||||
}
|
}
|
||||||
return new TlsStreamSettings(
|
return new TlsStreamSettings(
|
||||||
json.serverName,
|
json.serverName,
|
||||||
@@ -605,6 +609,8 @@ class TlsStreamSettings extends XrayCommonClass {
|
|||||||
json.enableSessionResumption,
|
json.enableSessionResumption,
|
||||||
certs,
|
certs,
|
||||||
json.alpn,
|
json.alpn,
|
||||||
|
json.echServerKeys,
|
||||||
|
json.echForceQuery,
|
||||||
settings,
|
settings,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -621,6 +627,8 @@ class TlsStreamSettings extends XrayCommonClass {
|
|||||||
enableSessionResumption: this.enableSessionResumption,
|
enableSessionResumption: this.enableSessionResumption,
|
||||||
certificates: TlsStreamSettings.toJsonArray(this.certs),
|
certificates: TlsStreamSettings.toJsonArray(this.certs),
|
||||||
alpn: this.alpn,
|
alpn: this.alpn,
|
||||||
|
echServerKeys: this.echServerKeys,
|
||||||
|
echForceQuery: this.echForceQuery,
|
||||||
settings: this.settings,
|
settings: this.settings,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -701,21 +709,25 @@ TlsStreamSettings.Settings = class extends XrayCommonClass {
|
|||||||
constructor(
|
constructor(
|
||||||
allowInsecure = false,
|
allowInsecure = false,
|
||||||
fingerprint = UTLS_FINGERPRINT.UTLS_CHROME,
|
fingerprint = UTLS_FINGERPRINT.UTLS_CHROME,
|
||||||
|
echConfigList = '',
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.allowInsecure = allowInsecure;
|
this.allowInsecure = allowInsecure;
|
||||||
this.fingerprint = fingerprint;
|
this.fingerprint = fingerprint;
|
||||||
|
this.echConfigList = echConfigList;
|
||||||
}
|
}
|
||||||
static fromJson(json = {}) {
|
static fromJson(json = {}) {
|
||||||
return new TlsStreamSettings.Settings(
|
return new TlsStreamSettings.Settings(
|
||||||
json.allowInsecure,
|
json.allowInsecure,
|
||||||
json.fingerprint,
|
json.fingerprint,
|
||||||
|
json.echConfigList,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
toJson() {
|
toJson() {
|
||||||
return {
|
return {
|
||||||
allowInsecure: this.allowInsecure,
|
allowInsecure: this.allowInsecure,
|
||||||
fingerprint: this.fingerprint,
|
fingerprint: this.fingerprint,
|
||||||
|
echConfigList: this.echConfigList
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1375,6 +1387,9 @@ class Inbound extends XrayCommonClass {
|
|||||||
if (!ObjectUtil.isEmpty(this.stream.tls.sni)) {
|
if (!ObjectUtil.isEmpty(this.stream.tls.sni)) {
|
||||||
params.set("sni", this.stream.tls.sni);
|
params.set("sni", this.stream.tls.sni);
|
||||||
}
|
}
|
||||||
|
if (this.stream.tls.settings.echConfigList?.length > 0) {
|
||||||
|
params.set("ech", this.stream.tls.settings.echConfigList);
|
||||||
|
}
|
||||||
if (type == "tcp" && !ObjectUtil.isEmpty(flow)) {
|
if (type == "tcp" && !ObjectUtil.isEmpty(flow)) {
|
||||||
params.set("flow", flow);
|
params.set("flow", flow);
|
||||||
}
|
}
|
||||||
@@ -1385,7 +1400,6 @@ class Inbound extends XrayCommonClass {
|
|||||||
params.set("security", "reality");
|
params.set("security", "reality");
|
||||||
params.set("pbk", this.stream.reality.settings.publicKey);
|
params.set("pbk", this.stream.reality.settings.publicKey);
|
||||||
params.set("fp", this.stream.reality.settings.fingerprint);
|
params.set("fp", this.stream.reality.settings.fingerprint);
|
||||||
params.set("pqv", this.stream.reality.settings.mldsa65Verify);
|
|
||||||
if (!ObjectUtil.isArrEmpty(this.stream.reality.serverNames)) {
|
if (!ObjectUtil.isArrEmpty(this.stream.reality.serverNames)) {
|
||||||
params.set("sni", this.stream.reality.serverNames.split(",")[0]);
|
params.set("sni", this.stream.reality.serverNames.split(",")[0]);
|
||||||
}
|
}
|
||||||
@@ -1395,6 +1409,9 @@ class Inbound extends XrayCommonClass {
|
|||||||
if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) {
|
if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) {
|
||||||
params.set("spx", this.stream.reality.settings.spiderX);
|
params.set("spx", this.stream.reality.settings.spiderX);
|
||||||
}
|
}
|
||||||
|
if (!ObjectUtil.isEmpty(this.stream.reality.settings.mldsa65Verify)) {
|
||||||
|
params.set("pqv", this.stream.reality.settings.mldsa65Verify);
|
||||||
|
}
|
||||||
if (type == 'tcp' && !ObjectUtil.isEmpty(flow)) {
|
if (type == 'tcp' && !ObjectUtil.isEmpty(flow)) {
|
||||||
params.set("flow", flow);
|
params.set("flow", flow);
|
||||||
}
|
}
|
||||||
@@ -1472,6 +1489,9 @@ class Inbound extends XrayCommonClass {
|
|||||||
if (this.stream.tls.settings.allowInsecure) {
|
if (this.stream.tls.settings.allowInsecure) {
|
||||||
params.set("allowInsecure", "1");
|
params.set("allowInsecure", "1");
|
||||||
}
|
}
|
||||||
|
if (this.stream.tls.settings.echConfigList?.length > 0) {
|
||||||
|
params.set("ech", this.stream.tls.settings.echConfigList);
|
||||||
|
}
|
||||||
if (!ObjectUtil.isEmpty(this.stream.tls.sni)) {
|
if (!ObjectUtil.isEmpty(this.stream.tls.sni)) {
|
||||||
params.set("sni", this.stream.tls.sni);
|
params.set("sni", this.stream.tls.sni);
|
||||||
}
|
}
|
||||||
@@ -1550,6 +1570,9 @@ class Inbound extends XrayCommonClass {
|
|||||||
if (this.stream.tls.settings.allowInsecure) {
|
if (this.stream.tls.settings.allowInsecure) {
|
||||||
params.set("allowInsecure", "1");
|
params.set("allowInsecure", "1");
|
||||||
}
|
}
|
||||||
|
if (this.stream.tls.settings.echConfigList?.length > 0) {
|
||||||
|
params.set("ech", this.stream.tls.settings.echConfigList);
|
||||||
|
}
|
||||||
if (!ObjectUtil.isEmpty(this.stream.tls.sni)) {
|
if (!ObjectUtil.isEmpty(this.stream.tls.sni)) {
|
||||||
params.set("sni", this.stream.tls.sni);
|
params.set("sni", this.stream.tls.sni);
|
||||||
}
|
}
|
||||||
@@ -1560,7 +1583,6 @@ class Inbound extends XrayCommonClass {
|
|||||||
params.set("security", "reality");
|
params.set("security", "reality");
|
||||||
params.set("pbk", this.stream.reality.settings.publicKey);
|
params.set("pbk", this.stream.reality.settings.publicKey);
|
||||||
params.set("fp", this.stream.reality.settings.fingerprint);
|
params.set("fp", this.stream.reality.settings.fingerprint);
|
||||||
params.set("pqv", this.stream.reality.settings.mldsa65Verify);
|
|
||||||
if (!ObjectUtil.isArrEmpty(this.stream.reality.serverNames)) {
|
if (!ObjectUtil.isArrEmpty(this.stream.reality.serverNames)) {
|
||||||
params.set("sni", this.stream.reality.serverNames.split(",")[0]);
|
params.set("sni", this.stream.reality.serverNames.split(",")[0]);
|
||||||
}
|
}
|
||||||
@@ -1570,6 +1592,9 @@ class Inbound extends XrayCommonClass {
|
|||||||
if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) {
|
if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) {
|
||||||
params.set("spx", this.stream.reality.settings.spiderX);
|
params.set("spx", this.stream.reality.settings.spiderX);
|
||||||
}
|
}
|
||||||
|
if (!ObjectUtil.isEmpty(this.stream.reality.settings.mldsa65Verify)) {
|
||||||
|
params.set("pqv", this.stream.reality.settings.mldsa65Verify);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
@@ -2287,12 +2312,14 @@ Inbound.DokodemoSettings = class extends Inbound.Settings {
|
|||||||
protocol,
|
protocol,
|
||||||
address,
|
address,
|
||||||
port,
|
port,
|
||||||
|
portMap = [],
|
||||||
network = 'tcp,udp',
|
network = 'tcp,udp',
|
||||||
followRedirect = false
|
followRedirect = false
|
||||||
) {
|
) {
|
||||||
super(protocol);
|
super(protocol);
|
||||||
this.address = address;
|
this.address = address;
|
||||||
this.port = port;
|
this.port = port;
|
||||||
|
this.portMap = portMap;
|
||||||
this.network = network;
|
this.network = network;
|
||||||
this.followRedirect = followRedirect;
|
this.followRedirect = followRedirect;
|
||||||
}
|
}
|
||||||
@@ -2302,6 +2329,7 @@ Inbound.DokodemoSettings = class extends Inbound.Settings {
|
|||||||
Protocols.DOKODEMO,
|
Protocols.DOKODEMO,
|
||||||
json.address,
|
json.address,
|
||||||
json.port,
|
json.port,
|
||||||
|
XrayCommonClass.toHeaders(json.portMap),
|
||||||
json.network,
|
json.network,
|
||||||
json.followRedirect,
|
json.followRedirect,
|
||||||
);
|
);
|
||||||
@@ -2311,6 +2339,7 @@ Inbound.DokodemoSettings = class extends Inbound.Settings {
|
|||||||
return {
|
return {
|
||||||
address: this.address,
|
address: this.address,
|
||||||
port: this.port,
|
port: this.port,
|
||||||
|
portMap: XrayCommonClass.toV2Headers(this.portMap, false),
|
||||||
network: this.network,
|
network: this.network,
|
||||||
followRedirect: this.followRedirect,
|
followRedirect: this.followRedirect,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -354,13 +354,15 @@ class TlsStreamSettings extends CommonClass {
|
|||||||
serverName = '',
|
serverName = '',
|
||||||
alpn = [],
|
alpn = [],
|
||||||
fingerprint = '',
|
fingerprint = '',
|
||||||
allowInsecure = false
|
allowInsecure = false,
|
||||||
|
echConfigList = '',
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.serverName = serverName;
|
this.serverName = serverName;
|
||||||
this.alpn = alpn;
|
this.alpn = alpn;
|
||||||
this.fingerprint = fingerprint;
|
this.fingerprint = fingerprint;
|
||||||
this.allowInsecure = allowInsecure;
|
this.allowInsecure = allowInsecure;
|
||||||
|
this.echConfigList = echConfigList;
|
||||||
}
|
}
|
||||||
|
|
||||||
static fromJson(json = {}) {
|
static fromJson(json = {}) {
|
||||||
@@ -369,6 +371,7 @@ class TlsStreamSettings extends CommonClass {
|
|||||||
json.alpn,
|
json.alpn,
|
||||||
json.fingerprint,
|
json.fingerprint,
|
||||||
json.allowInsecure,
|
json.allowInsecure,
|
||||||
|
json.echConfigList,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,6 +381,7 @@ class TlsStreamSettings extends CommonClass {
|
|||||||
alpn: this.alpn,
|
alpn: this.alpn,
|
||||||
fingerprint: this.fingerprint,
|
fingerprint: this.fingerprint,
|
||||||
allowInsecure: this.allowInsecure,
|
allowInsecure: this.allowInsecure,
|
||||||
|
echConfigList: this.echConfigList
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -782,7 +786,8 @@ class Outbound extends CommonClass {
|
|||||||
let alpn = url.searchParams.get('alpn');
|
let alpn = url.searchParams.get('alpn');
|
||||||
let allowInsecure = url.searchParams.get('allowInsecure');
|
let allowInsecure = url.searchParams.get('allowInsecure');
|
||||||
let sni = url.searchParams.get('sni') ?? '';
|
let sni = url.searchParams.get('sni') ?? '';
|
||||||
stream.tls = new TlsStreamSettings(sni, alpn ? alpn.split(',') : [], fp, allowInsecure == 1);
|
let ech = url.searchParams.get('ech') ?? '';
|
||||||
|
stream.tls = new TlsStreamSettings(sni, alpn ? alpn.split(',') : [], fp, allowInsecure == 1, ech);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (security == 'reality') {
|
if (security == 'reality') {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class AllSetting {
|
|||||||
this.webCertFile = "";
|
this.webCertFile = "";
|
||||||
this.webKeyFile = "";
|
this.webKeyFile = "";
|
||||||
this.webBasePath = "/";
|
this.webBasePath = "/";
|
||||||
this.sessionMaxAge = 60;
|
this.sessionMaxAge = 360;
|
||||||
this.pageSize = 50;
|
this.pageSize = 50;
|
||||||
this.expireDiff = 0;
|
this.expireDiff = 0;
|
||||||
this.trafficDiff = 0;
|
this.trafficDiff = 0;
|
||||||
|
|||||||
@@ -108,8 +108,8 @@ func (a *InboundController) addInbound(c *gin.Context) {
|
|||||||
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
jsonMsgObj(c, I18nWeb(c, "pages.inbounds.toasts.inboundCreateSuccess"), inbound, err)
|
jsonMsgObj(c, I18nWeb(c, "pages.inbounds.toasts.inboundCreateSuccess"), inbound, nil)
|
||||||
if err == nil && needRestart {
|
if needRestart {
|
||||||
a.xrayService.SetToNeedRestart()
|
a.xrayService.SetToNeedRestart()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,8 +126,8 @@ func (a *InboundController) delInbound(c *gin.Context) {
|
|||||||
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
jsonMsgObj(c, I18nWeb(c, "pages.inbounds.toasts.inboundDeleteSuccess"), id, err)
|
jsonMsgObj(c, I18nWeb(c, "pages.inbounds.toasts.inboundDeleteSuccess"), id, nil)
|
||||||
if err == nil && needRestart {
|
if needRestart {
|
||||||
a.xrayService.SetToNeedRestart()
|
a.xrayService.SetToNeedRestart()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,8 +152,8 @@ func (a *InboundController) updateInbound(c *gin.Context) {
|
|||||||
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
jsonMsgObj(c, I18nWeb(c, "pages.inbounds.toasts.inboundUpdateSuccess"), inbound, err)
|
jsonMsgObj(c, I18nWeb(c, "pages.inbounds.toasts.inboundUpdateSuccess"), inbound, nil)
|
||||||
if err == nil && needRestart {
|
if needRestart {
|
||||||
a.xrayService.SetToNeedRestart()
|
a.xrayService.SetToNeedRestart()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,25 +342,25 @@ func (a *InboundController) onlines(c *gin.Context) {
|
|||||||
|
|
||||||
func (a *InboundController) updateClientTraffic(c *gin.Context) {
|
func (a *InboundController) updateClientTraffic(c *gin.Context) {
|
||||||
email := c.Param("email")
|
email := c.Param("email")
|
||||||
|
|
||||||
// Define the request structure for traffic update
|
// Define the request structure for traffic update
|
||||||
type TrafficUpdateRequest struct {
|
type TrafficUpdateRequest struct {
|
||||||
Upload int64 `json:"upload"`
|
Upload int64 `json:"upload"`
|
||||||
Download int64 `json:"download"`
|
Download int64 `json:"download"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var request TrafficUpdateRequest
|
var request TrafficUpdateRequest
|
||||||
err := c.ShouldBindJSON(&request)
|
err := c.ShouldBindJSON(&request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.inboundUpdateSuccess"), err)
|
jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.inboundUpdateSuccess"), err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = a.inboundService.UpdateClientTrafficByEmail(email, request.Upload, request.Download)
|
err = a.inboundService.UpdateClientTrafficByEmail(email, request.Upload, request.Download)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.inboundClientUpdateSuccess"), nil)
|
jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.inboundClientUpdateSuccess"), nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,11 +46,13 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) {
|
|||||||
g.POST("/installXray/:version", a.installXray)
|
g.POST("/installXray/:version", a.installXray)
|
||||||
g.POST("/updateGeofile/:fileName", a.updateGeofile)
|
g.POST("/updateGeofile/:fileName", a.updateGeofile)
|
||||||
g.POST("/logs/:count", a.getLogs)
|
g.POST("/logs/:count", a.getLogs)
|
||||||
|
g.POST("/xraylogs/:count", a.getXrayLogs)
|
||||||
g.POST("/getConfigJson", a.getConfigJson)
|
g.POST("/getConfigJson", a.getConfigJson)
|
||||||
g.GET("/getDb", a.getDb)
|
g.GET("/getDb", a.getDb)
|
||||||
g.POST("/importDB", a.importDB)
|
g.POST("/importDB", a.importDB)
|
||||||
g.POST("/getNewX25519Cert", a.getNewX25519Cert)
|
g.POST("/getNewX25519Cert", a.getNewX25519Cert)
|
||||||
g.POST("/getNewmldsa65", a.getNewmldsa65)
|
g.POST("/getNewmldsa65", a.getNewmldsa65)
|
||||||
|
g.POST("/getNewEchCert", a.getNewEchCert)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ServerController) refreshStatus() {
|
func (a *ServerController) refreshStatus() {
|
||||||
@@ -133,6 +135,12 @@ func (a *ServerController) getLogs(c *gin.Context) {
|
|||||||
jsonObj(c, logs, nil)
|
jsonObj(c, logs, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *ServerController) getXrayLogs(c *gin.Context) {
|
||||||
|
count := c.Param("count")
|
||||||
|
logs := a.serverService.GetXrayLogs(count)
|
||||||
|
jsonObj(c, logs, nil)
|
||||||
|
}
|
||||||
|
|
||||||
func (a *ServerController) getConfigJson(c *gin.Context) {
|
func (a *ServerController) getConfigJson(c *gin.Context) {
|
||||||
configJson, err := a.serverService.GetConfigJson()
|
configJson, err := a.serverService.GetConfigJson()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -208,3 +216,13 @@ func (a *ServerController) getNewmldsa65(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
jsonObj(c, cert, nil)
|
jsonObj(c, cert, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *ServerController) getNewEchCert(c *gin.Context) {
|
||||||
|
sni := c.PostForm("sni")
|
||||||
|
cert, err := a.serverService.GetNewEchCert(sni)
|
||||||
|
if err != nil {
|
||||||
|
jsonMsg(c, "get ech certificate", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
jsonObj(c, cert, nil)
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key ]]</a-select-option>
|
<a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key ]]</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item v-if="client.email && app.subSettings.enable">
|
<a-form-item v-if="client.email && app.subSettings?.enable">
|
||||||
<template slot="label">
|
<template slot="label">
|
||||||
<a-tooltip>
|
<a-tooltip>
|
||||||
<template slot="title">
|
<template slot="title">
|
||||||
|
|||||||
@@ -444,16 +444,16 @@
|
|||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="Short ID">
|
<a-form-item label="Short ID">
|
||||||
<a-input v-model.trim="outbound.stream.reality.shortId" :style="{ width: '250px' }"></a-input>
|
<a-input v-model.trim="outbound.stream.reality.shortId"></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="SpiderX">
|
<a-form-item label="SpiderX">
|
||||||
<a-input v-model.trim="outbound.stream.reality.spiderX" :style="{ width: '250px' }"></a-input>
|
<a-input v-model.trim="outbound.stream.reality.spiderX"></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="Public Key">
|
<a-form-item label="Public Key">
|
||||||
<a-input v-model.trim="outbound.stream.reality.publicKey"></a-input>
|
<a-textarea v-model.trim="outbound.stream.reality.publicKey"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="mldsa65 Verify">
|
<a-form-item label="mldsa65 Verify">
|
||||||
<a-input v-model.trim="outbound.stream.reality.mldsa65Verify"></a-input>
|
<a-textarea v-model.trim="outbound.stream.reality.mldsa65Verify"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -6,6 +6,19 @@
|
|||||||
<a-form-item label='{{ i18n "pages.inbounds.destinationPort"}}'>
|
<a-form-item label='{{ i18n "pages.inbounds.destinationPort"}}'>
|
||||||
<a-input-number v-model.number="inbound.settings.port"></a-input-number>
|
<a-input-number v-model.number="inbound.settings.port"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
<a-form-item label='{{ i18n "pages.inbounds.portMap"}}'>
|
||||||
|
<a-button size="small" @click="inbound.settings.portMap.push({name: '', value: ''})">+</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item :wrapper-col="{span:24}">
|
||||||
|
<a-input-group compact v-for="(pm, index) in inbound.settings.portMap">
|
||||||
|
<a-input style="width: 50%" v-model.trim="pm.name" placeholder='{{ i18n "pages.inbounds.port"}}'>
|
||||||
|
<template slot="addonBefore" style="margin: 0;">[[ index+1 ]]</template>
|
||||||
|
</a-input>
|
||||||
|
<a-input style="width: 50%" v-model.trim="pm.value" placeholder='{{ i18n "pages.inbounds.targetAddress" }}'>
|
||||||
|
<a-button slot="addonAfter" size="small" @click="inbound.settings.portMap.splice(index,1)">-</a-button>
|
||||||
|
</a-input>
|
||||||
|
</a-input-group>
|
||||||
|
</a-form-item>
|
||||||
<a-form-item label='{{ i18n "pages.inbounds.network"}}'>
|
<a-form-item label='{{ i18n "pages.inbounds.network"}}'>
|
||||||
<a-select v-model="inbound.settings.network" :dropdown-class-name="themeSwitcher.currentTheme">
|
<a-select v-model="inbound.settings.network" :dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
<a-select-option value="tcp,udp">TCP,UDP</a-select-option>
|
<a-select-option value="tcp,udp">TCP,UDP</a-select-option>
|
||||||
|
|||||||
@@ -36,22 +36,22 @@
|
|||||||
type="sync"></a-icon>
|
type="sync"></a-icon>
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<a-input v-model.trim="inbound.stream.reality.shortIds"></a-input>
|
<a-textarea v-model.trim="inbound.stream.reality.shortIds"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='SpiderX'>
|
<a-form-item label='SpiderX'>
|
||||||
<a-input v-model.trim="inbound.stream.reality.settings.spiderX"></a-input>
|
<a-input v-model.trim="inbound.stream.reality.settings.spiderX"></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'>
|
<a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'>
|
||||||
<a-input v-model="inbound.stream.reality.settings.publicKey"></a-input>
|
<a-textarea v-model="inbound.stream.reality.settings.publicKey"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'>
|
<a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'>
|
||||||
<a-input v-model="inbound.stream.reality.privateKey"></a-input>
|
<a-textarea v-model="inbound.stream.reality.privateKey"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label=" ">
|
<a-form-item label=" ">
|
||||||
<a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button>
|
<a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="mldsa65 Seed">
|
<a-form-item label="mldsa65 Seed">
|
||||||
<a-input v-model="inbound.stream.reality.mldsa65Seed"></a-input>
|
<a-textarea v-model="inbound.stream.reality.mldsa65Seed"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="mldsa65 Verify">
|
<a-form-item label="mldsa65 Verify">
|
||||||
<a-textarea v-model="inbound.stream.reality.settings.mldsa65Verify"></a-textarea>
|
<a-textarea v-model="inbound.stream.reality.settings.mldsa65Verify"></a-textarea>
|
||||||
|
|||||||
@@ -85,10 +85,10 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'>
|
<a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'>
|
||||||
<a-input v-model="cert.cert"></a-input>
|
<a-textarea v-model="cert.cert"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'>
|
<a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'>
|
||||||
<a-input v-model="cert.key"></a-input>
|
<a-textarea v-model="cert.key"></a-textarea>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
<a-form-item label='OCSP stapling'>
|
<a-form-item label='OCSP stapling'>
|
||||||
@@ -106,6 +106,21 @@
|
|||||||
<a-switch v-model="cert.buildChain"></a-switch>
|
<a-switch v-model="cert.buildChain"></a-switch>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
<a-form-item label='ECH key'>
|
||||||
|
<a-input v-model="inbound.stream.tls.echServerKeys"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label='ECH config'>
|
||||||
|
<a-input v-model="inbound.stream.tls.settings.echConfigList"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label='ECH force query'>
|
||||||
|
<a-select v-model="inbound.stream.tls.echForceQuery"
|
||||||
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
|
<a-select-option v-for="key in ['none', 'half', 'full']" :value="key">[[ key ]]</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label=" ">
|
||||||
|
<a-button type="primary" icon="import" @click="getNewEchCert">Get New ECH Cert</a-button>
|
||||||
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- reality settings -->
|
<!-- reality settings -->
|
||||||
|
|||||||
@@ -167,7 +167,10 @@
|
|||||||
<span>{{ i18n "pages.index.xrayErrorPopoverTitle" }}</span>
|
<span>{{ i18n "pages.index.xrayErrorPopoverTitle" }}</span>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col>
|
<a-col>
|
||||||
<a-icon type="bars" :style="{ cursor: 'pointer', float: 'right' }" @click="openLogs()"></a-tag>
|
<a-icon type="bars" :style="{ cursor: 'pointer', float: 'right' }" @click="openLogs()"></a-icon>
|
||||||
|
</a-col>
|
||||||
|
<a-col>
|
||||||
|
<a-icon type="bars" :style="{ cursor: 'pointer', float: 'right' }" @click="openXrayLogs()"></a-icon>
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
</span>
|
</span>
|
||||||
@@ -179,6 +182,10 @@
|
|||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<template #actions>
|
<template #actions>
|
||||||
|
<a-space v-if="app.ipLimitEnable" direction="horizontal" @click="openXrayLogs()" :style="{ justifyContent: 'center' }">
|
||||||
|
<a-icon type="bars"></a-icon>
|
||||||
|
<span v-if="!isMobile">{{ i18n "pages.index.logs" }}</span>
|
||||||
|
</a-space>
|
||||||
<a-space direction="horizontal" @click="stopXrayService" :style="{ justifyContent: 'center' }">
|
<a-space direction="horizontal" @click="stopXrayService" :style="{ justifyContent: 'center' }">
|
||||||
<a-icon type="poweroff"></a-icon>
|
<a-icon type="poweroff"></a-icon>
|
||||||
<span v-if="!isMobile">{{ i18n "pages.index.stopXray" }}</span>
|
<span v-if="!isMobile">{{ i18n "pages.index.stopXray" }}</span>
|
||||||
@@ -422,6 +429,40 @@
|
|||||||
</a-form>
|
</a-form>
|
||||||
<div class="ant-input" :style="{ height: 'auto', maxHeight: '500px', overflow: 'auto', marginTop: '0.5rem' }" v-html="logModal.formattedLogs"></div>
|
<div class="ant-input" :style="{ height: 'auto', maxHeight: '500px', overflow: 'auto', marginTop: '0.5rem' }" v-html="logModal.formattedLogs"></div>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
|
<a-modal id="xraylog-modal"
|
||||||
|
v-model="xraylogModal.visible"
|
||||||
|
:closable="true" @cancel="() => xraylogModal.visible = false"
|
||||||
|
:class="themeSwitcher.currentTheme"
|
||||||
|
width="80vw"
|
||||||
|
footer="">
|
||||||
|
<template slot="title">
|
||||||
|
{{ i18n "pages.index.logs" }}
|
||||||
|
<a-icon :spin="xraylogModal.loading"
|
||||||
|
type="sync"
|
||||||
|
:style="{ verticalAlign: 'middle', marginLeft: '10px' }"
|
||||||
|
:disabled="xraylogModal.loading"
|
||||||
|
@click="openXrayLogs()">
|
||||||
|
</a-icon>
|
||||||
|
</template>
|
||||||
|
<a-form layout="inline">
|
||||||
|
<a-form-item :style="{ marginRight: '0.5rem' }">
|
||||||
|
<a-input-group compact>
|
||||||
|
<a-select size="small" v-model="xraylogModal.rows" :style="{ width: '70px' }"
|
||||||
|
@change="openXrayLogs()" :dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
|
<a-select-option value="10">10</a-select-option>
|
||||||
|
<a-select-option value="20">20</a-select-option>
|
||||||
|
<a-select-option value="50">50</a-select-option>
|
||||||
|
<a-select-option value="100">100</a-select-option>
|
||||||
|
<a-select-option value="500">500</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-input-group>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item :style="{ float: 'right' }">
|
||||||
|
<a-button type="primary" icon="download" @click="FileManager.downloadTextFile(xraylogModal.logs?.join('\n'), 'x-ui.log')"></a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
<div class="ant-input" :style="{ height: 'auto', maxHeight: '500px', overflow: 'auto', marginTop: '0.5rem' }" v-html="xraylogModal.formattedLogs"></div>
|
||||||
|
</a-modal>
|
||||||
<a-modal id="backup-modal"
|
<a-modal id="backup-modal"
|
||||||
v-model="backupModal.visible"
|
v-model="backupModal.visible"
|
||||||
title='{{ i18n "pages.index.backupTitle" }}'
|
title='{{ i18n "pages.index.backupTitle" }}'
|
||||||
@@ -606,6 +647,57 @@
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const xraylogModal = {
|
||||||
|
visible: false,
|
||||||
|
logs: [],
|
||||||
|
rows: 20,
|
||||||
|
loading: false,
|
||||||
|
show(logs) {
|
||||||
|
this.visible = true;
|
||||||
|
this.logs = logs;
|
||||||
|
this.formattedLogs = this.logs?.length > 0 ? this.formatLogs(this.logs) : "No Record...";
|
||||||
|
},
|
||||||
|
formatLogs(logs) {
|
||||||
|
let formattedLogs = '';
|
||||||
|
|
||||||
|
logs.forEach((log, index) => {
|
||||||
|
if(index > 0) formattedLogs += '<br>';
|
||||||
|
|
||||||
|
const parts = log.split(' ');
|
||||||
|
|
||||||
|
if(parts.length === 9) {
|
||||||
|
const dateTime = `<b>${parts[0]} ${parts[1]}</b>`;
|
||||||
|
const from = `<b>${parts[3]}</b>`;
|
||||||
|
const to = `<b>${parts[5].replace(/^\/+/, "")}</b>`;
|
||||||
|
|
||||||
|
let outboundColor = '';
|
||||||
|
if (parts[8].startsWith('blocked')) {
|
||||||
|
outboundColor = ' style="color: #e04141;"';
|
||||||
|
}
|
||||||
|
else if (!parts[8].startsWith('direct')) {
|
||||||
|
outboundColor = ' style="color: #3c89e8;"';
|
||||||
|
}
|
||||||
|
|
||||||
|
formattedLogs += `<span${outboundColor}>
|
||||||
|
${dateTime}
|
||||||
|
${parts[2]}
|
||||||
|
${from}
|
||||||
|
${parts[4]}
|
||||||
|
${to}
|
||||||
|
${parts.slice(6).join(' ')}
|
||||||
|
</span>`;
|
||||||
|
} else {
|
||||||
|
formattedLogs += `<span>${parts.join(' ')}</span>`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return formattedLogs;
|
||||||
|
},
|
||||||
|
hide() {
|
||||||
|
this.visible = false;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
const backupModal = {
|
const backupModal = {
|
||||||
visible: false,
|
visible: false,
|
||||||
show() {
|
show() {
|
||||||
@@ -629,10 +721,12 @@
|
|||||||
status: new Status(),
|
status: new Status(),
|
||||||
versionModal,
|
versionModal,
|
||||||
logModal,
|
logModal,
|
||||||
|
xraylogModal,
|
||||||
backupModal,
|
backupModal,
|
||||||
loadingTip: '{{ i18n "loading"}}',
|
loadingTip: '{{ i18n "loading"}}',
|
||||||
showAlert: false,
|
showAlert: false,
|
||||||
showIp: false
|
showIp: false,
|
||||||
|
ipLimitEnable: false,
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
loading(spinning, tip = '{{ i18n "loading"}}') {
|
loading(spinning, tip = '{{ i18n "loading"}}') {
|
||||||
@@ -721,6 +815,16 @@
|
|||||||
await PromiseUtil.sleep(500);
|
await PromiseUtil.sleep(500);
|
||||||
logModal.loading = false;
|
logModal.loading = false;
|
||||||
},
|
},
|
||||||
|
async openXrayLogs(){
|
||||||
|
xraylogModal.loading = true;
|
||||||
|
const msg = await HttpUtil.post('server/xraylogs/'+xraylogModal.rows);
|
||||||
|
if (!msg.success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xraylogModal.show(msg.obj);
|
||||||
|
await PromiseUtil.sleep(500);
|
||||||
|
xraylogModal.loading = false;
|
||||||
|
},
|
||||||
async openConfig() {
|
async openConfig() {
|
||||||
this.loading(true);
|
this.loading(true);
|
||||||
const msg = await HttpUtil.post('server/getConfigJson');
|
const msg = await HttpUtil.post('server/getConfigJson');
|
||||||
@@ -773,6 +877,12 @@
|
|||||||
if (window.location.protocol !== "https:") {
|
if (window.location.protocol !== "https:") {
|
||||||
this.showAlert = true;
|
this.showAlert = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const msg = await HttpUtil.post('/panel/setting/defaultSettings');
|
||||||
|
if (msg.success) {
|
||||||
|
this.ipLimitEnable = msg.obj.ipLimitEnable;
|
||||||
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
await this.getStatus();
|
await this.getStatus();
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
<a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
|
<a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item v-if="app.subSettings.enable">
|
<a-form-item v-if="app.subSettings?.enable">
|
||||||
<template slot="label">
|
<template slot="label">
|
||||||
<a-tooltip>
|
<a-tooltip>
|
||||||
<template slot="title">
|
<template slot="title">
|
||||||
|
|||||||
@@ -199,7 +199,7 @@
|
|||||||
<a-tag>[[ infoModal.clientSettings.limitIp ]]</a-tag>
|
<a-tag>[[ infoModal.clientSettings.limitIp ]]</a-tag>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-if="app.ipLimitEnable">
|
<tr v-if="app.ipLimitEnable && infoModal.clientSettings.limitIp > 0">
|
||||||
<td>{{ i18n "pages.inbounds.IPLimitlog" }}</td>
|
<td>{{ i18n "pages.inbounds.IPLimitlog" }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a-tag>[[ infoModal.clientIps ]]</a-tag>
|
<a-tag>[[ infoModal.clientIps ]]</a-tag>
|
||||||
|
|||||||
@@ -152,6 +152,16 @@
|
|||||||
inModal.inbound.stream.reality.mldsa65Seed = msg.obj.seed;
|
inModal.inbound.stream.reality.mldsa65Seed = msg.obj.seed;
|
||||||
inModal.inbound.stream.reality.settings.mldsa65Verify = msg.obj.verify;
|
inModal.inbound.stream.reality.settings.mldsa65Verify = msg.obj.verify;
|
||||||
},
|
},
|
||||||
|
async getNewEchCert() {
|
||||||
|
inModal.loading(true);
|
||||||
|
const msg = await HttpUtil.post('/server/getNewEchCert', {sni: inModal.inbound.stream.tls.sni});
|
||||||
|
inModal.loading(false);
|
||||||
|
if (!msg.success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
inModal.inbound.stream.tls.echServerKeys = msg.obj.echServerKeys;
|
||||||
|
inModal.inbound.stream.tls.settings.echConfigList = msg.obj.echConfigList;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
</a-space>
|
</a-space>
|
||||||
</template>
|
</template>
|
||||||
<tr-qr-modal class="qr-modal">
|
<tr-qr-modal class="qr-modal">
|
||||||
<template v-if="app.subSettings.enable && qrModal.subId">
|
<template v-if="app.subSettings?.enable && qrModal.subId">
|
||||||
<tr-qr-box class="qr-box">
|
<tr-qr-box class="qr-box">
|
||||||
<a-tag color="purple" class="qr-tag"><span>{{ i18n "pages.settings.subSettings"}}</span></a-tag>
|
<a-tag color="purple" class="qr-tag"><span>{{ i18n "pages.settings.subSettings"}}</span></a-tag>
|
||||||
<tr-qr-bg class="qr-bg-sub">
|
<tr-qr-bg class="qr-bg-sub">
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/zip"
|
"archive/zip"
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -329,7 +330,7 @@ func (s *ServerService) GetXrayVersions() ([]string, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if major > 25 || (major == 25 && minor > 7) || (major == 25 && minor == 7 && patch >= 26) {
|
if major > 25 || (major == 25 && minor > 8) || (major == 25 && minor == 8 && patch >= 3) {
|
||||||
versions = append(versions, release.TagName)
|
versions = append(versions, release.TagName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -481,6 +482,37 @@ func (s *ServerService) GetLogs(count string, level string, syslog string) []str
|
|||||||
return lines
|
return lines
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ServerService) GetXrayLogs(count string) []string {
|
||||||
|
c, _ := strconv.Atoi(count)
|
||||||
|
var lines []string
|
||||||
|
|
||||||
|
pathToAccessLog, err := xray.GetAccessLogPath()
|
||||||
|
if err != nil {
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(pathToAccessLog)
|
||||||
|
if err != nil {
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if strings.TrimSpace(line) == "" || strings.Contains(line, "api -> api") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
lines = append(lines, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(lines) > c {
|
||||||
|
lines = lines[len(lines)-c:]
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
|
||||||
func (s *ServerService) GetConfigJson() (any, error) {
|
func (s *ServerService) GetConfigJson() (any, error) {
|
||||||
config, err := s.xrayService.GetXrayConfig()
|
config, err := s.xrayService.GetXrayConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -743,3 +775,27 @@ func (s *ServerService) GetNewmldsa65() (any, error) {
|
|||||||
|
|
||||||
return keyPair, nil
|
return keyPair, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ServerService) GetNewEchCert(sni string) (interface{}, error) {
|
||||||
|
// Run the command
|
||||||
|
cmd := exec.Command(xray.GetBinaryPath(), "tls", "ech", "--serverName", sni)
|
||||||
|
var out bytes.Buffer
|
||||||
|
cmd.Stdout = &out
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(out.String(), "\n")
|
||||||
|
if len(lines) < 4 {
|
||||||
|
return nil, common.NewError("invalid ech cert")
|
||||||
|
}
|
||||||
|
|
||||||
|
configList := lines[1]
|
||||||
|
serverKeys := lines[3]
|
||||||
|
|
||||||
|
return map[string]interface{}{
|
||||||
|
"echServerKeys": serverKeys,
|
||||||
|
"echConfigList": configList,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ var defaultValueMap = map[string]string{
|
|||||||
"webKeyFile": "",
|
"webKeyFile": "",
|
||||||
"secret": random.Seq(32),
|
"secret": random.Seq(32),
|
||||||
"webBasePath": "/",
|
"webBasePath": "/",
|
||||||
"sessionMaxAge": "60",
|
"sessionMaxAge": "360",
|
||||||
"pageSize": "50",
|
"pageSize": "50",
|
||||||
"expireDiff": "0",
|
"expireDiff": "0",
|
||||||
"trafficDiff": "0",
|
"trafficDiff": "0",
|
||||||
|
|||||||
@@ -158,6 +158,7 @@
|
|||||||
"remark" = "ملاحظة"
|
"remark" = "ملاحظة"
|
||||||
"protocol" = "بروتوكول"
|
"protocol" = "بروتوكول"
|
||||||
"port" = "بورت"
|
"port" = "بورت"
|
||||||
|
"portMap" = "خريطة البورت"
|
||||||
"traffic" = "الترافيك"
|
"traffic" = "الترافيك"
|
||||||
"details" = "تفاصيل"
|
"details" = "تفاصيل"
|
||||||
"transportConfig" = "نقل"
|
"transportConfig" = "نقل"
|
||||||
@@ -173,8 +174,6 @@
|
|||||||
"deleteClient" = "حذف العميل"
|
"deleteClient" = "حذف العميل"
|
||||||
"deleteClientContent" = "متأكد إنك عايز تحذف العميل؟"
|
"deleteClientContent" = "متأكد إنك عايز تحذف العميل؟"
|
||||||
"resetTrafficContent" = "متأكد إنك عايز تعيد ضبط الترافيك؟"
|
"resetTrafficContent" = "متأكد إنك عايز تعيد ضبط الترافيك؟"
|
||||||
"inboundUpdateSuccess" = "تم تحديث الوارد بنجاح."
|
|
||||||
"inboundCreateSuccess" = "تم إنشاء الوارد بنجاح."
|
|
||||||
"copyLink" = "انسخ الرابط"
|
"copyLink" = "انسخ الرابط"
|
||||||
"address" = "العنوان"
|
"address" = "العنوان"
|
||||||
"network" = "الشبكة"
|
"network" = "الشبكة"
|
||||||
@@ -645,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 اتحدّث في: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 اتحدّث في: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ أيوه"
|
"yes" = "✅ أيوه"
|
||||||
"no" = "❌ لأ"
|
"no" = "❌ لأ"
|
||||||
|
|
||||||
"received_id" = "🔑📥 الـ ID اتحدث."
|
"received_id" = "🔑📥 الـ ID اتحدث."
|
||||||
"received_password" = "🔑📥 الباسورد اتحدث."
|
"received_password" = "🔑📥 الباسورد اتحدث."
|
||||||
"received_email" = "📧📥 الإيميل اتحدث."
|
"received_email" = "📧📥 الإيميل اتحدث."
|
||||||
@@ -665,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ❌ فشل \n\n🛠️ الخطأ: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ❌ فشل \n\n🛠️ الخطأ: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 عملية إعادة ضبط الترافيك خلصت لكل العملاء."
|
"FinishProcess" = "🔚 عملية إعادة ضبط الترافيك خلصت لكل العملاء."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ اقفل الكيبورد"
|
"closeKeyboard" = "❌ اقفل الكيبورد"
|
||||||
"cancel" = "❌ إلغاء"
|
"cancel" = "❌ إلغاء"
|
||||||
@@ -699,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 حد الترافيك"
|
"limitTraffic" = "🚧 حد الترافيك"
|
||||||
"getBanLogs" = "احصل على سجلات الحظر"
|
"getBanLogs" = "احصل على سجلات الحظر"
|
||||||
"allClients" = "كل العملاء"
|
"allClients" = "كل العملاء"
|
||||||
|
|
||||||
"addClient" = "إضافة عميل"
|
"addClient" = "إضافة عميل"
|
||||||
"submitDisable" = "إرسال كمعطّل ☑️"
|
"submitDisable" = "إرسال كمعطّل ☑️"
|
||||||
"submitEnable" = "إرسال كمفعّل ✅"
|
"submitEnable" = "إرسال كمفعّل ✅"
|
||||||
@@ -711,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "إعادة ضبط جميع الترافيك"
|
"ResetAllTraffics" = "إعادة ضبط جميع الترافيك"
|
||||||
"SortedTrafficUsageReport" = "تقرير استخدام الترافيك المرتب"
|
"SortedTrafficUsageReport" = "تقرير استخدام الترافيك المرتب"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ العملية نجحت!"
|
"successfulOperation" = "✅ العملية نجحت!"
|
||||||
"errorOperation" = "❗ حصل خطأ في العملية."
|
"errorOperation" = "❗ حصل خطأ في العملية."
|
||||||
|
|||||||
@@ -158,6 +158,7 @@
|
|||||||
"remark" = "Remark"
|
"remark" = "Remark"
|
||||||
"protocol" = "Protocol"
|
"protocol" = "Protocol"
|
||||||
"port" = "Port"
|
"port" = "Port"
|
||||||
|
"portMap" = "Port Mapping"
|
||||||
"traffic" = "Traffic"
|
"traffic" = "Traffic"
|
||||||
"details" = "Details"
|
"details" = "Details"
|
||||||
"transportConfig" = "Transport"
|
"transportConfig" = "Transport"
|
||||||
@@ -643,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Refreshed On: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Refreshed On: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Yes"
|
"yes" = "✅ Yes"
|
||||||
"no" = "❌ No"
|
"no" = "❌ No"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID updated."
|
"received_id" = "🔑📥 ID updated."
|
||||||
"received_password" = "🔑📥 Password updated."
|
"received_password" = "🔑📥 Password updated."
|
||||||
"received_email" = "📧📥 Email updated."
|
"received_email" = "📧📥 Email updated."
|
||||||
@@ -663,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Result: ❌ Failed \n\n🛠️ Error: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Result: ❌ Failed \n\n🛠️ Error: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Traffic reset process finished for all clients."
|
"FinishProcess" = "🔚 Traffic reset process finished for all clients."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Close Keyboard"
|
"closeKeyboard" = "❌ Close Keyboard"
|
||||||
"cancel" = "❌ Cancel"
|
"cancel" = "❌ Cancel"
|
||||||
@@ -697,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Traffic Limit"
|
"limitTraffic" = "🚧 Traffic Limit"
|
||||||
"getBanLogs" = "Get Ban Logs"
|
"getBanLogs" = "Get Ban Logs"
|
||||||
"allClients" = "All Clients"
|
"allClients" = "All Clients"
|
||||||
|
|
||||||
"addClient" = "Add Client"
|
"addClient" = "Add Client"
|
||||||
"submitDisable" = "Submit As Disable ☑️"
|
"submitDisable" = "Submit As Disable ☑️"
|
||||||
"submitEnable" = "Submit As Enable ✅"
|
"submitEnable" = "Submit As Enable ✅"
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Tiempo de Funcionamiento"
|
"operationHours" = "Tiempo de Funcionamiento"
|
||||||
"systemLoad" = "Carga del Sistema"
|
"systemLoad" = "Carga del Sistema"
|
||||||
"systemLoadDesc" = "promedio de carga del sistema en los últimos 1, 5 y 15 minutos"
|
"systemLoadDesc" = "promedio de carga del sistema en los últimos 1, 5 y 15 minutos"
|
||||||
"connectionTcpCountDesc" = "Conexiones TCP totales en todas las tarjetas de red."
|
|
||||||
"connectionUdpCountDesc" = "Conexiones UDP totales en todas las tarjetas de red."
|
|
||||||
"connectionCount" = "Número de Conexiones"
|
"connectionCount" = "Número de Conexiones"
|
||||||
"ipAddresses" = "Direcciones IP"
|
"ipAddresses" = "Direcciones IP"
|
||||||
"toggleIpVisibility" = "Alternar visibilidad de la IP"
|
"toggleIpVisibility" = "Alternar visibilidad de la IP"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Notas"
|
"remark" = "Notas"
|
||||||
"protocol" = "Protocolo"
|
"protocol" = "Protocolo"
|
||||||
"port" = "Puerto"
|
"port" = "Puerto"
|
||||||
|
"portMap" = "Puertos de Destino"
|
||||||
"traffic" = "Tráfico"
|
"traffic" = "Tráfico"
|
||||||
"details" = "Detalles"
|
"details" = "Detalles"
|
||||||
"transportConfig" = "Transporte"
|
"transportConfig" = "Transporte"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Eliminar cliente"
|
"deleteClient" = "Eliminar cliente"
|
||||||
"deleteClientContent" = "¿Está seguro de que desea eliminar el cliente?"
|
"deleteClientContent" = "¿Está seguro de que desea eliminar el cliente?"
|
||||||
"resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?"
|
"resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?"
|
||||||
"inboundUpdateSuccess" = "La entrada se ha actualizado correctamente."
|
|
||||||
"inboundCreateSuccess" = "La entrada se ha creado correctamente."
|
|
||||||
"copyLink" = "Copiar Enlace"
|
"copyLink" = "Copiar Enlace"
|
||||||
"address" = "Dirección"
|
"address" = "Dirección"
|
||||||
"network" = "Red"
|
"network" = "Red"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Sí"
|
"yes" = "✅ Sí"
|
||||||
"no" = "❌ No"
|
"no" = "❌ No"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID actualizado."
|
"received_id" = "🔑📥 ID actualizado."
|
||||||
"received_password" = "🔑📥 Contraseña actualizada."
|
"received_password" = "🔑📥 Contraseña actualizada."
|
||||||
"received_email" = "📧📥 Correo electrónico actualizado."
|
"received_email" = "📧📥 Correo electrónico actualizado."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ❌ Fallido \n\n🛠️ Error: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ❌ Fallido \n\n🛠️ Error: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Proceso de reinicio de tráfico finalizado para todos los clientes."
|
"FinishProcess" = "🔚 Proceso de reinicio de tráfico finalizado para todos los clientes."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Cerrar Teclado"
|
"closeKeyboard" = "❌ Cerrar Teclado"
|
||||||
"cancel" = "❌ Cancelar"
|
"cancel" = "❌ Cancelar"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Límite de tráfico"
|
"limitTraffic" = "🚧 Límite de tráfico"
|
||||||
"getBanLogs" = "Registros de prohibición"
|
"getBanLogs" = "Registros de prohibición"
|
||||||
"allClients" = "Todos los Clientes"
|
"allClients" = "Todos los Clientes"
|
||||||
|
|
||||||
"addClient" = "Añadir cliente"
|
"addClient" = "Añadir cliente"
|
||||||
"submitDisable" = "Enviar como deshabilitado ☑️"
|
"submitDisable" = "Enviar como deshabilitado ☑️"
|
||||||
"submitEnable" = "Enviar como habilitado ✅"
|
"submitEnable" = "Enviar como habilitado ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Reiniciar todo el tráfico"
|
"ResetAllTraffics" = "Reiniciar todo el tráfico"
|
||||||
"SortedTrafficUsageReport" = "Informe de uso de tráfico ordenado"
|
"SortedTrafficUsageReport" = "Informe de uso de tráfico ordenado"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ ¡Exitosa!"
|
"successfulOperation" = "✅ ¡Exitosa!"
|
||||||
"errorOperation" = "❗ Error en la Operación."
|
"errorOperation" = "❗ Error en la Operación."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "مدتکارکرد"
|
"operationHours" = "مدتکارکرد"
|
||||||
"systemLoad" = "بارسیستم"
|
"systemLoad" = "بارسیستم"
|
||||||
"systemLoadDesc" = "میانگین بار سیستم برای 1، 5 و 15 دقیقه گذشته"
|
"systemLoadDesc" = "میانگین بار سیستم برای 1، 5 و 15 دقیقه گذشته"
|
||||||
"connectionTcpCountDesc" = "در تمامشبکهها TCP مجموعاتصالات"
|
|
||||||
"connectionUdpCountDesc" = "در تمامشبکهها UDP مجموعاتصالات"
|
|
||||||
"connectionCount" = "تعداد کانکشن ها"
|
"connectionCount" = "تعداد کانکشن ها"
|
||||||
"ipAddresses" = "آدرسهای IP"
|
"ipAddresses" = "آدرسهای IP"
|
||||||
"toggleIpVisibility" = "تغییر وضعیت نمایش IP"
|
"toggleIpVisibility" = "تغییر وضعیت نمایش IP"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "نام"
|
"remark" = "نام"
|
||||||
"protocol" = "پروتکل"
|
"protocol" = "پروتکل"
|
||||||
"port" = "پورت"
|
"port" = "پورت"
|
||||||
|
"portMap" = "پورتهای نظیر"
|
||||||
"traffic" = "ترافیک"
|
"traffic" = "ترافیک"
|
||||||
"details" = "توضیحات"
|
"details" = "توضیحات"
|
||||||
"transportConfig" = "نحوه اتصال"
|
"transportConfig" = "نحوه اتصال"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "حذف کاربر"
|
"deleteClient" = "حذف کاربر"
|
||||||
"deleteClientContent" = "آیا مطمئن به حذف کاربر هستید؟"
|
"deleteClientContent" = "آیا مطمئن به حذف کاربر هستید؟"
|
||||||
"resetTrafficContent" = "آیا مطمئن به ریست ترافیک هستید؟"
|
"resetTrafficContent" = "آیا مطمئن به ریست ترافیک هستید؟"
|
||||||
"inboundUpdateSuccess" = "ورودی با موفقیت بهروزرسانی شد."
|
|
||||||
"inboundCreateSuccess" = "ورودی با موفقیت ایجاد شد."
|
|
||||||
"copyLink" = "کپی لینک"
|
"copyLink" = "کپی لینک"
|
||||||
"address" = "آدرس"
|
"address" = "آدرس"
|
||||||
"network" = "شبکه"
|
"network" = "شبکه"
|
||||||
@@ -359,16 +356,16 @@
|
|||||||
"subDomainDesc" = "آدرس دامنه برای سرویس سابسکریپشن. برای گوش دادن به تمام دامنهها و آیپیها خالیبگذارید"
|
"subDomainDesc" = "آدرس دامنه برای سرویس سابسکریپشن. برای گوش دادن به تمام دامنهها و آیپیها خالیبگذارید"
|
||||||
"subUpdates" = "فاصله بروزرسانی سابسکریپشن"
|
"subUpdates" = "فاصله بروزرسانی سابسکریپشن"
|
||||||
"subUpdatesDesc" = "(فاصله مابین بروزرسانی در برنامههای کاربری. (واحد: ساعت"
|
"subUpdatesDesc" = "(فاصله مابین بروزرسانی در برنامههای کاربری. (واحد: ساعت"
|
||||||
"externalTrafficInformEnable" = "اطلاع رسانی خارجی مصرف ترافیک"
|
|
||||||
"externalTrafficInformEnableDesc" = "مصرف ترافیک به سرویس خارجی ارسال می شود"
|
|
||||||
"externalTrafficInformURI" = "لینک اطلاع رسانی خارجی مصرف ترافیک"
|
|
||||||
"externalTrafficInformURIDesc" = "ترافیک های مصرفی به این لینک هم ارسال می شود"
|
|
||||||
"subEncrypt" = "کدگذاری"
|
"subEncrypt" = "کدگذاری"
|
||||||
"subEncryptDesc" = "کدگذاری خواهدشد Base64 محتوای برگشتی سرویس سابسکریپشن برپایه"
|
"subEncryptDesc" = "کدگذاری خواهدشد Base64 محتوای برگشتی سرویس سابسکریپشن برپایه"
|
||||||
"subShowInfo" = "نمایش اطلاعات مصرف"
|
"subShowInfo" = "نمایش اطلاعات مصرف"
|
||||||
"subShowInfoDesc" = "ترافیک و زمان باقیمانده را در برنامههای کاربری نمایش میدهد"
|
"subShowInfoDesc" = "ترافیک و زمان باقیمانده را در برنامههای کاربری نمایش میدهد"
|
||||||
"subURI" = "پروکسی معکوس URI مسیر"
|
"subURI" = "پروکسی معکوس URI مسیر"
|
||||||
"subURIDesc" = "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر"
|
"subURIDesc" = "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر"
|
||||||
|
"externalTrafficInformEnable" = "اطلاع رسانی خارجی مصرف ترافیک"
|
||||||
|
"externalTrafficInformEnableDesc" = "مصرف ترافیک به سرویس خارجی ارسال می شود"
|
||||||
|
"externalTrafficInformURI" = "لینک اطلاع رسانی خارجی مصرف ترافیک"
|
||||||
|
"externalTrafficInformURIDesc" = "ترافیک های مصرفی به این لینک هم ارسال می شود"
|
||||||
"fragment" = "فرگمنت"
|
"fragment" = "فرگمنت"
|
||||||
"fragmentDesc" = "فعال کردن فرگمنت برای بستهی نخست تیالاس"
|
"fragmentDesc" = "فعال کردن فرگمنت برای بستهی نخست تیالاس"
|
||||||
"fragmentSett" = "تنظیمات فرگمنت"
|
"fragmentSett" = "تنظیمات فرگمنت"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ بله"
|
"yes" = "✅ بله"
|
||||||
"no" = "❌ خیر"
|
"no" = "❌ خیر"
|
||||||
|
|
||||||
"received_id" = "🔑📥 شناسه بهروزرسانی شد."
|
"received_id" = "🔑📥 شناسه بهروزرسانی شد."
|
||||||
"received_password" = "🔑📥 رمز عبور بهروزرسانی شد."
|
"received_password" = "🔑📥 رمز عبور بهروزرسانی شد."
|
||||||
"received_email" = "📧📥 ایمیل بهروزرسانی شد."
|
"received_email" = "📧📥 ایمیل بهروزرسانی شد."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ❌ ناموفق \n\n🛠️ خطا: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ❌ ناموفق \n\n🛠️ خطا: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 فرآیند بازنشانی ترافیک برای همه مشتریان به پایان رسید."
|
"FinishProcess" = "🔚 فرآیند بازنشانی ترافیک برای همه مشتریان به پایان رسید."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ بستن کیبورد"
|
"closeKeyboard" = "❌ بستن کیبورد"
|
||||||
"cancel" = "❌ لغو"
|
"cancel" = "❌ لغو"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 محدودیت ترافیک"
|
"limitTraffic" = "🚧 محدودیت ترافیک"
|
||||||
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
||||||
"allClients" = "همه مشتریان"
|
"allClients" = "همه مشتریان"
|
||||||
|
|
||||||
"addClient" = "افزودن مشتری"
|
"addClient" = "افزودن مشتری"
|
||||||
"submitDisable" = "ارسال به عنوان غیرفعال ☑️"
|
"submitDisable" = "ارسال به عنوان غیرفعال ☑️"
|
||||||
"submitEnable" = "ارسال به عنوان فعال ✅"
|
"submitEnable" = "ارسال به عنوان فعال ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "بازنشانی همه ترافیکها"
|
"ResetAllTraffics" = "بازنشانی همه ترافیکها"
|
||||||
"SortedTrafficUsageReport" = "گزارش استفاده از ترافیک مرتبشده"
|
"SortedTrafficUsageReport" = "گزارش استفاده از ترافیک مرتبشده"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ انجام شد!"
|
"successfulOperation" = "✅ انجام شد!"
|
||||||
"errorOperation" = "❗ خطا در عملیات."
|
"errorOperation" = "❗ خطا در عملیات."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Waktu Aktif"
|
"operationHours" = "Waktu Aktif"
|
||||||
"systemLoad" = "Beban Sistem"
|
"systemLoad" = "Beban Sistem"
|
||||||
"systemLoadDesc" = "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir"
|
"systemLoadDesc" = "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir"
|
||||||
"connectionTcpCountDesc" = "Total koneksi TCP di seluruh sistem"
|
|
||||||
"connectionUdpCountDesc" = "Total koneksi UDP di seluruh sistem"
|
|
||||||
"connectionCount" = "Statistik Koneksi"
|
"connectionCount" = "Statistik Koneksi"
|
||||||
"ipAddresses" = "Alamat IP"
|
"ipAddresses" = "Alamat IP"
|
||||||
"toggleIpVisibility" = "Alihkan visibilitas IP"
|
"toggleIpVisibility" = "Alihkan visibilitas IP"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Catatan"
|
"remark" = "Catatan"
|
||||||
"protocol" = "Protokol"
|
"protocol" = "Protokol"
|
||||||
"port" = "Port"
|
"port" = "Port"
|
||||||
|
"portMap" = "Port Mapping"
|
||||||
"traffic" = "Traffic"
|
"traffic" = "Traffic"
|
||||||
"details" = "Rincian"
|
"details" = "Rincian"
|
||||||
"transportConfig" = "Transport"
|
"transportConfig" = "Transport"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Hapus Klien"
|
"deleteClient" = "Hapus Klien"
|
||||||
"deleteClientContent" = "Apakah Anda yakin ingin menghapus klien?"
|
"deleteClientContent" = "Apakah Anda yakin ingin menghapus klien?"
|
||||||
"resetTrafficContent" = "Apakah Anda yakin ingin mereset traffic?"
|
"resetTrafficContent" = "Apakah Anda yakin ingin mereset traffic?"
|
||||||
"inboundUpdateSuccess" = "Inbound berhasil diperbarui."
|
|
||||||
"inboundCreateSuccess" = "Inbound berhasil dibuat."
|
|
||||||
"copyLink" = "Salin URL"
|
"copyLink" = "Salin URL"
|
||||||
"address" = "Alamat"
|
"address" = "Alamat"
|
||||||
"network" = "Jaringan"
|
"network" = "Jaringan"
|
||||||
@@ -422,7 +419,6 @@
|
|||||||
"RoutingStrategy" = "Strategi Pengalihan Keseluruhan"
|
"RoutingStrategy" = "Strategi Pengalihan Keseluruhan"
|
||||||
"RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan."
|
"RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan."
|
||||||
"Torrent" = "Blokir Protokol BitTorrent"
|
"Torrent" = "Blokir Protokol BitTorrent"
|
||||||
"TorrentDesc" = "Memblokir protokol BitTorrent."
|
|
||||||
"Inbounds" = "Masuk"
|
"Inbounds" = "Masuk"
|
||||||
"InboundsDesc" = "Menerima klien tertentu."
|
"InboundsDesc" = "Menerima klien tertentu."
|
||||||
"Outbounds" = "Keluar"
|
"Outbounds" = "Keluar"
|
||||||
@@ -648,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Ya"
|
"yes" = "✅ Ya"
|
||||||
"no" = "❌ Tidak"
|
"no" = "❌ Tidak"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID diperbarui."
|
"received_id" = "🔑📥 ID diperbarui."
|
||||||
"received_password" = "🔑📥 Kata sandi diperbarui."
|
"received_password" = "🔑📥 Kata sandi diperbarui."
|
||||||
"received_email" = "📧📥 Email diperbarui."
|
"received_email" = "📧📥 Email diperbarui."
|
||||||
@@ -668,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Proses reset traffic selesai untuk semua klien."
|
"FinishProcess" = "🔚 Proses reset traffic selesai untuk semua klien."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Tutup Papan Ketik"
|
"closeKeyboard" = "❌ Tutup Papan Ketik"
|
||||||
"cancel" = "❌ Batal"
|
"cancel" = "❌ Batal"
|
||||||
@@ -702,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Batas Lalu Lintas"
|
"limitTraffic" = "🚧 Batas Lalu Lintas"
|
||||||
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
||||||
"allClients" = "Semua Klien"
|
"allClients" = "Semua Klien"
|
||||||
|
|
||||||
"addClient" = "Tambah Klien"
|
"addClient" = "Tambah Klien"
|
||||||
"submitDisable" = "Kirim Sebagai Nonaktif ☑️"
|
"submitDisable" = "Kirim Sebagai Nonaktif ☑️"
|
||||||
"submitEnable" = "Kirim Sebagai Aktif ✅"
|
"submitEnable" = "Kirim Sebagai Aktif ✅"
|
||||||
@@ -714,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Reset Semua Lalu Lintas"
|
"ResetAllTraffics" = "Reset Semua Lalu Lintas"
|
||||||
"SortedTrafficUsageReport" = "Laporan Penggunaan Lalu Lintas yang Terurut"
|
"SortedTrafficUsageReport" = "Laporan Penggunaan Lalu Lintas yang Terurut"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Operasi berhasil!"
|
"successfulOperation" = "✅ Operasi berhasil!"
|
||||||
"errorOperation" = "❗ Kesalahan dalam operasi."
|
"errorOperation" = "❗ Kesalahan dalam operasi."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "システム稼働時間"
|
"operationHours" = "システム稼働時間"
|
||||||
"systemLoad" = "システム負荷"
|
"systemLoad" = "システム負荷"
|
||||||
"systemLoadDesc" = "過去1、5、15分間のシステム平均負荷"
|
"systemLoadDesc" = "過去1、5、15分間のシステム平均負荷"
|
||||||
"connectionTcpCountDesc" = "システム内のすべてのTCP接続数"
|
|
||||||
"connectionUdpCountDesc" = "システム内のすべてのUDP接続数"
|
|
||||||
"connectionCount" = "接続数"
|
"connectionCount" = "接続数"
|
||||||
"ipAddresses" = "IPアドレス"
|
"ipAddresses" = "IPアドレス"
|
||||||
"toggleIpVisibility" = "IPの表示を切り替える"
|
"toggleIpVisibility" = "IPの表示を切り替える"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "備考"
|
"remark" = "備考"
|
||||||
"protocol" = "プロトコル"
|
"protocol" = "プロトコル"
|
||||||
"port" = "ポート"
|
"port" = "ポート"
|
||||||
|
"portMap" = "ポートマッピング"
|
||||||
"traffic" = "トラフィック"
|
"traffic" = "トラフィック"
|
||||||
"details" = "詳細情報"
|
"details" = "詳細情報"
|
||||||
"transportConfig" = "トランスポート設定"
|
"transportConfig" = "トランスポート設定"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "クライアント削除"
|
"deleteClient" = "クライアント削除"
|
||||||
"deleteClientContent" = "クライアントを削除してもよろしいですか?"
|
"deleteClientContent" = "クライアントを削除してもよろしいですか?"
|
||||||
"resetTrafficContent" = "トラフィックをリセットしてもよろしいですか?"
|
"resetTrafficContent" = "トラフィックをリセットしてもよろしいですか?"
|
||||||
"inboundUpdateSuccess" = "インバウンドが正常に更新されました。"
|
|
||||||
"inboundCreateSuccess" = "インバウンドが正常に作成されました。"
|
|
||||||
"copyLink" = "リンクをコピー"
|
"copyLink" = "リンクをコピー"
|
||||||
"address" = "アドレス"
|
"address" = "アドレス"
|
||||||
"network" = "ネットワーク"
|
"network" = "ネットワーク"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ はい"
|
"yes" = "✅ はい"
|
||||||
"no" = "❌ いいえ"
|
"no" = "❌ いいえ"
|
||||||
|
|
||||||
"received_id" = "🔑📥 IDが更新されました。"
|
"received_id" = "🔑📥 IDが更新されました。"
|
||||||
"received_password" = "🔑📥 パスワードが更新されました。"
|
"received_password" = "🔑📥 パスワードが更新されました。"
|
||||||
"received_email" = "📧📥 メールが更新されました。"
|
"received_email" = "📧📥 メールが更新されました。"
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 すべてのクライアントのトラフィックリセットが完了しました。"
|
"FinishProcess" = "🔚 すべてのクライアントのトラフィックリセットが完了しました。"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ キーボードを閉じる"
|
"closeKeyboard" = "❌ キーボードを閉じる"
|
||||||
"cancel" = "❌ キャンセル"
|
"cancel" = "❌ キャンセル"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 トラフィック制限"
|
"limitTraffic" = "🚧 トラフィック制限"
|
||||||
"getBanLogs" = "禁止ログ"
|
"getBanLogs" = "禁止ログ"
|
||||||
"allClients" = "すべてのクライアント"
|
"allClients" = "すべてのクライアント"
|
||||||
|
|
||||||
"addClient" = "クライアントを追加"
|
"addClient" = "クライアントを追加"
|
||||||
"submitDisable" = "無効として送信 ☑️"
|
"submitDisable" = "無効として送信 ☑️"
|
||||||
"submitEnable" = "有効として送信 ✅"
|
"submitEnable" = "有効として送信 ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "すべてのトラフィックをリセット"
|
"ResetAllTraffics" = "すべてのトラフィックをリセット"
|
||||||
"SortedTrafficUsageReport" = "ソートされたトラフィック使用レポート"
|
"SortedTrafficUsageReport" = "ソートされたトラフィック使用レポート"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ 成功!"
|
"successfulOperation" = "✅ 成功!"
|
||||||
"errorOperation" = "❗ 操作エラー。"
|
"errorOperation" = "❗ 操作エラー。"
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Tempo de Atividade"
|
"operationHours" = "Tempo de Atividade"
|
||||||
"systemLoad" = "Carga do Sistema"
|
"systemLoad" = "Carga do Sistema"
|
||||||
"systemLoadDesc" = "Média de carga do sistema nos últimos 1, 5 e 15 minutos"
|
"systemLoadDesc" = "Média de carga do sistema nos últimos 1, 5 e 15 minutos"
|
||||||
"connectionTcpCountDesc" = "Total de conexões TCP no sistema"
|
|
||||||
"connectionUdpCountDesc" = "Total de conexões UDP no sistema"
|
|
||||||
"connectionCount" = "Estatísticas de Conexão"
|
"connectionCount" = "Estatísticas de Conexão"
|
||||||
"ipAddresses" = "Endereços IP"
|
"ipAddresses" = "Endereços IP"
|
||||||
"toggleIpVisibility" = "Alternar visibilidade do IP"
|
"toggleIpVisibility" = "Alternar visibilidade do IP"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Observação"
|
"remark" = "Observação"
|
||||||
"protocol" = "Protocolo"
|
"protocol" = "Protocolo"
|
||||||
"port" = "Porta"
|
"port" = "Porta"
|
||||||
|
"portMap" = "Porta Mapeada"
|
||||||
"traffic" = "Tráfego"
|
"traffic" = "Tráfego"
|
||||||
"details" = "Detalhes"
|
"details" = "Detalhes"
|
||||||
"transportConfig" = "Transporte"
|
"transportConfig" = "Transporte"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Excluir Cliente"
|
"deleteClient" = "Excluir Cliente"
|
||||||
"deleteClientContent" = "Tem certeza de que deseja excluir o cliente?"
|
"deleteClientContent" = "Tem certeza de que deseja excluir o cliente?"
|
||||||
"resetTrafficContent" = "Tem certeza de que deseja redefinir o tráfego?"
|
"resetTrafficContent" = "Tem certeza de que deseja redefinir o tráfego?"
|
||||||
"inboundUpdateSuccess" = "A entrada foi atualizada com sucesso."
|
|
||||||
"inboundCreateSuccess" = "A entrada foi criada com sucesso."
|
|
||||||
"copyLink" = "Copiar URL"
|
"copyLink" = "Copiar URL"
|
||||||
"address" = "Endereço"
|
"address" = "Endereço"
|
||||||
"network" = "Rede"
|
"network" = "Rede"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Sim"
|
"yes" = "✅ Sim"
|
||||||
"no" = "❌ Não"
|
"no" = "❌ Não"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID atualizado."
|
"received_id" = "🔑📥 ID atualizado."
|
||||||
"received_password" = "🔑📥 Senha atualizada."
|
"received_password" = "🔑📥 Senha atualizada."
|
||||||
"received_email" = "📧📥 E-mail atualizado."
|
"received_email" = "📧📥 E-mail atualizado."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Processo de redefinição de tráfego concluído para todos os clientes."
|
"FinishProcess" = "🔚 Processo de redefinição de tráfego concluído para todos os clientes."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Fechar teclado"
|
"closeKeyboard" = "❌ Fechar teclado"
|
||||||
"cancel" = "❌ Cancelar"
|
"cancel" = "❌ Cancelar"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Limite de tráfego"
|
"limitTraffic" = "🚧 Limite de tráfego"
|
||||||
"getBanLogs" = "Obter logs de banimento"
|
"getBanLogs" = "Obter logs de banimento"
|
||||||
"allClients" = "Todos os clientes"
|
"allClients" = "Todos os clientes"
|
||||||
|
|
||||||
"addClient" = "Adicionar Cliente"
|
"addClient" = "Adicionar Cliente"
|
||||||
"submitDisable" = "Enviar como Desativado ☑️"
|
"submitDisable" = "Enviar como Desativado ☑️"
|
||||||
"submitEnable" = "Enviar como Ativado ✅"
|
"submitEnable" = "Enviar como Ativado ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Redefinir Todo o Tráfego"
|
"ResetAllTraffics" = "Redefinir Todo o Tráfego"
|
||||||
"SortedTrafficUsageReport" = "Relatório de Uso de Tráfego Ordenado"
|
"SortedTrafficUsageReport" = "Relatório de Uso de Tráfego Ordenado"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Operação bem-sucedida!"
|
"successfulOperation" = "✅ Operação bem-sucedida!"
|
||||||
"errorOperation" = "❗ Erro na operação."
|
"errorOperation" = "❗ Erro na operação."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Время работы системы"
|
"operationHours" = "Время работы системы"
|
||||||
"systemLoad" = "Нагрузка на систему"
|
"systemLoad" = "Нагрузка на систему"
|
||||||
"systemLoadDesc" = "Средняя загрузка системы за последние 1, 5 и 15 минут"
|
"systemLoadDesc" = "Средняя загрузка системы за последние 1, 5 и 15 минут"
|
||||||
"connectionTcpCountDesc" = "Общее количество подключений TCP по всем сетевым картам."
|
|
||||||
"connectionUdpCountDesc" = "Общее количество подключений UDP по всем сетевым картам."
|
|
||||||
"connectionCount" = "Количество соединений"
|
"connectionCount" = "Количество соединений"
|
||||||
"ipAddresses" = "IP-адреса сервера"
|
"ipAddresses" = "IP-адреса сервера"
|
||||||
"toggleIpVisibility" = "Переключить видимость IP-адресов сервера"
|
"toggleIpVisibility" = "Переключить видимость IP-адресов сервера"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Примечание"
|
"remark" = "Примечание"
|
||||||
"protocol" = "Протокол"
|
"protocol" = "Протокол"
|
||||||
"port" = "Порт"
|
"port" = "Порт"
|
||||||
|
"portMap" = "Порт-маппинг"
|
||||||
"traffic" = "Трафик"
|
"traffic" = "Трафик"
|
||||||
"details" = "Подробнее"
|
"details" = "Подробнее"
|
||||||
"transportConfig" = "Транспорт"
|
"transportConfig" = "Транспорт"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Удалить клиента"
|
"deleteClient" = "Удалить клиента"
|
||||||
"deleteClientContent" = "Вы уверены, что хотите удалить клиента?"
|
"deleteClientContent" = "Вы уверены, что хотите удалить клиента?"
|
||||||
"resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?"
|
"resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?"
|
||||||
"inboundUpdateSuccess" = "Инбаунд успешно обновлен."
|
|
||||||
"inboundCreateSuccess" = "Инбаунд успешно создан."
|
|
||||||
"copyLink" = "Копировать ссылку"
|
"copyLink" = "Копировать ссылку"
|
||||||
"address" = "Адрес"
|
"address" = "Адрес"
|
||||||
"network" = "Сеть"
|
"network" = "Сеть"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Обновлено: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Обновлено: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Да"
|
"yes" = "✅ Да"
|
||||||
"no" = "❌ Нет"
|
"no" = "❌ Нет"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID обновлён."
|
"received_id" = "🔑📥 ID обновлён."
|
||||||
"received_password" = "🔑📥 Пароль обновлён."
|
"received_password" = "🔑📥 Пароль обновлён."
|
||||||
"received_email" = "📧📥 Email обновлен."
|
"received_email" = "📧📥 Email обновлен."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Почта: {{ .ClientEmail }}\n🏁 Результат: ❌ Неудача \n\n🛠️ Ошибка: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Почта: {{ .ClientEmail }}\n🏁 Результат: ❌ Неудача \n\n🛠️ Ошибка: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Сброс трафика завершён для всех клиентов."
|
"FinishProcess" = "🔚 Сброс трафика завершён для всех клиентов."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Закрыть клавиатуру"
|
"closeKeyboard" = "❌ Закрыть клавиатуру"
|
||||||
"cancel" = "❌ Отмена"
|
"cancel" = "❌ Отмена"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Лимит трафика"
|
"limitTraffic" = "🚧 Лимит трафика"
|
||||||
"getBanLogs" = "📄 Лог банов"
|
"getBanLogs" = "📄 Лог банов"
|
||||||
"allClients" = "👥 Все клиенты"
|
"allClients" = "👥 Все клиенты"
|
||||||
|
|
||||||
"addClient" = "➕ Новый клиент"
|
"addClient" = "➕ Новый клиент"
|
||||||
"submitDisable" = "Добавить отключенным ☑️"
|
"submitDisable" = "Добавить отключенным ☑️"
|
||||||
"submitEnable" = "Добавить включенныи ✅"
|
"submitEnable" = "Добавить включенныи ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Сбросить весь трафик"
|
"ResetAllTraffics" = "Сбросить весь трафик"
|
||||||
"SortedTrafficUsageReport" = "Отсортированный отчет об использовании трафика"
|
"SortedTrafficUsageReport" = "Отсортированный отчет об использовании трафика"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Успешно!"
|
"successfulOperation" = "✅ Успешно!"
|
||||||
"errorOperation" = "❗ Ошибка в операции."
|
"errorOperation" = "❗ Ошибка в операции."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Çalışma Süresi"
|
"operationHours" = "Çalışma Süresi"
|
||||||
"systemLoad" = "Sistem Yükü"
|
"systemLoad" = "Sistem Yükü"
|
||||||
"systemLoadDesc" = "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması"
|
"systemLoadDesc" = "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması"
|
||||||
"connectionTcpCountDesc" = "Sistem genelinde toplam TCP bağlantıları"
|
|
||||||
"connectionUdpCountDesc" = "Sistem genelinde toplam UDP bağlantıları"
|
|
||||||
"connectionCount" = "Bağlantı İstatistikleri"
|
"connectionCount" = "Bağlantı İstatistikleri"
|
||||||
"ipAddresses" = "IP adresleri"
|
"ipAddresses" = "IP adresleri"
|
||||||
"toggleIpVisibility" = "IP görünürlüğünü değiştir"
|
"toggleIpVisibility" = "IP görünürlüğünü değiştir"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Açıklama"
|
"remark" = "Açıklama"
|
||||||
"protocol" = "Protokol"
|
"protocol" = "Protokol"
|
||||||
"port" = "Port"
|
"port" = "Port"
|
||||||
|
"portMap" = "Port Atama"
|
||||||
"traffic" = "Trafik"
|
"traffic" = "Trafik"
|
||||||
"details" = "Detaylar"
|
"details" = "Detaylar"
|
||||||
"transportConfig" = "Taşıma"
|
"transportConfig" = "Taşıma"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Müşteriyi Sil"
|
"deleteClient" = "Müşteriyi Sil"
|
||||||
"deleteClientContent" = "Müşteriyi silmek istediğinizden emin misiniz?"
|
"deleteClientContent" = "Müşteriyi silmek istediğinizden emin misiniz?"
|
||||||
"resetTrafficContent" = "Trafiği sıfırlamak istediğinizden emin misiniz?"
|
"resetTrafficContent" = "Trafiği sıfırlamak istediğinizden emin misiniz?"
|
||||||
"inboundUpdateSuccess" = "Gelen bağlantı başarıyla güncellendi."
|
|
||||||
"inboundCreateSuccess" = "Gelen bağlantı başarıyla oluşturuldu."
|
|
||||||
"copyLink" = "URL'yi Kopyala"
|
"copyLink" = "URL'yi Kopyala"
|
||||||
"address" = "Adres"
|
"address" = "Adres"
|
||||||
"network" = "Ağ"
|
"network" = "Ağ"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Evet"
|
"yes" = "✅ Evet"
|
||||||
"no" = "❌ Hayır"
|
"no" = "❌ Hayır"
|
||||||
|
|
||||||
"received_id" = "🔑📥 Kimlik güncellendi."
|
"received_id" = "🔑📥 Kimlik güncellendi."
|
||||||
"received_password" = "🔑📥 Şifre güncellendi."
|
"received_password" = "🔑📥 Şifre güncellendi."
|
||||||
"received_email" = "📧📥 E-posta güncellendi."
|
"received_email" = "📧📥 E-posta güncellendi."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı."
|
"FinishProcess" = "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Klavyeyi Kapat"
|
"closeKeyboard" = "❌ Klavyeyi Kapat"
|
||||||
"cancel" = "❌ İptal"
|
"cancel" = "❌ İptal"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Trafik Sınırı"
|
"limitTraffic" = "🚧 Trafik Sınırı"
|
||||||
"getBanLogs" = "Yasak Günlüklerini Al"
|
"getBanLogs" = "Yasak Günlüklerini Al"
|
||||||
"allClients" = "Tüm Müşteriler"
|
"allClients" = "Tüm Müşteriler"
|
||||||
|
|
||||||
"addClient" = "Müşteri Ekle"
|
"addClient" = "Müşteri Ekle"
|
||||||
"submitDisable" = "Devre Dışı Olarak Gönder ☑️"
|
"submitDisable" = "Devre Dışı Olarak Gönder ☑️"
|
||||||
"submitEnable" = "Etkin Olarak Gönder ✅"
|
"submitEnable" = "Etkin Olarak Gönder ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Tüm Trafikleri Sıfırla"
|
"ResetAllTraffics" = "Tüm Trafikleri Sıfırla"
|
||||||
"SortedTrafficUsageReport" = "Sıralı Trafik Kullanım Raporu"
|
"SortedTrafficUsageReport" = "Sıralı Trafik Kullanım Raporu"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ İşlem başarılı!"
|
"successfulOperation" = "✅ İşlem başarılı!"
|
||||||
"errorOperation" = "❗ İşlemde hata."
|
"errorOperation" = "❗ İşlemde hata."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Час роботи"
|
"operationHours" = "Час роботи"
|
||||||
"systemLoad" = "Завантаження системи"
|
"systemLoad" = "Завантаження системи"
|
||||||
"systemLoadDesc" = "Середнє завантаження системи за останні 1, 5 і 15 хвилин"
|
"systemLoadDesc" = "Середнє завантаження системи за останні 1, 5 і 15 хвилин"
|
||||||
"connectionTcpCountDesc" = "Загальна кількість TCP-з'єднань у системі"
|
|
||||||
"connectionUdpCountDesc" = "Загальна кількість UDP-з'єднань у системі"
|
|
||||||
"connectionCount" = "Статистика з'єднання"
|
"connectionCount" = "Статистика з'єднання"
|
||||||
"ipAddresses" = "IP-адреси"
|
"ipAddresses" = "IP-адреси"
|
||||||
"toggleIpVisibility" = "Перемкнути видимість IP"
|
"toggleIpVisibility" = "Перемкнути видимість IP"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Примітка"
|
"remark" = "Примітка"
|
||||||
"protocol" = "Протокол"
|
"protocol" = "Протокол"
|
||||||
"port" = "Порт"
|
"port" = "Порт"
|
||||||
|
"portMap" = "Порт-перехід"
|
||||||
"traffic" = "Трафік"
|
"traffic" = "Трафік"
|
||||||
"details" = "Деталі"
|
"details" = "Деталі"
|
||||||
"transportConfig" = "Транспорт"
|
"transportConfig" = "Транспорт"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Видалити клієнта"
|
"deleteClient" = "Видалити клієнта"
|
||||||
"deleteClientContent" = "Ви впевнені, що хочете видалити клієнт?"
|
"deleteClientContent" = "Ви впевнені, що хочете видалити клієнт?"
|
||||||
"resetTrafficContent" = "Ви впевнені, що хочете скинути трафік?"
|
"resetTrafficContent" = "Ви впевнені, що хочете скинути трафік?"
|
||||||
"inboundUpdateSuccess" = "Вхідне підключення успішно оновлено."
|
|
||||||
"inboundCreateSuccess" = "Вхідне підключення успішно створено."
|
|
||||||
"copyLink" = "Копіювати URL"
|
"copyLink" = "Копіювати URL"
|
||||||
"address" = "Адреса"
|
"address" = "Адреса"
|
||||||
"network" = "Мережа"
|
"network" = "Мережа"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Оновлено: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Оновлено: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Так"
|
"yes" = "✅ Так"
|
||||||
"no" = "❌ Ні"
|
"no" = "❌ Ні"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID оновлено."
|
"received_id" = "🔑📥 ID оновлено."
|
||||||
"received_password" = "🔑📥 Пароль оновлено."
|
"received_password" = "🔑📥 Пароль оновлено."
|
||||||
"received_email" = "📧📥 Електронна пошта оновлена."
|
"received_email" = "📧📥 Електронна пошта оновлена."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ❌ Невдача \n\n🛠️ Помилка: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ❌ Невдача \n\n🛠️ Помилка: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Процес скидання трафіку завершено для всіх клієнтів."
|
"FinishProcess" = "🔚 Процес скидання трафіку завершено для всіх клієнтів."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Закрити клавіатуру"
|
"closeKeyboard" = "❌ Закрити клавіатуру"
|
||||||
"cancel" = "❌ Скасувати"
|
"cancel" = "❌ Скасувати"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Ліміт трафіку"
|
"limitTraffic" = "🚧 Ліміт трафіку"
|
||||||
"getBanLogs" = "Отримати журнали заборон"
|
"getBanLogs" = "Отримати журнали заборон"
|
||||||
"allClients" = "Всі Клієнти"
|
"allClients" = "Всі Клієнти"
|
||||||
|
|
||||||
"addClient" = "Додати клієнта"
|
"addClient" = "Додати клієнта"
|
||||||
"submitDisable" = "Надіслати як вимкнено ☑️"
|
"submitDisable" = "Надіслати як вимкнено ☑️"
|
||||||
"submitEnable" = "Надіслати як увімкнено ✅"
|
"submitEnable" = "Надіслати як увімкнено ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Скинути весь трафік"
|
"ResetAllTraffics" = "Скинути весь трафік"
|
||||||
"SortedTrafficUsageReport" = "Відсортований звіт про використання трафіку"
|
"SortedTrafficUsageReport" = "Відсортований звіт про використання трафіку"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Операція успішна!"
|
"successfulOperation" = "✅ Операція успішна!"
|
||||||
"errorOperation" = "❗ Помилка в роботі."
|
"errorOperation" = "❗ Помилка в роботі."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "Thời gian hoạt động"
|
"operationHours" = "Thời gian hoạt động"
|
||||||
"systemLoad" = "Tải hệ thống"
|
"systemLoad" = "Tải hệ thống"
|
||||||
"systemLoadDesc" = "trung bình tải hệ thống trong 1, 5 và 15 phút qua"
|
"systemLoadDesc" = "trung bình tải hệ thống trong 1, 5 và 15 phút qua"
|
||||||
"connectionTcpCountDesc" = "Tổng số kết nối TCP trên tất cả các thẻ mạng."
|
|
||||||
"connectionUdpCountDesc" = "Tổng số kết nối UDP trên tất cả các thẻ mạng."
|
|
||||||
"connectionCount" = "Số lượng kết nối"
|
"connectionCount" = "Số lượng kết nối"
|
||||||
"ipAddresses" = "Địa chỉ IP"
|
"ipAddresses" = "Địa chỉ IP"
|
||||||
"toggleIpVisibility" = "Chuyển đổi hiển thị IP"
|
"toggleIpVisibility" = "Chuyển đổi hiển thị IP"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "Chú thích"
|
"remark" = "Chú thích"
|
||||||
"protocol" = "Giao thức"
|
"protocol" = "Giao thức"
|
||||||
"port" = "Cổng"
|
"port" = "Cổng"
|
||||||
|
"portMap" = "Cổng tạo"
|
||||||
"traffic" = "Lưu lượng"
|
"traffic" = "Lưu lượng"
|
||||||
"details" = "Chi tiết"
|
"details" = "Chi tiết"
|
||||||
"transportConfig" = "Giao vận"
|
"transportConfig" = "Giao vận"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "Xóa người dùng"
|
"deleteClient" = "Xóa người dùng"
|
||||||
"deleteClientContent" = "Bạn có chắc chắn muốn xóa người dùng không?"
|
"deleteClientContent" = "Bạn có chắc chắn muốn xóa người dùng không?"
|
||||||
"resetTrafficContent" = "Xác nhận đặt lại lưu lượng?"
|
"resetTrafficContent" = "Xác nhận đặt lại lưu lượng?"
|
||||||
"inboundUpdateSuccess" = "Đã cập nhật kết nối inbound thành công."
|
|
||||||
"inboundCreateSuccess" = "Đã tạo kết nối inbound thành công."
|
|
||||||
"copyLink" = "Sao chép liên kết"
|
"copyLink" = "Sao chép liên kết"
|
||||||
"address" = "Địa chỉ"
|
"address" = "Địa chỉ"
|
||||||
"network" = "Mạng"
|
"network" = "Mạng"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 Đã cập nhật lần cuối vào: {{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 Đã cập nhật lần cuối vào: {{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ Có"
|
"yes" = "✅ Có"
|
||||||
"no" = "❌ Không"
|
"no" = "❌ Không"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID đã được cập nhật."
|
"received_id" = "🔑📥 ID đã được cập nhật."
|
||||||
"received_password" = "🔑📥 Mật khẩu đã được cập nhật."
|
"received_password" = "🔑📥 Mật khẩu đã được cập nhật."
|
||||||
"received_email" = "📧📥 Email đã được cập nhật."
|
"received_email" = "📧📥 Email đã được cập nhật."
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Kết quả: ❌ Thất bại \n\n🛠️ Lỗi: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Kết quả: ❌ Thất bại \n\n🛠️ Lỗi: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 Quá trình đặt lại lưu lượng đã hoàn tất cho tất cả khách hàng."
|
"FinishProcess" = "🔚 Quá trình đặt lại lưu lượng đã hoàn tất cho tất cả khách hàng."
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Đóng Bàn Phím"
|
"closeKeyboard" = "❌ Đóng Bàn Phím"
|
||||||
"cancel" = "❌ Hủy"
|
"cancel" = "❌ Hủy"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 Giới hạn lưu lượng"
|
"limitTraffic" = "🚧 Giới hạn lưu lượng"
|
||||||
"getBanLogs" = "Cấm nhật ký"
|
"getBanLogs" = "Cấm nhật ký"
|
||||||
"allClients" = "Tất cả Khách hàng"
|
"allClients" = "Tất cả Khách hàng"
|
||||||
|
|
||||||
"addClient" = "Thêm Khách Hàng"
|
"addClient" = "Thêm Khách Hàng"
|
||||||
"submitDisable" = "Gửi Dưới Dạng Vô Hiệu ☑️"
|
"submitDisable" = "Gửi Dưới Dạng Vô Hiệu ☑️"
|
||||||
"submitEnable" = "Gửi Dưới Dạng Kích Hoạt ✅"
|
"submitEnable" = "Gửi Dưới Dạng Kích Hoạt ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "Đặt lại tất cả lưu lượng"
|
"ResetAllTraffics" = "Đặt lại tất cả lưu lượng"
|
||||||
"SortedTrafficUsageReport" = "Báo cáo sử dụng lưu lượng đã sắp xếp"
|
"SortedTrafficUsageReport" = "Báo cáo sử dụng lưu lượng đã sắp xếp"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Thành công!"
|
"successfulOperation" = "✅ Thành công!"
|
||||||
"errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện."
|
"errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện."
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "系统正常运行时间"
|
"operationHours" = "系统正常运行时间"
|
||||||
"systemLoad" = "系统负载"
|
"systemLoad" = "系统负载"
|
||||||
"systemLoadDesc" = "过去 1、5 和 15 分钟的系统平均负载"
|
"systemLoadDesc" = "过去 1、5 和 15 分钟的系统平均负载"
|
||||||
"connectionTcpCountDesc" = "系统中所有 TCP 连接数"
|
|
||||||
"connectionUdpCountDesc" = "系统中所有 UDP 连接数"
|
|
||||||
"connectionCount" = "连接数"
|
"connectionCount" = "连接数"
|
||||||
"ipAddresses" = "IP地址"
|
"ipAddresses" = "IP地址"
|
||||||
"toggleIpVisibility" = "切换IP可见性"
|
"toggleIpVisibility" = "切换IP可见性"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "备注"
|
"remark" = "备注"
|
||||||
"protocol" = "协议"
|
"protocol" = "协议"
|
||||||
"port" = "端口"
|
"port" = "端口"
|
||||||
|
"portMap" = "端口映射"
|
||||||
"traffic" = "流量"
|
"traffic" = "流量"
|
||||||
"details" = "详细信息"
|
"details" = "详细信息"
|
||||||
"transportConfig" = "传输配置"
|
"transportConfig" = "传输配置"
|
||||||
@@ -175,8 +174,6 @@
|
|||||||
"deleteClient" = "删除客户端"
|
"deleteClient" = "删除客户端"
|
||||||
"deleteClientContent" = "确定要删除客户端吗?"
|
"deleteClientContent" = "确定要删除客户端吗?"
|
||||||
"resetTrafficContent" = "确定要重置流量吗?"
|
"resetTrafficContent" = "确定要重置流量吗?"
|
||||||
"inboundUpdateSuccess" = "入站连接已成功更新。"
|
|
||||||
"inboundCreateSuccess" = "入站连接已成功创建。"
|
|
||||||
"copyLink" = "复制链接"
|
"copyLink" = "复制链接"
|
||||||
"address" = "地址"
|
"address" = "地址"
|
||||||
"network" = "网络"
|
"network" = "网络"
|
||||||
@@ -647,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 刷新时间:{{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 刷新时间:{{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ 是的"
|
"yes" = "✅ 是的"
|
||||||
"no" = "❌ 没有"
|
"no" = "❌ 没有"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID 已更新。"
|
"received_id" = "🔑📥 ID 已更新。"
|
||||||
"received_password" = "🔑📥 密码已更新。"
|
"received_password" = "🔑📥 密码已更新。"
|
||||||
"received_email" = "📧📥 邮箱已更新。"
|
"received_email" = "📧📥 邮箱已更新。"
|
||||||
@@ -667,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 邮箱: {{ .ClientEmail }}\n🏁 结果: ❌ 失败 \n\n🛠️ 错误: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 邮箱: {{ .ClientEmail }}\n🏁 结果: ❌ 失败 \n\n🛠️ 错误: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 所有客户的流量重置已完成。"
|
"FinishProcess" = "🔚 所有客户的流量重置已完成。"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ 关闭键盘"
|
"closeKeyboard" = "❌ 关闭键盘"
|
||||||
"cancel" = "❌ 取消"
|
"cancel" = "❌ 取消"
|
||||||
@@ -701,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 流量限制"
|
"limitTraffic" = "🚧 流量限制"
|
||||||
"getBanLogs" = "禁止日志"
|
"getBanLogs" = "禁止日志"
|
||||||
"allClients" = "所有客户"
|
"allClients" = "所有客户"
|
||||||
|
|
||||||
"addClient" = "添加客户"
|
"addClient" = "添加客户"
|
||||||
"submitDisable" = "提交为禁用 ☑️"
|
"submitDisable" = "提交为禁用 ☑️"
|
||||||
"submitEnable" = "提交为启用 ✅"
|
"submitEnable" = "提交为启用 ✅"
|
||||||
@@ -713,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "重置所有流量"
|
"ResetAllTraffics" = "重置所有流量"
|
||||||
"SortedTrafficUsageReport" = "排序的流量使用报告"
|
"SortedTrafficUsageReport" = "排序的流量使用报告"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ 成功!"
|
"successfulOperation" = "✅ 成功!"
|
||||||
"errorOperation" = "❗ 操作错误。"
|
"errorOperation" = "❗ 操作错误。"
|
||||||
|
|||||||
@@ -117,8 +117,6 @@
|
|||||||
"operationHours" = "系統正常執行時間"
|
"operationHours" = "系統正常執行時間"
|
||||||
"systemLoad" = "系統負載"
|
"systemLoad" = "系統負載"
|
||||||
"systemLoadDesc" = "過去 1、5 和 15 分鐘的系統平均負載"
|
"systemLoadDesc" = "過去 1、5 和 15 分鐘的系統平均負載"
|
||||||
"connectionTcpCountDesc" = "系統中所有 TCP 連線數"
|
|
||||||
"connectionUdpCountDesc" = "系統中所有 UDP 連線數"
|
|
||||||
"connectionCount" = "連線數"
|
"connectionCount" = "連線數"
|
||||||
"ipAddresses" = "IP地址"
|
"ipAddresses" = "IP地址"
|
||||||
"toggleIpVisibility" = "切換IP可見性"
|
"toggleIpVisibility" = "切換IP可見性"
|
||||||
@@ -160,6 +158,7 @@
|
|||||||
"remark" = "備註"
|
"remark" = "備註"
|
||||||
"protocol" = "協議"
|
"protocol" = "協議"
|
||||||
"port" = "埠"
|
"port" = "埠"
|
||||||
|
"portMap" = "埠映射"
|
||||||
"traffic" = "流量"
|
"traffic" = "流量"
|
||||||
"details" = "詳細資訊"
|
"details" = "詳細資訊"
|
||||||
"transportConfig" = "傳輸配置"
|
"transportConfig" = "傳輸配置"
|
||||||
@@ -169,16 +168,12 @@
|
|||||||
"generalActions" = "通用操作"
|
"generalActions" = "通用操作"
|
||||||
"autoRefresh" = "自動刷新"
|
"autoRefresh" = "自動刷新"
|
||||||
"autoRefreshInterval" = "間隔"
|
"autoRefreshInterval" = "間隔"
|
||||||
"create" = "新增"
|
|
||||||
"update" = "修改"
|
|
||||||
"modifyInbound" = "修改入站"
|
"modifyInbound" = "修改入站"
|
||||||
"deleteInbound" = "刪除入站"
|
"deleteInbound" = "刪除入站"
|
||||||
"deleteInboundContent" = "確定要刪除入站嗎?"
|
"deleteInboundContent" = "確定要刪除入站嗎?"
|
||||||
"deleteClient" = "刪除客戶端"
|
"deleteClient" = "刪除客戶端"
|
||||||
"deleteClientContent" = "確定要刪除客戶端嗎?"
|
"deleteClientContent" = "確定要刪除客戶端嗎?"
|
||||||
"resetTrafficContent" = "確定要重置流量嗎?"
|
"resetTrafficContent" = "確定要重置流量嗎?"
|
||||||
"inboundUpdateSuccess" = "入站連接已成功更新。"
|
|
||||||
"inboundCreateSuccess" = "入站連接已成功建立。"
|
|
||||||
"copyLink" = "複製連結"
|
"copyLink" = "複製連結"
|
||||||
"address" = "地址"
|
"address" = "地址"
|
||||||
"network" = "網路"
|
"network" = "網路"
|
||||||
@@ -649,7 +644,6 @@
|
|||||||
"refreshedOn" = "\r\n📋🔄 重新整理時間:{{ .Time }}\r\n\r\n"
|
"refreshedOn" = "\r\n📋🔄 重新整理時間:{{ .Time }}\r\n\r\n"
|
||||||
"yes" = "✅ 是的"
|
"yes" = "✅ 是的"
|
||||||
"no" = "❌ 沒有"
|
"no" = "❌ 沒有"
|
||||||
|
|
||||||
"received_id" = "🔑📥 ID 已更新。"
|
"received_id" = "🔑📥 ID 已更新。"
|
||||||
"received_password" = "🔑📥 密碼已更新。"
|
"received_password" = "🔑📥 密碼已更新。"
|
||||||
"received_email" = "📧📥 電子郵件已更新。"
|
"received_email" = "📧📥 電子郵件已更新。"
|
||||||
@@ -669,7 +663,6 @@
|
|||||||
"FailedResetTraffic" = "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ 錯誤: [ {{ .ErrorMessage }} ]"
|
"FailedResetTraffic" = "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ 錯誤: [ {{ .ErrorMessage }} ]"
|
||||||
"FinishProcess" = "🔚 所有客戶的流量重置已完成。"
|
"FinishProcess" = "🔚 所有客戶的流量重置已完成。"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ 關閉鍵盤"
|
"closeKeyboard" = "❌ 關閉鍵盤"
|
||||||
"cancel" = "❌ 取消"
|
"cancel" = "❌ 取消"
|
||||||
@@ -703,7 +696,6 @@
|
|||||||
"limitTraffic" = "🚧 流量限制"
|
"limitTraffic" = "🚧 流量限制"
|
||||||
"getBanLogs" = "禁止日誌"
|
"getBanLogs" = "禁止日誌"
|
||||||
"allClients" = "所有客戶"
|
"allClients" = "所有客戶"
|
||||||
|
|
||||||
"addClient" = "新增客戶"
|
"addClient" = "新增客戶"
|
||||||
"submitDisable" = "以停用方式送出 ☑️"
|
"submitDisable" = "以停用方式送出 ☑️"
|
||||||
"submitEnable" = "以啟用方式送出 ✅"
|
"submitEnable" = "以啟用方式送出 ✅"
|
||||||
@@ -715,7 +707,6 @@
|
|||||||
"ResetAllTraffics" = "重設所有流量"
|
"ResetAllTraffics" = "重設所有流量"
|
||||||
"SortedTrafficUsageReport" = "排序過的流量使用報告"
|
"SortedTrafficUsageReport" = "排序過的流量使用報告"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ 成功!"
|
"successfulOperation" = "✅ 成功!"
|
||||||
"errorOperation" = "❗ 操作錯誤。"
|
"errorOperation" = "❗ 操作錯誤。"
|
||||||
|
|||||||
@@ -239,7 +239,12 @@ func (p *process) Stop() error {
|
|||||||
if !p.IsRunning() {
|
if !p.IsRunning() {
|
||||||
return errors.New("xray is not running")
|
return errors.New("xray is not running")
|
||||||
}
|
}
|
||||||
return p.cmd.Process.Signal(syscall.SIGTERM)
|
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
return p.cmd.Process.Kill()
|
||||||
|
} else {
|
||||||
|
return p.cmd.Process.Signal(syscall.SIGTERM)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeCrashReport(m []byte) error {
|
func writeCrashReport(m []byte) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user