mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-11 12:46:19 +00:00
Merge branch 'main' of https://github.com/MHSanaei/3x-ui into MHSanaei-main
This commit is contained in:
commit
0155ea5d12
26 changed files with 573 additions and 1069 deletions
5
.github/workflows/docker.yml
vendored
5
.github/workflows/docker.yml
vendored
|
@ -1,9 +1,10 @@
|
||||||
name: Release 3X-UI for Docker
|
name: Release 3X-UI for Docker
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- "*"
|
- "v*.*.*"
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_and_push:
|
build_and_push:
|
||||||
|
|
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
|
@ -1,10 +1,10 @@
|
||||||
name: Release 3X-UI
|
name: Release 3X-UI
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- "*"
|
- "v*.*.*"
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|
|
@ -218,6 +218,7 @@ location /sub {
|
||||||
- Ubuntu 20.04+
|
- Ubuntu 20.04+
|
||||||
- Debian 11+
|
- Debian 11+
|
||||||
- CentOS 8+
|
- CentOS 8+
|
||||||
|
- OpenEuler 22.03+
|
||||||
- Fedora 36+
|
- Fedora 36+
|
||||||
- Arch Linux
|
- Arch Linux
|
||||||
- Parch Linux
|
- Parch Linux
|
||||||
|
@ -451,6 +452,7 @@ Ingresa el ID de chat de usuario en el campo de entrada número 4. Las cuentas d
|
||||||
|
|
||||||
#### Uso
|
#### Uso
|
||||||
|
|
||||||
|
- [Documentación de API](https://documenter.getpostman.com/view/5146551/2sAXxP8Y12)
|
||||||
- `/login` con `POST` datos de usuario: `{username: '', password: ''}` para iniciar sesión
|
- `/login` con `POST` datos de usuario: `{username: '', password: ''}` para iniciar sesión
|
||||||
- `/panel/api/inbounds` base para las siguientes acciones:
|
- `/panel/api/inbounds` base para las siguientes acciones:
|
||||||
|
|
||||||
|
@ -480,9 +482,7 @@ Ingresa el ID de chat de usuario en el campo de entrada número 4. Las cuentas d
|
||||||
- `client.password` para TROJAN
|
- `client.password` para TROJAN
|
||||||
- `client.email` para Shadowsocks
|
- `client.email` para Shadowsocks
|
||||||
|
|
||||||
|
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://god.gw.postman.com/run-collection/5146551-e6aac565-e0e2-46df-acff-2607a51bbd04?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D5146551-e6aac565-e0e2-46df-acff-2607a51bbd04%26entityType%3Dcollection%26workspaceId%3Dd64f609f-485a-4951-9b8f-876b3f917124)
|
||||||
- [Documentación de API](https://documenter.getpostman.com/view/16802678/2s9YkgD5jm)
|
|
||||||
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://app.getpostman.com/run-collection/16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415%26entityType%3Dcollection%26workspaceId%3D2cd38c01-c851-4a15-a972-f181c23359d9)
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Variables de Entorno
|
## Variables de Entorno
|
||||||
|
|
13
README.md
13
README.md
|
@ -32,10 +32,10 @@ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.
|
||||||
|
|
||||||
## Install Custom Version
|
## Install Custom Version
|
||||||
|
|
||||||
To install your desired version, add the version to the end of the installation command. e.g., ver `v2.4.3`:
|
To install your desired version, add the version to the end of the installation command. e.g., ver `v2.4.4`:
|
||||||
|
|
||||||
```
|
```
|
||||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.4.3
|
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.4.4
|
||||||
```
|
```
|
||||||
|
|
||||||
## SSL Certificate
|
## SSL Certificate
|
||||||
|
@ -245,6 +245,7 @@ location /sub {
|
||||||
- Ubuntu 20.04+
|
- Ubuntu 20.04+
|
||||||
- Debian 11+
|
- Debian 11+
|
||||||
- CentOS 8+
|
- CentOS 8+
|
||||||
|
- OpenEuler 22.03+
|
||||||
- Fedora 36+
|
- Fedora 36+
|
||||||
- Arch Linux
|
- Arch Linux
|
||||||
- Parch Linux
|
- Parch Linux
|
||||||
|
@ -282,7 +283,8 @@ Our platform offers compatibility with a diverse range of architectures and devi
|
||||||
|
|
||||||
- English
|
- English
|
||||||
- Farsi
|
- Farsi
|
||||||
- Chinese
|
- Traditional Chinese
|
||||||
|
- Simplified Chinese
|
||||||
- Russian
|
- Russian
|
||||||
- Vietnamese
|
- Vietnamese
|
||||||
- Spanish
|
- Spanish
|
||||||
|
@ -483,6 +485,7 @@ Enter the user ID in input field number 4. The Telegram accounts with this id wi
|
||||||
|
|
||||||
#### Usage
|
#### Usage
|
||||||
|
|
||||||
|
- [API Documentation](https://documenter.getpostman.com/view/5146551/2sAXxP8Y12)
|
||||||
- `/login` with `POST` user data: `{username: '', password: ''}` for login
|
- `/login` with `POST` user data: `{username: '', password: ''}` for login
|
||||||
- `/panel/api/inbounds` base for following actions:
|
- `/panel/api/inbounds` base for following actions:
|
||||||
|
|
||||||
|
@ -513,9 +516,7 @@ Enter the user ID in input field number 4. The Telegram accounts with this id wi
|
||||||
- `client.password` for TROJAN
|
- `client.password` for TROJAN
|
||||||
- `client.email` for Shadowsocks
|
- `client.email` for Shadowsocks
|
||||||
|
|
||||||
|
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://god.gw.postman.com/run-collection/5146551-e6aac565-e0e2-46df-acff-2607a51bbd04?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D5146551-e6aac565-e0e2-46df-acff-2607a51bbd04%26entityType%3Dcollection%26workspaceId%3Dd64f609f-485a-4951-9b8f-876b3f917124)
|
||||||
- [API Documentation](https://documenter.getpostman.com/view/16802678/2s9YkgD5jm)
|
|
||||||
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://app.getpostman.com/run-collection/16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415%26entityType%3Dcollection%26workspaceId%3D2cd38c01-c851-4a15-a972-f181c23359d9)
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Environment Variables
|
## Environment Variables
|
||||||
|
|
|
@ -244,6 +244,7 @@ location /sub {
|
||||||
- Ubuntu 20.04+
|
- Ubuntu 20.04+
|
||||||
- Debian 11+
|
- Debian 11+
|
||||||
- CentOS 8+
|
- CentOS 8+
|
||||||
|
- OpenEuler 22.03+
|
||||||
- Fedora 36+
|
- Fedora 36+
|
||||||
- Arch Linux
|
- Arch Linux
|
||||||
- Parch Linux
|
- Parch Linux
|
||||||
|
@ -478,6 +479,7 @@ WARP встроен, и дополнительная установка не т
|
||||||
|
|
||||||
#### Использование
|
#### Использование
|
||||||
|
|
||||||
|
- [API документация](https://documenter.getpostman.com/view/5146551/2sAXxP8Y12)
|
||||||
- `/login` с `POST`-данными: `{username: '', password: ''}` для входа
|
- `/login` с `POST`-данными: `{username: '', password: ''}` для входа
|
||||||
- `/panel/api/inbounds` это базовый путь для следующих действий:
|
- `/panel/api/inbounds` это базовый путь для следующих действий:
|
||||||
|
|
||||||
|
@ -511,8 +513,7 @@ WARP встроен, и дополнительная установка не т
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
- [API-документация](https://documenter.getpostman.com/view/16802678/2s9YkgD5jm)
|
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://god.gw.postman.com/run-collection/5146551-e6aac565-e0e2-46df-acff-2607a51bbd04?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D5146551-e6aac565-e0e2-46df-acff-2607a51bbd04%26entityType%3Dcollection%26workspaceId%3Dd64f609f-485a-4951-9b8f-876b3f917124)
|
||||||
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://app.getpostman.com/run-collection/16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415%26entityType%3Dcollection%26workspaceId%3D2cd38c01-c851-4a15-a972-f181c23359d9)
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Переменные среды
|
## Переменные среды
|
||||||
|
|
|
@ -241,6 +241,7 @@ location /sub {
|
||||||
- Ubuntu 20.04+
|
- Ubuntu 20.04+
|
||||||
- Debian 11+
|
- Debian 11+
|
||||||
- CentOS 8+
|
- CentOS 8+
|
||||||
|
- OpenEuler 22.03+
|
||||||
- Fedora 36+
|
- Fedora 36+
|
||||||
- Arch Linux
|
- Arch Linux
|
||||||
- Parch Linux
|
- Parch Linux
|
||||||
|
@ -473,6 +474,7 @@ Web 面板通过 Telegram Bot 支持每日流量、面板登录、数据库备
|
||||||
|
|
||||||
#### 使用
|
#### 使用
|
||||||
|
|
||||||
|
- [API 文档](https://documenter.getpostman.com/view/5146551/2sAXxP8Y12)
|
||||||
- `/login` 使用 `POST` 用户名称 & 密码: `{username: '', password: ''}` 登录
|
- `/login` 使用 `POST` 用户名称 & 密码: `{username: '', password: ''}` 登录
|
||||||
- `/panel/api/inbounds` 以下操作的基础:
|
- `/panel/api/inbounds` 以下操作的基础:
|
||||||
|
|
||||||
|
@ -502,9 +504,7 @@ Web 面板通过 Telegram Bot 支持每日流量、面板登录、数据库备
|
||||||
- `client.password` TROJAN
|
- `client.password` TROJAN
|
||||||
- `client.email` Shadowsocks
|
- `client.email` Shadowsocks
|
||||||
|
|
||||||
|
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://god.gw.postman.com/run-collection/5146551-e6aac565-e0e2-46df-acff-2607a51bbd04?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D5146551-e6aac565-e0e2-46df-acff-2607a51bbd04%26entityType%3Dcollection%26workspaceId%3Dd64f609f-485a-4951-9b8f-876b3f917124)
|
||||||
- [API 文档](https://documenter.getpostman.com/view/16802678/2s9YkgD5jm)
|
|
||||||
- [<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://app.getpostman.com/run-collection/16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415%26entityType%3Dcollection%26workspaceId%3D2cd38c01-c851-4a15-a972-f181c23359d9)
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 环境变量
|
## 环境变量
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2.4.3
|
2.4.4
|
38
go.mod
38
go.mod
|
@ -1,6 +1,6 @@
|
||||||
module x-ui
|
module x-ui
|
||||||
|
|
||||||
go 1.23.1
|
go 1.23.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gin-contrib/gzip v1.0.1
|
github.com/gin-contrib/gzip v1.0.1
|
||||||
|
@ -14,19 +14,19 @@ require (
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/shirou/gopsutil/v4 v4.24.9
|
github.com/shirou/gopsutil/v4 v4.24.9
|
||||||
github.com/valyala/fasthttp v1.56.0
|
github.com/valyala/fasthttp v1.56.0
|
||||||
github.com/xtls/xray-core v1.8.25-0.20241002041629-e45cef542e26
|
github.com/xtls/xray-core v1.8.25-0.20241005021528-c30f5d47964b
|
||||||
go.uber.org/atomic v1.11.0
|
go.uber.org/atomic v1.11.0
|
||||||
golang.org/x/text v0.18.0
|
golang.org/x/text v0.19.0
|
||||||
google.golang.org/grpc v1.67.1
|
google.golang.org/grpc v1.67.1
|
||||||
gorm.io/driver/sqlite v1.5.6
|
gorm.io/driver/sqlite v1.5.6
|
||||||
gorm.io/gorm v1.25.12
|
gorm.io/gorm v1.25.12
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
github.com/andybalholm/brotli v1.1.1 // indirect
|
||||||
github.com/bytedance/sonic v1.12.3 // indirect
|
github.com/bytedance/sonic v1.12.3 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.2.0 // indirect
|
github.com/bytedance/sonic/loader v0.2.0 // indirect
|
||||||
github.com/cloudflare/circl v1.4.0 // indirect
|
github.com/cloudflare/circl v1.5.0 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||||
github.com/cloudwego/iasm v0.2.0 // indirect
|
github.com/cloudwego/iasm v0.2.0 // indirect
|
||||||
github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 // indirect
|
github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 // indirect
|
||||||
|
@ -40,7 +40,7 @@ require (
|
||||||
github.com/go-playground/validator/v10 v10.22.1 // indirect
|
github.com/go-playground/validator/v10 v10.22.1 // indirect
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||||
github.com/google/btree v1.1.3 // indirect
|
github.com/google/btree v1.1.3 // indirect
|
||||||
github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d // indirect
|
github.com/google/pprof v0.0.0-20241009165004-a3522334989c // indirect
|
||||||
github.com/gorilla/context v1.1.2 // indirect
|
github.com/gorilla/context v1.1.2 // indirect
|
||||||
github.com/gorilla/securecookie v1.1.2 // indirect
|
github.com/gorilla/securecookie v1.1.2 // indirect
|
||||||
github.com/gorilla/sessions v1.4.0 // indirect
|
github.com/gorilla/sessions v1.4.0 // indirect
|
||||||
|
@ -51,15 +51,15 @@ require (
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/klauspost/compress v1.17.10 // indirect
|
github.com/klauspost/compress v1.17.10 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
||||||
github.com/kr/text v0.1.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-20240909124753-873cd0166683 // indirect
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // 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.23 // indirect
|
github.com/mattn/go-sqlite3 v1.14.24 // 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/onsi/ginkgo/v2 v2.20.2 // indirect
|
github.com/onsi/ginkgo/v2 v2.20.2 // indirect
|
||||||
github.com/pires/go-proxyproto v0.7.0 // indirect
|
github.com/pires/go-proxyproto v0.8.0 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||||
github.com/quic-go/qpack v0.5.1 // indirect
|
github.com/quic-go/qpack v0.5.1 // indirect
|
||||||
github.com/quic-go/quic-go v0.47.0 // indirect
|
github.com/quic-go/quic-go v0.47.0 // indirect
|
||||||
|
@ -71,7 +71,7 @@ require (
|
||||||
github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect
|
github.com/savsgio/gotils v0.0.0-20240704082632-aef3928b8a38 // indirect
|
||||||
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 // indirect
|
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 // indirect
|
||||||
github.com/tklauser/go-sysconf v0.3.14 // indirect
|
github.com/tklauser/go-sysconf v0.3.14 // indirect
|
||||||
github.com/tklauser/numcpus v0.8.0 // indirect
|
github.com/tklauser/numcpus v0.9.0 // indirect
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||||
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e // indirect
|
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e // indirect
|
||||||
|
@ -83,19 +83,19 @@ require (
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
go.uber.org/mock v0.4.0 // indirect
|
go.uber.org/mock v0.4.0 // indirect
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
||||||
golang.org/x/arch v0.10.0 // indirect
|
golang.org/x/arch v0.11.0 // indirect
|
||||||
golang.org/x/crypto v0.27.0 // indirect
|
golang.org/x/crypto v0.28.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
|
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
golang.org/x/mod v0.21.0 // indirect
|
||||||
golang.org/x/net v0.29.0 // indirect
|
golang.org/x/net v0.30.0 // indirect
|
||||||
golang.org/x/sync v0.8.0 // indirect
|
golang.org/x/sync v0.8.0 // indirect
|
||||||
golang.org/x/sys v0.25.0 // indirect
|
golang.org/x/sys v0.26.0 // indirect
|
||||||
golang.org/x/time v0.6.0 // indirect
|
golang.org/x/time v0.7.0 // indirect
|
||||||
golang.org/x/tools v0.25.0 // indirect
|
golang.org/x/tools v0.26.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-20240826202546-f6391c0de4c7 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.35.1 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gvisor.dev/gvisor v0.0.0-20231202080848-1f7806d17489 // indirect
|
gvisor.dev/gvisor v0.0.0-20231202080848-1f7806d17489 // indirect
|
||||||
lukechampine.com/blake3 v1.3.0 // indirect
|
lukechampine.com/blake3 v1.3.0 // indirect
|
||||||
|
|
76
go.sum
76
go.sum
|
@ -2,19 +2,20 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8
|
||||||
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||||
github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0 h1:Wo41lDOevRJSGpevP+8Pk5bANX7fJacO2w04aqLiC5I=
|
github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0 h1:Wo41lDOevRJSGpevP+8Pk5bANX7fJacO2w04aqLiC5I=
|
||||||
github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0/go.mod h1:FVGavL/QEBQDcBpr3fAojoK17xX5k9bicBphrOpP7uM=
|
github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0/go.mod h1:FVGavL/QEBQDcBpr3fAojoK17xX5k9bicBphrOpP7uM=
|
||||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
||||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
||||||
github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU=
|
github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU=
|
||||||
github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
|
github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
|
||||||
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.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
|
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
|
||||||
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||||
github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY=
|
github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
|
||||||
github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
|
github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||||
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
|
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
|
||||||
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
||||||
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
|
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
|
||||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
@ -63,8 +64,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d h1:Jaz2JzpQaQXyET0AjLBXShrthbpqMkhGiEfkcQAiAUs=
|
github.com/google/pprof v0.0.0-20241009165004-a3522334989c h1:NDovD0SMpBYXlE1zJmS1q55vWB/fUQBcPAqAboZSccA=
|
||||||
github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
github.com/google/pprof v0.0.0-20241009165004-a3522334989c/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||||
github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=
|
github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=
|
||||||
github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=
|
github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=
|
||||||
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
|
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
|
||||||
|
@ -89,17 +90,16 @@ github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZY
|
||||||
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=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
||||||
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.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0=
|
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
||||||
github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
|
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
|
||||||
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
|
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
|
||||||
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=
|
||||||
|
@ -121,8 +121,8 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v
|
||||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||||
github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs=
|
github.com/pires/go-proxyproto v0.8.0 h1:5unRmEAPbHXHuLjDg01CxJWf91cw3lKHc/0xzKpXEe0=
|
||||||
github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4=
|
github.com/pires/go-proxyproto v0.8.0/go.mod h1:iknsfgnH8EkjrMeMyvfKByp9TiBZCKZM0jx2xmKqnVY=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
||||||
|
@ -162,8 +162,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
||||||
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
||||||
github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
|
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
|
||||||
github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
|
github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
||||||
|
@ -182,8 +182,10 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y
|
||||||
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||||
github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463 h1:g1Cj7d+my6k/HHxLAyxPwyX8i7FGRr6ulBDMkBzg2BM=
|
github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463 h1:g1Cj7d+my6k/HHxLAyxPwyX8i7FGRr6ulBDMkBzg2BM=
|
||||||
github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463/go.mod h1:BjIOLmkEEtAgloAiVUcYj0Mt+YU00JARZw8AEU0IwAg=
|
github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463/go.mod h1:BjIOLmkEEtAgloAiVUcYj0Mt+YU00JARZw8AEU0IwAg=
|
||||||
github.com/xtls/xray-core v1.8.25-0.20241002041629-e45cef542e26 h1:Ijmwq3J+J88VKojsQBrFPNw9ICXrdxRLitBszxfJzGU=
|
github.com/xtls/xray-core v1.8.25-0.20241005021528-c30f5d47964b h1:bWuePNnzV4ptnSYJkY96dAg3WgjYbfVgGnasLe3++9w=
|
||||||
github.com/xtls/xray-core v1.8.25-0.20241002041629-e45cef542e26/go.mod h1:YSvBScSqyzAocGDvzHBbEeoHNrFy8nV6gityRVDvHaM=
|
github.com/xtls/xray-core v1.8.25-0.20241005021528-c30f5d47964b/go.mod h1:YSvBScSqyzAocGDvzHBbEeoHNrFy8nV6gityRVDvHaM=
|
||||||
|
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||||
|
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=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||||
|
@ -192,16 +194,16 @@ go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
||||||
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
|
||||||
golang.org/x/arch v0.10.0 h1:S3huipmSclq3PJMNe76NGwkBR504WFkQ5dhzWzP8ZW8=
|
golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4=
|
||||||
golang.org/x/arch v0.10.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
||||||
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
|
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
||||||
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
|
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
||||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
|
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
|
||||||
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
|
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
|
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
||||||
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
|
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
||||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
@ -211,24 +213,24 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
||||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
|
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
|
||||||
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||||
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
|
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
||||||
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
|
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
||||||
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
|
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
||||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
|
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
|
||||||
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-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
|
||||||
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
|
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
|
||||||
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
||||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
||||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
|
39
install.sh
39
install.sh
|
@ -51,6 +51,10 @@ elif [[ "${release}" == "armbian" ]]; then
|
||||||
echo "Your OS is Armbian"
|
echo "Your OS is Armbian"
|
||||||
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
|
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
|
||||||
echo "Your OS is OpenSUSE Tumbleweed"
|
echo "Your OS is OpenSUSE Tumbleweed"
|
||||||
|
elif [[ "${release}" == "openEuler" ]]; then
|
||||||
|
if [[ ${os_version} -lt 2203 ]]; then
|
||||||
|
echo -e "${red} Please use OpenEuler 22.03 or higher ${plain}\n" && exit 1
|
||||||
|
fi
|
||||||
elif [[ "${release}" == "centos" ]]; then
|
elif [[ "${release}" == "centos" ]]; then
|
||||||
if [[ ${os_version} -lt 8 ]]; then
|
if [[ ${os_version} -lt 8 ]]; then
|
||||||
echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
|
echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
|
||||||
|
@ -79,7 +83,7 @@ elif [[ "${release}" == "rocky" ]]; then
|
||||||
if [[ ${os_version} -lt 8 ]]; then
|
if [[ ${os_version} -lt 8 ]]; then
|
||||||
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
|
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
|
||||||
fi
|
fi
|
||||||
elif [[ "${release}" == "oracle" ]]; then
|
elif [[ "${release}" == "ol" ]]; then
|
||||||
if [[ ${os_version} -lt 8 ]]; then
|
if [[ ${os_version} -lt 8 ]]; then
|
||||||
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
|
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -89,6 +93,7 @@ else
|
||||||
echo "- Ubuntu 20.04+"
|
echo "- Ubuntu 20.04+"
|
||||||
echo "- Debian 11+"
|
echo "- Debian 11+"
|
||||||
echo "- CentOS 8+"
|
echo "- CentOS 8+"
|
||||||
|
echo "- OpenEuler 22.03+"
|
||||||
echo "- Fedora 36+"
|
echo "- Fedora 36+"
|
||||||
echo "- Arch Linux"
|
echo "- Arch Linux"
|
||||||
echo "- Parch Linux"
|
echo "- Parch Linux"
|
||||||
|
@ -107,7 +112,7 @@ install_base() {
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt-get update && apt-get install -y -q wget curl tar tzdata
|
apt-get update && apt-get install -y -q wget curl tar tzdata
|
||||||
;;
|
;;
|
||||||
centos | almalinux | rocky | oracle)
|
centos | almalinux | rocky | ol)
|
||||||
yum -y update && yum install -y -q wget curl tar tzdata
|
yum -y update && yum install -y -q wget curl tar tzdata
|
||||||
;;
|
;;
|
||||||
fedora | amzn)
|
fedora | amzn)
|
||||||
|
@ -133,27 +138,25 @@ gen_random_string() {
|
||||||
|
|
||||||
config_after_install() {
|
config_after_install() {
|
||||||
echo -e "${yellow}Install/update finished! For security, it's recommended to modify panel settings ${plain}"
|
echo -e "${yellow}Install/update finished! For security, it's recommended to modify panel settings ${plain}"
|
||||||
read -p "Would you like to customize the panel settings? (If not, random settings will be applied) [y/n]: " config_confirm
|
read -p "Would you like to customize the Panel Port settings? (If not, random settings will be applied) [y/n]: " config_confirm
|
||||||
|
|
||||||
local config_webBasePath=$(gen_random_string 10)
|
local config_webBasePath=$(gen_random_string 15)
|
||||||
|
local config_account=$(gen_random_string 10)
|
||||||
|
local config_password=$(gen_random_string 10)
|
||||||
|
|
||||||
if [[ "${config_confirm}" == "y" || "${config_confirm}" == "Y" ]]; then
|
if [[ "${config_confirm}" == "y" || "${config_confirm}" == "Y" ]]; then
|
||||||
|
|
||||||
read -p "Please set up your username: " config_account
|
|
||||||
echo -e "${yellow}Your username will be: ${config_account}${plain}"
|
|
||||||
|
|
||||||
read -p "Please set up your password: " config_password
|
|
||||||
echo -e "${yellow}Your password will be: ${config_password}${plain}"
|
|
||||||
|
|
||||||
read -p "Please set up the panel port: " config_port
|
read -p "Please set up the panel port: " config_port
|
||||||
echo -e "${yellow}Your panel port is: ${config_port}${plain}"
|
echo -e "${yellow}Your Panel Port is: ${config_port}${plain}"
|
||||||
|
|
||||||
echo -e "${yellow}Your web base path will be generated randomly: ${config_webBasePath}${plain}"
|
echo -e "${yellow}Your Username will be generated randomly: ${config_account}${plain}"
|
||||||
|
echo -e "${yellow}Your Password will be generated randomly: ${config_password}${plain}"
|
||||||
|
echo -e "${yellow}Your Web Base Path will be generated randomly: ${config_webBasePath}${plain}"
|
||||||
|
|
||||||
echo -e "${yellow}Initializing, please wait...${plain}"
|
echo -e "${yellow}Initializing, please wait...${plain}"
|
||||||
|
|
||||||
/usr/local/x-ui/x-ui setting -username "${config_account}" -password "${config_password}" -port "${config_port}" -webBasePath "${config_webBasePath}"
|
/usr/local/x-ui/x-ui setting -username "${config_account}" -password "${config_password}" -port "${config_port}" -webBasePath "${config_webBasePath}"
|
||||||
echo -e "${yellow}Settings applied successfully!${plain}"
|
echo -e "${green}Settings applied successfully!${plain}"
|
||||||
|
|
||||||
echo -e "###############################################"
|
echo -e "###############################################"
|
||||||
echo -e "${green}Username: ${config_account}${plain}"
|
echo -e "${green}Username: ${config_account}${plain}"
|
||||||
|
@ -168,15 +171,13 @@ config_after_install() {
|
||||||
|
|
||||||
if [[ ! -f "/etc/x-ui/x-ui.db" ]]; then
|
if [[ ! -f "/etc/x-ui/x-ui.db" ]]; then
|
||||||
|
|
||||||
local usernameTemp=$(gen_random_string 10)
|
|
||||||
local passwordTemp=$(gen_random_string 10)
|
|
||||||
local portTemp=$(shuf -i 1024-62000 -n 1)
|
local portTemp=$(shuf -i 1024-62000 -n 1)
|
||||||
|
|
||||||
/usr/local/x-ui/x-ui setting -username "${usernameTemp}" -password "${passwordTemp}" -port "${portTemp}" -webBasePath "${config_webBasePath}"
|
/usr/local/x-ui/x-ui setting -username "${config_account}" -password "${config_password}" -port "${portTemp}" -webBasePath "${config_webBasePath}"
|
||||||
echo -e "This is a fresh installation, generating random login info for security concerns:"
|
echo -e "This is a fresh installation, generating random login info for security concerns:"
|
||||||
echo -e "###############################################"
|
echo -e "###############################################"
|
||||||
echo -e "${green}Username: ${usernameTemp}${plain}"
|
echo -e "${green}Username: ${config_account}${plain}"
|
||||||
echo -e "${green}Password: ${passwordTemp}${plain}"
|
echo -e "${green}Password: ${config_password}${plain}"
|
||||||
echo -e "${green}Port: ${portTemp}${plain}"
|
echo -e "${green}Port: ${portTemp}${plain}"
|
||||||
echo -e "${green}WebBasePath: ${config_webBasePath}${plain}"
|
echo -e "${green}WebBasePath: ${config_webBasePath}${plain}"
|
||||||
echo -e "###############################################"
|
echo -e "###############################################"
|
||||||
|
@ -190,7 +191,7 @@ config_after_install() {
|
||||||
echo -e "${yellow}WebBasePath is empty, generating a random one...${plain}"
|
echo -e "${yellow}WebBasePath is empty, generating a random one...${plain}"
|
||||||
|
|
||||||
/usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}"
|
/usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}"
|
||||||
echo -e "${green}New webBasePath: ${config_webBasePath}${plain}"
|
echo -e "${green}New WebBasePath: ${config_webBasePath}${plain}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1184,7 +1184,7 @@ class StreamSettings extends XrayCommonClass {
|
||||||
|
|
||||||
class Sniffing extends XrayCommonClass {
|
class Sniffing extends XrayCommonClass {
|
||||||
constructor(
|
constructor(
|
||||||
enabled = true,
|
enabled = false,
|
||||||
destOverride = ['http', 'tls', 'quic', 'fakedns'],
|
destOverride = ['http', 'tls', 'quic', 'fakedns'],
|
||||||
metadataOnly = false,
|
metadataOnly = false,
|
||||||
routeOnly = false) {
|
routeOnly = false) {
|
||||||
|
|
|
@ -464,8 +464,7 @@
|
||||||
outboundTag: "direct",
|
outboundTag: "direct",
|
||||||
domain: [
|
domain: [
|
||||||
"geosite:category-ir"
|
"geosite:category-ir"
|
||||||
],
|
]
|
||||||
"enabled": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "field",
|
type: "field",
|
||||||
|
@ -473,8 +472,7 @@
|
||||||
ip: [
|
ip: [
|
||||||
"geoip:private",
|
"geoip:private",
|
||||||
"geoip:ir"
|
"geoip:ir"
|
||||||
],
|
]
|
||||||
enabled: true
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
geoIPOptions: [
|
geoIPOptions: [
|
||||||
|
@ -751,16 +749,25 @@
|
||||||
get: function () {
|
get: function () {
|
||||||
if (!this.enableDirect) return [];
|
if (!this.enableDirect) return [];
|
||||||
const rules = JSON.parse(this.allSetting.subJsonRules);
|
const rules = JSON.parse(this.allSetting.subJsonRules);
|
||||||
return Array.isArray(rules) ? rules[1].ip.map(d => d.replace("geoip:", "")) : [];
|
if (!Array.isArray(rules)) return [];
|
||||||
|
const ipRule = rules.find(r => r.ip);
|
||||||
|
return ipRule?.ip.map(d => d.replace("geoip:", "")) ?? [];
|
||||||
},
|
},
|
||||||
set: function (v) {
|
set: function (v) {
|
||||||
const rules = JSON.parse(this.allSetting.subJsonRules);
|
let rules = JSON.parse(this.allSetting.subJsonRules);
|
||||||
if (!Array.isArray(rules)) return;
|
if (!Array.isArray(rules)) return;
|
||||||
|
|
||||||
rules[1].ip = [];
|
if (v.length == 0) {
|
||||||
v.forEach(d => {
|
rules = rules.filter(r => !r.ip);
|
||||||
rules[1].ip.push("geoip:" + d);
|
} else {
|
||||||
});
|
let ruleIndex = rules.findIndex(r => r.ip);
|
||||||
|
if (ruleIndex == -1) ruleIndex = rules.push(this.defaultRules[1]) - 1;
|
||||||
|
|
||||||
|
rules[ruleIndex].ip = [];
|
||||||
|
v.forEach(d => {
|
||||||
|
rules[ruleIndex].ip.push("geoip:" + d);
|
||||||
|
});
|
||||||
|
}
|
||||||
this.allSetting.subJsonRules = JSON.stringify(rules);
|
this.allSetting.subJsonRules = JSON.stringify(rules);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -768,29 +775,37 @@
|
||||||
get: function () {
|
get: function () {
|
||||||
if (!this.enableDirect) return [];
|
if (!this.enableDirect) return [];
|
||||||
const rules = JSON.parse(this.allSetting.subJsonRules);
|
const rules = JSON.parse(this.allSetting.subJsonRules);
|
||||||
return Array.isArray(rules) ?
|
if (!Array.isArray(rules)) return [];
|
||||||
rules[0].domain.map(d => {
|
const domainRule = rules.find(r => r.domain);
|
||||||
if (d.startsWith("geosite:category-")) {
|
return domainRule?.domain.map(d => {
|
||||||
return d.replace("geosite:category-", "");
|
if (d.startsWith("geosite:category-")) {
|
||||||
}
|
return d.replace("geosite:category-", "");
|
||||||
return d.replace("geosite:", "");
|
}
|
||||||
})
|
return d.replace("geosite:", "");
|
||||||
: [];
|
})
|
||||||
|
?? [];
|
||||||
},
|
},
|
||||||
set: function (v) {
|
set: function (v) {
|
||||||
const rules = JSON.parse(this.allSetting.subJsonRules);
|
let rules = JSON.parse(this.allSetting.subJsonRules);
|
||||||
if (!Array.isArray(rules)) return;
|
if (!Array.isArray(rules)) return;
|
||||||
|
|
||||||
rules[0].domain = [];
|
if (v.length == 0) {
|
||||||
v.forEach(d => {
|
rules = rules.filter(r => !r.domain);
|
||||||
let category = '';
|
} else {
|
||||||
if (["cn", "apple", "meta", "google"].includes(d)) {
|
let ruleIndex = rules.findIndex(r => r.domain);
|
||||||
category = "";
|
if (ruleIndex == -1) ruleIndex = rules.push(this.defaultRules[0]) - 1;
|
||||||
} else if (["ru", "ir"].includes(d)) {
|
|
||||||
category = "category-";
|
rules[ruleIndex].domain = [];
|
||||||
}
|
v.forEach(d => {
|
||||||
rules[0].domain.push("geosite:" + category + d);
|
let category = '';
|
||||||
});
|
if (["cn", "apple", "meta", "google"].includes(d)) {
|
||||||
|
category = "";
|
||||||
|
} else if (["ru", "ir"].includes(d)) {
|
||||||
|
category = "category-";
|
||||||
|
}
|
||||||
|
rules[ruleIndex].domain.push("geosite:" + category + d);
|
||||||
|
});
|
||||||
|
}
|
||||||
this.allSetting.subJsonRules = JSON.stringify(rules);
|
this.allSetting.subJsonRules = JSON.stringify(rules);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -228,14 +228,10 @@
|
||||||
</a-row>
|
</a-row>
|
||||||
<a-list-item>
|
<a-list-item>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.Torrent"}}' desc='{{ i18n "pages.xray.TorrentDesc"}}' v-model="torrentSettings"></setting-list-item>
|
<setting-list-item type="switch" title='{{ i18n "pages.xray.Torrent"}}' desc='{{ i18n "pages.xray.TorrentDesc"}}' v-model="torrentSettings"></setting-list-item>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.PrivateIp"}}' desc='{{ i18n "pages.xray.PrivateIpDesc"}}' v-model="privateIpSettings"></setting-list-item>
|
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.Ads"}}' desc='{{ i18n "pages.xray.AdsDesc"}}' v-model="AdsSettings"></setting-list-item>
|
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.Family"}}' desc='{{ i18n "pages.xray.FamilyDesc"}}' v-model="familyProtectSettings"></setting-list-item>
|
<setting-list-item type="switch" title='{{ i18n "pages.xray.Family"}}' desc='{{ i18n "pages.xray.FamilyDesc"}}' v-model="familyProtectSettings"></setting-list-item>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.Security"}}' desc='{{ i18n "pages.xray.SecurityDesc"}}' v-model="SecuritySettings"></setting-list-item>
|
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.Speedtest"}}' desc='{{ i18n "pages.xray.SpeedtestDesc"}}' v-model="SpeedTestSettings"></setting-list-item>
|
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
</a-collapse-panel>
|
</a-collapse-panel>
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.blockConnectionsConfigs"}}'>
|
<a-collapse-panel header='{{ i18n "pages.xray.basicRouting"}}'>
|
||||||
<a-row :xs="24" :sm="24" :lg="12">
|
<a-row :xs="24" :sm="24" :lg="12">
|
||||||
<a-alert type="warning" style="text-align: center;">
|
<a-alert type="warning" style="text-align: center;">
|
||||||
<template slot="message">
|
<template slot="message">
|
||||||
|
@ -245,36 +241,44 @@
|
||||||
</a-alert>
|
</a-alert>
|
||||||
</a-row>
|
</a-row>
|
||||||
<a-list-item>
|
<a-list-item>
|
||||||
<a-collapse>
|
<a-row style="padding: 0 20px">
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.blockips"}}'>
|
<a-col :lg="24" :xl="12">
|
||||||
<setting-list-item type="switch" title='🇮🇷 Iran'
|
<a-list-item-meta
|
||||||
v-model="IRIpSettings"></setting-list-item>
|
title='{{ i18n "pages.xray.blockips" }}'/>
|
||||||
<setting-list-item type="switch" title='🇨🇳 China'
|
</a-col>
|
||||||
v-model="ChinaIpSettings"></setting-list-item>
|
<a-col :lg="24" :xl="12">
|
||||||
<setting-list-item type="switch" title='🇷🇺 Russia'
|
<template>
|
||||||
v-model="RussiaIpSettings"></setting-list-item>
|
<a-select mode="tags" v-model="blockedIPs" style="width: 100%"
|
||||||
<setting-list-item type="switch" title='🇻🇳 Vietnam'
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
v-model="VNIpSettings"></setting-list-item>
|
<a-select-option :value="p.value" :label="p.label"
|
||||||
</a-collapse-panel>
|
v-for="p in settingsData.IPsOptions"> [[ p.label ]]
|
||||||
</a-collapse>
|
</a-select-option>
|
||||||
<br>
|
</a-select>
|
||||||
<a-collapse>
|
</template>
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.blockdomains"}}'>
|
</a-col>
|
||||||
<setting-list-item type="switch" title='🇮🇷 Iran'
|
</a-row>
|
||||||
v-model="IRDomainSettings"></setting-list-item>
|
</a-list-item>
|
||||||
<setting-list-item type="switch" title='🇨🇳 China'
|
<a-list-item>
|
||||||
v-model="ChinaDomainSettings"></setting-list-item>
|
<a-row style="padding: 0 20px">
|
||||||
<setting-list-item type="switch" title='🇷🇺 Russia'
|
<a-col :lg="24" :xl="12">
|
||||||
v-model="RussiaDomainSettings"></setting-list-item>
|
<a-list-item-meta
|
||||||
<setting-list-item type="switch" title='🇻🇳 Vietnam'
|
title='{{ i18n "pages.xray.blockdomains" }}'/>
|
||||||
v-model="VNDomainSettings"></setting-list-item>
|
</a-col>
|
||||||
</a-collapse-panel>
|
<a-col :lg="24" :xl="12">
|
||||||
</a-collapse>
|
<template>
|
||||||
|
<a-select mode="tags" style="width: 100%"
|
||||||
|
v-model="blockedDomains"
|
||||||
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
|
<a-select-option :value="p.value" :label="p.label"
|
||||||
|
v-for="p in settingsData.DomainsOptions"> [[ p.label ]]
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
</a-collapse-panel>
|
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.directConnectionsConfigs"}}'>
|
|
||||||
<a-row :xs="24" :sm="24" :lg="12">
|
<a-row :xs="24" :sm="24" :lg="12">
|
||||||
<a-alert type="warning" style="text-align: center;">
|
<a-alert type="warning" style="text-align: center; margin-top: 20px;">
|
||||||
<template slot="message">
|
<template slot="message">
|
||||||
<a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
<a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
||||||
{{ i18n "pages.xray.directConnectionsConfigsDesc" }}
|
{{ i18n "pages.xray.directConnectionsConfigsDesc" }}
|
||||||
|
@ -282,65 +286,99 @@
|
||||||
</a-alert>
|
</a-alert>
|
||||||
</a-row>
|
</a-row>
|
||||||
<a-list-item>
|
<a-list-item>
|
||||||
<a-collapse>
|
<a-row style="padding: 0 20px">
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.directips"}}'>
|
<a-col :lg="24" :xl="12">
|
||||||
<setting-list-item type="switch" title='🇮🇷 Iran'
|
<a-list-item-meta
|
||||||
v-model="IRIpDirectSettings"></setting-list-item>
|
title='{{ i18n "pages.xray.directips" }}'/>
|
||||||
<setting-list-item type="switch" title='🇨🇳 China'
|
</a-col>
|
||||||
v-model="ChinaIpDirectSettings"></setting-list-item>
|
<a-col :lg="24" :xl="12">
|
||||||
<setting-list-item type="switch" title='🇷🇺 Russia'
|
<template>
|
||||||
v-model="RussiaIpDirectSettings"></setting-list-item>
|
<a-select mode="tags" style="width: 100%"
|
||||||
<setting-list-item type="switch" title='🇻🇳 Vietnam'
|
v-model="directIPs"
|
||||||
v-model="VNIpDirectSettings"></setting-list-item>
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
</a-collapse-panel>
|
<a-select-option :value="p.value" :label="p.label"
|
||||||
</a-collapse>
|
v-for="p in settingsData.IPsOptions"> [[ p.label ]]
|
||||||
<br>
|
</a-select-option>
|
||||||
<a-collapse>
|
</a-select>
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.directdomains"}}'>
|
</template>
|
||||||
<setting-list-item type="switch" title='🇮🇷 Iran'
|
</a-col>
|
||||||
v-model="IRDomainDirectSettings"></setting-list-item>
|
</a-row>
|
||||||
<setting-list-item type="switch" title='🇨🇳 China'
|
</a-list-item>
|
||||||
v-model="ChinaDomainDirectSettings"></setting-list-item>
|
<a-list-item>
|
||||||
<setting-list-item type="switch" title='🇷🇺 Russia'
|
<a-row style="padding: 0 20px">
|
||||||
v-model="RussiaDomainDirectSettings"></setting-list-item>
|
<a-col :lg="24" :xl="12">
|
||||||
<setting-list-item type="switch" title='🇻🇳 Vietnam'
|
<a-list-item-meta
|
||||||
v-model="VNDomainDirectSettings"></setting-list-item>
|
title='{{ i18n "pages.xray.directdomains" }}'/>
|
||||||
</a-collapse-panel>
|
</a-col>
|
||||||
</a-collapse>
|
<a-col :lg="24" :xl="12">
|
||||||
|
<template>
|
||||||
|
<a-select mode="tags" style="width: 100%"
|
||||||
|
v-model="directDomains"
|
||||||
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
|
<a-select-option :value="p.value" :label="p.label"
|
||||||
|
v-for="p in settingsData.DirectDomainsOptions"> [[ p.label ]]
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
</a-collapse-panel>
|
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.ipv4Configs"}}'>
|
|
||||||
<a-row :xs="24" :sm="24" :lg="12">
|
<a-row :xs="24" :sm="24" :lg="12">
|
||||||
<a-alert type="warning" style="text-align: center;">
|
<a-alert type="warning" style="text-align: center; margin-top: 20px;">
|
||||||
<template slot="message">
|
<template slot="message">
|
||||||
<a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
<a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
||||||
{{ i18n "pages.xray.ipv4ConfigsDesc" }}
|
{{ i18n "pages.xray.ipv4RoutingDesc" }}
|
||||||
</template>
|
</template>
|
||||||
</a-alert>
|
</a-alert>
|
||||||
</a-row>
|
</a-row>
|
||||||
<a-list-item>
|
<a-list-item>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleIPv4"}}' desc='{{ i18n "pages.xray.GoogleIPv4Desc"}}' v-model="GoogleIPv4Settings"></setting-list-item>
|
<a-row style="padding: 0 20px">
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixIPv4"}}' desc='{{ i18n "pages.xray.NetflixIPv4Desc"}}' v-model="NetflixIPv4Settings"></setting-list-item>
|
<a-col :lg="24" :xl="12">
|
||||||
|
<a-list-item-meta
|
||||||
|
title='{{ i18n "pages.xray.ipv4Routing" }}'/>
|
||||||
|
</a-col>
|
||||||
|
<a-col :lg="24" :xl="12">
|
||||||
|
<template>
|
||||||
|
<a-select mode="tags" style="width: 100%"
|
||||||
|
v-model="ipv4Domains"
|
||||||
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
|
<a-select-option :value="p.value" :label="p.label"
|
||||||
|
v-for="p in settingsData.ServicesOptions"> [[ p.label ]]
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
</a-collapse-panel>
|
|
||||||
<a-collapse-panel header='{{ i18n "pages.xray.warpConfigs"}}'>
|
|
||||||
<a-row :xs="24" :sm="24" :lg="12">
|
<a-row :xs="24" :sm="24" :lg="12">
|
||||||
<a-alert type="warning" style="text-align: center;">
|
<a-alert type="warning" style="text-align: center; margin-top: 20px;">
|
||||||
<template slot="message">
|
<template slot="message">
|
||||||
<a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
<a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
|
||||||
{{ i18n "pages.xray.warpConfigsDesc" }}
|
{{ i18n "pages.xray.warpRoutingDesc" }}
|
||||||
</template>
|
</template>
|
||||||
</a-alert>
|
</a-alert>
|
||||||
</a-row>
|
</a-row>
|
||||||
<a-list-item>
|
<a-list-item>
|
||||||
<template v-if="WarpExist">
|
<template v-if="WarpExist">
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleWARP"}}' desc='{{ i18n "pages.xray.GoogleWARPDesc"}}' v-model="GoogleWARPSettings"></setting-list-item>
|
<a-list-item>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.OpenAIWARP"}}' desc='{{ i18n "pages.xray.OpenAIWARPDesc"}}' v-model="OpenAIWARPSettings"></setting-list-item>
|
<a-row style="padding: 0 20px">
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixWARP"}}' desc='{{ i18n "pages.xray.NetflixWARPDesc"}}' v-model="NetflixWARPSettings"></setting-list-item>
|
<a-col :lg="24" :xl="12">
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.SpotifyWARP"}}' desc='{{ i18n "pages.xray.SpotifyWARPDesc"}}' v-model="SpotifyWARPSettings"></setting-list-item>
|
<a-list-item-meta
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.MetaWARP"}}' desc='{{ i18n "pages.xray.MetaWARPDesc"}}' v-model="MetaWARPSettings"></setting-list-item>
|
title='{{ i18n "pages.xray.warpRouting" }}'/>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.AppleWARP"}}' desc='{{ i18n "pages.xray.AppleWARPDesc"}}' v-model="AppleWARPSettings"></setting-list-item>
|
</a-col>
|
||||||
<setting-list-item type="switch" title='{{ i18n "pages.xray.RedditWARP"}}' desc='{{ i18n "pages.xray.RedditWARPDesc"}}' v-model="RedditWARPSettings"></setting-list-item>
|
<a-col :lg="24" :xl="12">
|
||||||
|
<template>
|
||||||
|
<a-select mode="tags" style="width: 100%"
|
||||||
|
v-model="warpDomains"
|
||||||
|
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||||
|
<a-select-option :value="p.value" :label="p.label"
|
||||||
|
v-for="p in settingsData.ServicesOptions"> [[ p.label ]]
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-list-item>
|
||||||
</template>
|
</template>
|
||||||
<a-button style="margin-left: 20px;" v-else type="primary" icon="cloud" @click="showWarp()">WARP</a-button>
|
<a-button style="margin-left: 20px;" v-else type="primary" icon="cloud" @click="showWarp()">WARP</a-button>
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
|
@ -859,52 +897,56 @@
|
||||||
protocols: {
|
protocols: {
|
||||||
bittorrent: ["bittorrent"],
|
bittorrent: ["bittorrent"],
|
||||||
},
|
},
|
||||||
ips: {
|
IPsOptions: [
|
||||||
local: ["geoip:private"],
|
{ label: 'Private IP', value: 'geoip:private' },
|
||||||
cn: ["geoip:cn"],
|
{ label: '🇮🇷 Iran', value: 'ext:geoip_IR.dat:ir' },
|
||||||
ir: ["ext:geoip_IR.dat:ir"],
|
{ label: '🇨🇳 China', value: 'geoip:cn' },
|
||||||
ru: ["geoip:ru"],
|
{ label: '🇷🇺 Russia', value: 'geoip:ru' },
|
||||||
vn: ["ext:geoip_VN.dat:vn"],
|
{ label: '🇻🇳 Vietnam', value: 'ext:geoip_VN.dat:vn' },
|
||||||
},
|
{ label: '🇪🇸 Spain', value: 'geoip:es' },
|
||||||
domains: {
|
{ label: '🇮🇩 Indonesia', value: 'geoip:id' },
|
||||||
ads: [
|
{ label: '🇺🇦 Ukraine', value: 'geoip:ua' },
|
||||||
"geosite:category-ads-all",
|
{ label: '🇹🇷 Türkiye', value: 'geoip:tr' },
|
||||||
"ext:geosite_IR.dat:category-ads-all"
|
{ label: '🇧🇷 Brazil', value: 'geoip:br' },
|
||||||
],
|
],
|
||||||
security: [
|
DomainsOptions: [
|
||||||
"ext:geosite_IR.dat:malware",
|
{ label: 'Ads All', value: 'geosite:category-ads-all' },
|
||||||
"ext:geosite_IR.dat:phishing",
|
{ label: 'Ads IR 🇮🇷', value: 'ext:geosite_IR.dat:category-ads-all' },
|
||||||
"ext:geosite_IR.dat:cryptominers"
|
{ label: 'Ads VN 🇻🇳', value: 'ext:geosite_VN.dat:ads' },
|
||||||
],
|
{ label: 'Sec-IR malware', value: 'geosite_IR.dat:malware' },
|
||||||
speedtest: ["geosite:speedtest"],
|
{ label: 'Sec-IR phishing', value: 'geosite_IR.dat:phishing' },
|
||||||
openai: ["geosite:openai"],
|
{ label: 'Sec-IR cryptominers', value: 'geosite_IR.dat:cryptominers' },
|
||||||
google: ["geosite:google"],
|
{ label: '🇮🇷 Iran', value: 'ext:geosite_IR.dat:ir' },
|
||||||
spotify: ["geosite:spotify"],
|
{ label: '🇮🇷 .ir', value: 'regexp:.*\\.ir$' },
|
||||||
netflix: ["geosite:netflix"],
|
{ label: '🇮🇷 .ایران', value: 'regexp:.*\\.xn--mgba3a4f16a$' },
|
||||||
meta: ["geosite:meta"],
|
{ label: '🇨🇳 China', value: 'geosite:cn' },
|
||||||
apple: ["geosite:apple"],
|
{ label: '🇨🇳 .cn', value: 'regexp:.*\\.cn$' },
|
||||||
reddit: ["geosite:reddit"],
|
{ label: '🇷🇺 Russia', value: 'geosite:category-ru' },
|
||||||
cn: [
|
{ label: '🇷🇺 .ru', value: 'regexp:.*\\.ru' },
|
||||||
"regexp:.*\\.cn$",
|
{ label: '🇻🇳 Vietnam', value: 'ext:geosite_VN.dat:vn' },
|
||||||
"geosite:cn"
|
{ label: '🇻🇳 .vn', value: 'regexp:.*\\.vn$' },
|
||||||
],
|
],
|
||||||
ru: [
|
DirectDomainsOptions: [
|
||||||
"regexp:.*\\.ru$",
|
{ label: '🇮🇷 Iran', value: 'ext:geosite_IR.dat:ir' },
|
||||||
"geosite:category-ru" //https://github.com/v2fly/domain-list-community/blob/master/data/category-ru
|
{ label: '🇮🇷 .ir', value: 'regexp:.*\\.ir$' },
|
||||||
|
{ label: '🇮🇷 .ایران', value: 'regexp:.*\\.xn--mgba3a4f16a$' },
|
||||||
],
|
{ label: '🇨🇳 China', value: 'geosite:cn' },
|
||||||
ir: [
|
{ label: '🇨🇳 .cn', value: 'regexp:.*\\.cn$' },
|
||||||
"regexp:.*\\.ir$",
|
{ label: '🇷🇺 Russia', value: 'geosite:category-ru' },
|
||||||
"ext:geosite_IR.dat:ir",
|
{ label: '🇷🇺 .ru', value: 'regexp:.*\\.ru' },
|
||||||
"geosite:category-ir", // https://github.com/v2fly/domain-list-community/blob/master/data/category-ir
|
{ label: '🇻🇳 Vietnam', value: 'ext:geosite_VN.dat:vn' },
|
||||||
"regexp:.*\\.xn--mgba3a4f16a$" // .ایران
|
{ label: '🇻🇳 .vn', value: 'regexp:.*\\.vn$' },
|
||||||
],
|
],
|
||||||
vn: [
|
ServicesOptions: [
|
||||||
"regexp:.*\\.vn$",
|
{ label: 'Apple', value: 'geosite:apple' },
|
||||||
"ext:geosite_VN.dat:vn",
|
{ label: 'Meta', value: 'geosite:meta' },
|
||||||
"ext:geosite_VN.dat:ads"
|
{ label: 'Google', value: 'geosite:google' },
|
||||||
]
|
{ label: 'OpenAI', value: 'geosite:openai' },
|
||||||
},
|
{ label: 'Spotify', value: 'geosite:spotify' },
|
||||||
|
{ label: 'Netflix', value: 'geosite:netflix' },
|
||||||
|
{ label: 'Reddit', value: 'geosite:reddit' },
|
||||||
|
{ label: 'Speedtest', value: 'geosite:speedtest' },
|
||||||
|
],
|
||||||
familyProtectDNS: {
|
familyProtectDNS: {
|
||||||
"servers": [
|
"servers": [
|
||||||
"1.1.1.3", // https://developers.cloudflare.com/1.1.1.1/setup/
|
"1.1.1.3", // https://developers.cloudflare.com/1.1.1.1/setup/
|
||||||
|
@ -1861,54 +1903,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
privateIpSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.local, this.blockedIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.local];
|
|
||||||
} else {
|
|
||||||
this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.local.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
AdsSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.ads, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.ads];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.ads.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SecuritySettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.security, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.security];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.security.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SpeedTestSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.speedtest, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.speedtest];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.speedtest.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
familyProtectSettings: {
|
familyProtectSettings: {
|
||||||
get: function () {
|
get: function () {
|
||||||
if (!this.templateSettings || !this.templateSettings.dns || !this.templateSettings.dns.servers) return false;
|
if (!this.templateSettings || !this.templateSettings.dns || !this.templateSettings.dns.servers) return false;
|
||||||
|
@ -1924,311 +1918,11 @@
|
||||||
this.templateSettings = newTemplateSettings;
|
this.templateSettings = newTemplateSettings;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
GoogleIPv4Settings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.google, this.ipv4Domains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.ipv4Domains = [...this.ipv4Domains, ...this.settingsData.domains.google];
|
|
||||||
} else {
|
|
||||||
this.ipv4Domains = this.ipv4Domains.filter(data => !this.settingsData.domains.google.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
NetflixIPv4Settings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.netflix, this.ipv4Domains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.ipv4Domains = [...this.ipv4Domains, ...this.settingsData.domains.netflix];
|
|
||||||
} else {
|
|
||||||
this.ipv4Domains = this.ipv4Domains.filter(data => !this.settingsData.domains.netflix.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
IRIpSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.ir, this.blockedIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.ir];
|
|
||||||
} else {
|
|
||||||
this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.ir.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
IRDomainSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.ir, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.ir];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.ir.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ChinaIpSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.cn, this.blockedIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.cn];
|
|
||||||
} else {
|
|
||||||
this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.cn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ChinaDomainSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.cn, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.cn];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.cn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RussiaIpSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.ru, this.blockedIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.ru];
|
|
||||||
} else {
|
|
||||||
this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.ru.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RussiaDomainSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.ru, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.ru];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.ru.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
VNIpSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.vn, this.blockedIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.vn];
|
|
||||||
} else {
|
|
||||||
this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.vn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
VNDomainSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.vn, this.blockedDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.vn];
|
|
||||||
} else {
|
|
||||||
this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.vn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
IRIpDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.ir, this.directIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directIPs = [...this.directIPs, ...this.settingsData.ips.ir];
|
|
||||||
} else {
|
|
||||||
this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.ir.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
IRDomainDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.ir, this.directDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directDomains = [...this.directDomains, ...this.settingsData.domains.ir];
|
|
||||||
} else {
|
|
||||||
this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.ir.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ChinaIpDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.cn, this.directIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directIPs = [...this.directIPs, ...this.settingsData.ips.cn];
|
|
||||||
} else {
|
|
||||||
this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.cn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ChinaDomainDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.cn, this.directDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directDomains = [...this.directDomains, ...this.settingsData.domains.cn];
|
|
||||||
} else {
|
|
||||||
this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.cn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RussiaIpDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.ru, this.directIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directIPs = [...this.directIPs, ...this.settingsData.ips.ru];
|
|
||||||
} else {
|
|
||||||
this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.ru.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RussiaDomainDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.ru, this.directDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directDomains = [...this.directDomains, ...this.settingsData.domains.ru];
|
|
||||||
} else {
|
|
||||||
this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.ru.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
VNIpDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.ips.vn, this.directIPs);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directIPs = [...this.directIPs, ...this.settingsData.ips.vn];
|
|
||||||
} else {
|
|
||||||
this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.vn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
VNDomainDirectSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.vn, this.directDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.directDomains = [...this.directDomains, ...this.settingsData.domains.vn];
|
|
||||||
} else {
|
|
||||||
this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.vn.includes(data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
WarpExist: {
|
WarpExist: {
|
||||||
get: function() {
|
get: function() {
|
||||||
return this.templateSettings ? this.templateSettings.outbounds.findIndex((o) => o.tag == "warp")>=0 : false;
|
return this.templateSettings ? this.templateSettings.outbounds.findIndex((o) => o.tag == "warp")>=0 : false;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
GoogleWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.google, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.google];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.google.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
OpenAIWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.openai, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.openai];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.openai.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
NetflixWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.netflix, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.netflix];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.netflix.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
MetaWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.meta, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.meta];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.meta.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
AppleWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.apple, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.apple];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.apple.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
RedditWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.reddit, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.reddit];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.reddit.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SpotifyWARPSettings: {
|
|
||||||
get: function () {
|
|
||||||
return doAllItemsExist(this.settingsData.domains.spotify, this.warpDomains);
|
|
||||||
},
|
|
||||||
set: function (newValue) {
|
|
||||||
if (newValue) {
|
|
||||||
this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.spotify];
|
|
||||||
} else {
|
|
||||||
this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.spotify.includes(data));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
enableDNS: {
|
enableDNS: {
|
||||||
get: function () {
|
get: function () {
|
||||||
return this.templateSettings ? this.templateSettings.dns != null : false;
|
return this.templateSettings ? this.templateSettings.dns != null : false;
|
||||||
|
|
|
@ -2,9 +2,7 @@ package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -101,8 +99,9 @@ func (s *InboundService) getAllEmails() ([]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *InboundService) contains(slice []string, str string) bool {
|
func (s *InboundService) contains(slice []string, str string) bool {
|
||||||
|
lowerStr := strings.ToLower(str)
|
||||||
for _, s := range slice {
|
for _, s := range slice {
|
||||||
if s == str {
|
if strings.ToLower(s) == lowerStr {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -414,12 +413,6 @@ func (s *InboundService) AddInboundClient(data *model.Inbound) (bool, error) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
email := clients[0].Email
|
|
||||||
valid, err := validateEmail(email)
|
|
||||||
if !valid {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var settings map[string]interface{}
|
var settings map[string]interface{}
|
||||||
err = json.Unmarshal([]byte(data.Settings), &settings)
|
err = json.Unmarshal([]byte(data.Settings), &settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -610,12 +603,6 @@ func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId strin
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
email := clients[0].Email
|
|
||||||
valid, err := validateEmail(email)
|
|
||||||
if !valid {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var settings map[string]interface{}
|
var settings map[string]interface{}
|
||||||
err = json.Unmarshal([]byte(data.Settings), &settings)
|
err = json.Unmarshal([]byte(data.Settings), &settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1050,8 +1037,12 @@ func (s *InboundService) disableInvalidInbounds(tx *gorm.DB) (bool, int64, error
|
||||||
if err1 == nil {
|
if err1 == nil {
|
||||||
logger.Debug("Inbound disabled by api:", tag)
|
logger.Debug("Inbound disabled by api:", tag)
|
||||||
} else {
|
} else {
|
||||||
logger.Debug("Error in disabling inbound by api:", err1)
|
if strings.Contains(err1.Error(), fmt.Sprintf("User %s not found.", tag)) {
|
||||||
needRestart = true
|
logger.Debug("User is already disabled. Nothing to do more...")
|
||||||
|
} else {
|
||||||
|
logger.Debug("Error in disabling client by api:", err1)
|
||||||
|
needRestart = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.xrayApi.Close()
|
s.xrayApi.Close()
|
||||||
|
@ -1089,8 +1080,16 @@ func (s *InboundService) disableInvalidClients(tx *gorm.DB) (bool, int64, error)
|
||||||
if err1 == nil {
|
if err1 == nil {
|
||||||
logger.Debug("Client disabled by api:", result.Email)
|
logger.Debug("Client disabled by api:", result.Email)
|
||||||
} else {
|
} else {
|
||||||
logger.Debug("Error in disabling client by api:", err1)
|
if strings.Contains(err1.Error(), fmt.Sprintf("User %s not found.", result.Email)) {
|
||||||
needRestart = true
|
logger.Debug("User is already disabled. Nothing to do more...")
|
||||||
|
} else {
|
||||||
|
if strings.Contains(err1.Error(), fmt.Sprintf("User %s not found.", result.Email)) {
|
||||||
|
logger.Debug("User is already disabled. Nothing to do more...")
|
||||||
|
} else {
|
||||||
|
logger.Debug("Error in disabling client by api:", err1)
|
||||||
|
needRestart = true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.xrayApi.Close()
|
s.xrayApi.Close()
|
||||||
|
@ -2022,20 +2021,3 @@ func (s *InboundService) MigrateDB() {
|
||||||
func (s *InboundService) GetOnlineClients() []string {
|
func (s *InboundService) GetOnlineClients() []string {
|
||||||
return p.GetOnlineClients()
|
return p.GetOnlineClients()
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateEmail(email string) (bool, error) {
|
|
||||||
if strings.Contains(email, " ") {
|
|
||||||
return false, errors.New("email contains spaces, please remove them")
|
|
||||||
}
|
|
||||||
|
|
||||||
if email != strings.ToLower(email) {
|
|
||||||
return false, errors.New("email contains uppercase letters, please convert to lowercase")
|
|
||||||
}
|
|
||||||
|
|
||||||
emailPattern := `^[a-z0-9@._-]+$`
|
|
||||||
if !regexp.MustCompile(emailPattern).MatchString(email) {
|
|
||||||
return false, errors.New("email contains invalid characters, please use only lowercase letters, digits, and @._-")
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Logs may affect your server's efficiency. It is recommended to enable it wisely only in case of your needs"
|
"logConfigsDesc" = "Logs may affect your server's efficiency. It is recommended to enable it wisely only in case of your needs"
|
||||||
"blockConfigs" = "Protection Shield"
|
"blockConfigs" = "Protection Shield"
|
||||||
"blockConfigsDesc" = "These options will block traffic based on specific requested protocols and websites."
|
"blockConfigsDesc" = "These options will block traffic based on specific requested protocols and websites."
|
||||||
"blockConnectionsConfigs" = "Block Connections"
|
"basicRouting" = "Basic Routing"
|
||||||
"blockConnectionsConfigsDesc" = "These options will block traffic based on the specific requested country."
|
"blockConnectionsConfigsDesc" = "These options will block traffic based on the specific requested country."
|
||||||
"directConnectionsConfigs" = "Direct Connections"
|
|
||||||
"directConnectionsConfigsDesc" = "A direct connection ensures that specific traffic is not routed through another server."
|
"directConnectionsConfigsDesc" = "A direct connection ensures that specific traffic is not routed through another server."
|
||||||
"blockips" = "Block IPs"
|
"blockips" = "Block IPs"
|
||||||
"blockdomains" = "Block Domains"
|
"blockdomains" = "Block Domains"
|
||||||
"directips" = "Direct IPs"
|
"directips" = "Direct IPs"
|
||||||
"directdomains" = "Direct Domains"
|
"directdomains" = "Direct Domains"
|
||||||
"ipv4Configs" = "IPv4 Routing"
|
"ipv4Routing" = "IPv4 Routing"
|
||||||
"ipv4ConfigsDesc" = "These options will route traffic based on a specific destination via IPv4."
|
"ipv4RoutingDesc" = "These options will route traffic based on a specific destination via IPv4."
|
||||||
"warpConfigs" = "WARP Routing"
|
"warpRouting" = "WARP Routing"
|
||||||
"warpConfigsDesc" = "These options will route traffic based on a specific destination via WARP."
|
"warpRoutingDesc" = "These options will route traffic based on a specific destination via WARP."
|
||||||
"Template" = "Advanced Xray Configuration Template"
|
"Template" = "Advanced Xray Configuration Template"
|
||||||
"TemplateDesc" = "The final Xray config file will be generated based on this template."
|
"TemplateDesc" = "The final Xray config file will be generated based on this template."
|
||||||
"FreedomStrategy" = "Freedom Protocol Strategy"
|
"FreedomStrategy" = "Freedom Protocol Strategy"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Set the overall traffic routing strategy for resolving all requests."
|
"RoutingStrategyDesc" = "Set the overall traffic routing strategy for resolving all requests."
|
||||||
"Torrent" = "Block BitTorrent Protocol"
|
"Torrent" = "Block BitTorrent Protocol"
|
||||||
"TorrentDesc" = "Blocks BitTorrent protocol."
|
"TorrentDesc" = "Blocks BitTorrent protocol."
|
||||||
"PrivateIp" = "Block Connection to Private IPs"
|
|
||||||
"PrivateIpDesc" = "Blocks establishing connections to private IP ranges."
|
|
||||||
"Ads" = "Block Ads"
|
|
||||||
"AdsDesc" = "Blocks advertising websites."
|
|
||||||
"Family" = "Family Protection"
|
"Family" = "Family Protection"
|
||||||
"FamilyDesc" = "Blocks adult content, and malware websites."
|
"FamilyDesc" = "Blocks adult content, and malware websites."
|
||||||
"Security" = "Security Shield"
|
|
||||||
"SecurityDesc" = "Blocks malware, phishing, and cryptominers websites."
|
|
||||||
"Speedtest" = "Block Speedtest"
|
|
||||||
"SpeedtestDesc" = "Blocks establishing connectins to speedtest websites."
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "Routes traffic to Google via IPv4."
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Routes traffic to Netflix via IPv4."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Add routing for Google via WARP."
|
|
||||||
"OpenAIWARP" = "ChatGPT"
|
|
||||||
"OpenAIWARPDesc" = "Routes traffic to ChatGPT via WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Routes traffic to Netflix via WARP."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Routes traffic to Meta (Instagram, Facebook, WhatsApp, Threads,...) via WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Routes traffic to Apple via WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Routes traffic to Reddit via WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Routes traffic to Spotify via WARP."
|
|
||||||
"IRWARP" = "Iran domains"
|
|
||||||
"IRWARPDesc" = "Routes traffic to Iran domains via WARP."
|
|
||||||
"Inbounds" = "Inbounds"
|
"Inbounds" = "Inbounds"
|
||||||
"InboundsDesc" = "Accepting the specific clients."
|
"InboundsDesc" = "Accepting the specific clients."
|
||||||
"Outbounds" = "Outbounds"
|
"Outbounds" = "Outbounds"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades."
|
"logConfigsDesc" = "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades."
|
||||||
"blockConfigs" = "Configuraciones de Bloqueo"
|
"blockConfigs" = "Configuraciones de Bloqueo"
|
||||||
"blockConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos."
|
"blockConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos."
|
||||||
"blockConnectionsConfigs" = "Bloquear Conexiones"
|
"basicRouting" = "Enrutamiento Básico"
|
||||||
"blockConnectionsConfigsDesc" = "Estas opciones bloquearán el tráfico según el país solicitado específico."
|
"blockConnectionsConfigsDesc" = "Estas opciones bloquearán el tráfico según el país solicitado específico."
|
||||||
"directConnectionsConfigs" = "Conexiones Directas"
|
|
||||||
"directConnectionsConfigsDesc" = "Una conexión directa asegura que el tráfico específico no sea enrutado a través de otro servidor."
|
"directConnectionsConfigsDesc" = "Una conexión directa asegura que el tráfico específico no sea enrutado a través de otro servidor."
|
||||||
"blockips" = "Bloquear IPs"
|
"blockips" = "Bloquear IPs"
|
||||||
"blockdomains" = "Bloquear Dominios"
|
"blockdomains" = "Bloquear Dominios"
|
||||||
"directips" = "IPs Directas"
|
"directips" = "IPs Directas"
|
||||||
"directdomains" = "Dominios Directos"
|
"directdomains" = "Dominios Directos"
|
||||||
"ipv4Configs" = "Configuraciones IPv4"
|
"ipv4Routing" = "Enrutamiento IPv4"
|
||||||
"ipv4ConfigsDesc" = "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4."
|
"ipv4RoutingDesc" = "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4."
|
||||||
"warpConfigs" = "Configuraciones de WARP"
|
"warpRouting" = "Enrutamiento WARP"
|
||||||
"warpConfigsDesc" = "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare."
|
"warpRoutingDesc" = "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare."
|
||||||
"Template" = "Plantilla de Configuración de Xray"
|
"Template" = "Plantilla de Configuración de Xray"
|
||||||
"TemplateDesc" = "Genera el archivo de configuración final de Xray basado en esta plantilla."
|
"TemplateDesc" = "Genera el archivo de configuración final de Xray basado en esta plantilla."
|
||||||
"FreedomStrategy" = "Configurar Estrategia para el Protocolo Freedom"
|
"FreedomStrategy" = "Configurar Estrategia para el Protocolo Freedom"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Establece la estrategia general de enrutamiento para la resolución de DNS."
|
"RoutingStrategyDesc" = "Establece la estrategia general de enrutamiento para la resolución de DNS."
|
||||||
"Torrent" = "Prohibir Uso de BitTorrent"
|
"Torrent" = "Prohibir Uso de BitTorrent"
|
||||||
"TorrentDesc" = "Cambia la plantilla de configuración para evitar el uso de BitTorrent por parte de los usuarios."
|
"TorrentDesc" = "Cambia la plantilla de configuración para evitar el uso de BitTorrent por parte de los usuarios."
|
||||||
"PrivateIp" = "Prohibir Conexiones a Rangos de IP Privadas"
|
|
||||||
"PrivateIpDesc" = "Cambia la plantilla de configuración para evitar la conexión a rangos de IP privadas."
|
|
||||||
"Ads" = "Bloquear Anuncios"
|
|
||||||
"AdsDesc" = "Cambia la plantilla de configuración para bloquear anuncios."
|
|
||||||
"Family" = "Bloquee malware y contenido para adultos"
|
"Family" = "Bloquee malware y contenido para adultos"
|
||||||
"FamilyDesc" = "Resolutores de DNS de Cloudflare para bloquear malware y contenido para adultos para protección familiar."
|
"FamilyDesc" = "Resolutores de DNS de Cloudflare para bloquear malware y contenido para adultos para protección familiar."
|
||||||
"Security" = "Escudo de Seguridad"
|
|
||||||
"SecurityDesc" = "Cambiar la plantilla de configuración para la protección de seguridad."
|
|
||||||
"Speedtest" = "Bloquear Sitios Web de Pruebas de Velocidad"
|
|
||||||
"SpeedtestDesc" = "Cambia la plantilla de configuración para evitar la conexión a sitios web de pruebas de velocidad."
|
|
||||||
"GoogleIPv4" = "Usar IPv4 para Google"
|
|
||||||
"GoogleIPv4Desc" = "Agregar enrutamiento para que Google se conecte con IPv4."
|
|
||||||
"NetflixIPv4" = "Usar IPv4 para Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Agregar enrutamiento para que Netflix se conecte con IPv4."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Agrega enrutamiento para Google a través de WARP."
|
|
||||||
"OpenAIWARP" = "ChatGPT"
|
|
||||||
"OpenAIWARPDesc" = "Enruta el tráfico a ChatGPT a través de WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Enruta el tráfico a Netflix a través de WARP."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Enruta el tráfico a Meta (Instagram, Facebook, WhatsApp, Threads, etc.) a través de WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Enruta el tráfico a Apple a través de WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Enruta el tráfico a Reddit a través de WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Enruta el tráfico a Spotify a través de WARP."
|
|
||||||
"IRWARP" = "Rutear dominios de Irán a través de WARP."
|
|
||||||
"IRWARPDesc" = "Agregar enrutamiento para dominios de Irán a través de WARP."
|
|
||||||
"Inbounds" = "Entrante"
|
"Inbounds" = "Entrante"
|
||||||
"InboundsDesc" = "Cambia la plantilla de configuración para aceptar clientes específicos."
|
"InboundsDesc" = "Cambia la plantilla de configuración para aceptar clientes específicos."
|
||||||
"Outbounds" = "Salidas"
|
"Outbounds" = "Salidas"
|
||||||
|
@ -453,6 +424,8 @@
|
||||||
[pages.xray.dns]
|
[pages.xray.dns]
|
||||||
"enable" = "Habilitar DNS"
|
"enable" = "Habilitar DNS"
|
||||||
"enableDesc" = "Habilitar servidor DNS incorporado"
|
"enableDesc" = "Habilitar servidor DNS incorporado"
|
||||||
|
"tag" = "Etiqueta de Entrada DNS"
|
||||||
|
"tagDesc" = "Esta etiqueta estará disponible como una etiqueta de entrada en las reglas de enrutamiento."
|
||||||
"strategy" = "Estrategia de Consulta"
|
"strategy" = "Estrategia de Consulta"
|
||||||
"strategyDesc" = "Estrategia general para resolver nombres de dominio"
|
"strategyDesc" = "Estrategia general para resolver nombres de dominio"
|
||||||
"add" = "Agregar Servidor"
|
"add" = "Agregar Servidor"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "گزارشها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید"
|
"logConfigsDesc" = "گزارشها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید"
|
||||||
"blockConfigs" = "سپر محافظ"
|
"blockConfigs" = "سپر محافظ"
|
||||||
"blockConfigsDesc" = "این گزینهها ترافیک را بر اساس پروتکلهای درخواستی خاص، و وب سایتها مسدود میکند"
|
"blockConfigsDesc" = "این گزینهها ترافیک را بر اساس پروتکلهای درخواستی خاص، و وب سایتها مسدود میکند"
|
||||||
"blockConnectionsConfigs" = "مسدود کردن اتصالات"
|
"basicRouting" = "مسیریابی پایه"
|
||||||
"blockConnectionsConfigsDesc" = "این گزینهها ترافیک را بر اساس کشور درخواستشده خاص مسدود میکنند."
|
"blockConnectionsConfigsDesc" = "این گزینهها ترافیک را بر اساس کشور درخواستشده خاص مسدود میکنند."
|
||||||
"directConnectionsConfigs" = "اتصالات مستقیم"
|
|
||||||
"directConnectionsConfigsDesc" = "یک اتصال مستقیم تضمین میکند که ترافیک خاص از طریق سرور دیگری مسیریابی نشود."
|
"directConnectionsConfigsDesc" = "یک اتصال مستقیم تضمین میکند که ترافیک خاص از طریق سرور دیگری مسیریابی نشود."
|
||||||
"blockips" = "مسدود کردن آیپیها"
|
"blockips" = "مسدود کردن آیپیها"
|
||||||
"blockdomains" = "مسدود کردن دامنهها"
|
"blockdomains" = "مسدود کردن دامنهها"
|
||||||
"directips" = "آیپیهای مستقیم"
|
"directips" = "آیپیهای مستقیم"
|
||||||
"directdomains" = "دامنههای مستقیم"
|
"directdomains" = "دامنههای مستقیم"
|
||||||
"ipv4Configs" = "IPv4 مسیریابی"
|
"ipv4Routing" = "IPv4 مسیریابی"
|
||||||
"ipv4ConfigsDesc" = "این گزینهها ترافیک را از طریق آیپینسخه4 به مقصد هدایت میکند"
|
"ipv4RoutingDesc" = "این گزینهها ترافیک را از طریق آیپی نسخه4 سرور، به مقصد هدایت میکند"
|
||||||
"warpConfigs" = "WARP مسیریابی"
|
"warpRouting" = "WARP مسیریابی"
|
||||||
"warpConfigsDesc" = "طبق راهنما نصب کنید SOCKS5 این گزینهها ترافیک را از طریق وارپ کلادفلر به مقصد هدایت میکند. ابتدا، وارپ را در حالت پراکسی"
|
"warpRoutingDesc" = "این گزینهها ترافیک را از طریق وارپ کلادفلر به مقصد هدایت میکند"
|
||||||
"Template" = "پیکربندی پیشرفته الگو ایکسری"
|
"Template" = "پیکربندی پیشرفته الگو ایکسری"
|
||||||
"TemplateDesc" = "فایل پیکربندی نهایی ایکسری بر اساس این الگو ایجاد میشود"
|
"TemplateDesc" = "فایل پیکربندی نهایی ایکسری بر اساس این الگو ایجاد میشود"
|
||||||
"FreedomStrategy" = "Freedom استراتژی پروتکل"
|
"FreedomStrategy" = "Freedom استراتژی پروتکل"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "استراتژی کلی مسیریابی برای حل تمام درخواستها را تعیین میکند"
|
"RoutingStrategyDesc" = "استراتژی کلی مسیریابی برای حل تمام درخواستها را تعیین میکند"
|
||||||
"Torrent" = "مسدودسازی پروتکل بیتتورنت"
|
"Torrent" = "مسدودسازی پروتکل بیتتورنت"
|
||||||
"TorrentDesc" = "پروتکل بیت تورنت را مسدود میکند"
|
"TorrentDesc" = "پروتکل بیت تورنت را مسدود میکند"
|
||||||
"PrivateIp" = "مسدودسازی اتصال آیپیهای خصوصی"
|
|
||||||
"PrivateIpDesc" = "اتصال به آیپیهای رنج خصوصی را مسدود میکند"
|
|
||||||
"Ads" = "مسدودسازی تبلیغات"
|
|
||||||
"AdsDesc" = "وبسایتهای تبلیغاتی را مسدود میکند"
|
|
||||||
"Family" = "محافظت خانواده"
|
"Family" = "محافظت خانواده"
|
||||||
"FamilyDesc" = "محتوای مخصوص بزرگسالان، و وبسایتهای ناامن را مسدود میکند"
|
"FamilyDesc" = "محتوای مخصوص بزرگسالان، و وبسایتهای ناامن را مسدود میکند"
|
||||||
"Security" = "محافظت امنیتی"
|
|
||||||
"SecurityDesc" = "وبسایتهای ناامن، بدافزار، فیشینگ، و کریپتوماینرها را مسدود میکند"
|
|
||||||
"Speedtest" = "مسدودسازی اسپیدتست"
|
|
||||||
"SpeedtestDesc" = "اتصال به وبسایتهای تست سرعت را مسدود میکند"
|
|
||||||
"GoogleIPv4" = "گوگل"
|
|
||||||
"GoogleIPv4Desc" = "ترافیک را از طریق آیپینسخه4 به گوگل هدایت میکند"
|
|
||||||
"NetflixIPv4" = "نتفلیکس"
|
|
||||||
"NetflixIPv4Desc" = "ترافیک را از طریق آیپینسخه4 به نتفلیکس هدایت میکند"
|
|
||||||
"GoogleWARP" = "گوگل"
|
|
||||||
"GoogleWARPDesc" = "ترافیک را از طریق وارپ به گوگل هدایت میکند"
|
|
||||||
"OpenAIWARP" = "چت جیپیتی"
|
|
||||||
"OpenAIWARPDesc" = "ترافیک را از طریق وارپ به چت جیپیتی هدایت میکند"
|
|
||||||
"NetflixWARP" = "نتفلیکس"
|
|
||||||
"NetflixWARPDesc" = "ترافیک را از طریق وارپ به نتفلیکس هدایت میکند"
|
|
||||||
"MetaWARP" = "متا"
|
|
||||||
"MetaWARPDesc" = "ترافیک را از طریق وارپ به متا (اینستاگرام، فیس بوک، واتساپ، تردز و...) هدایت می کند."
|
|
||||||
"AppleWARP" = "اپل"
|
|
||||||
"AppleWARPDesc" = "ترافیک را از طریق وارپ به اپل هدایت میکند"
|
|
||||||
"RedditWARP" = "ردیت"
|
|
||||||
"RedditWARPDesc" = "ترافیک را از طریق وارپ به ردیت هدایت میکند"
|
|
||||||
"SpotifyWARP" = "اسپاتیفای"
|
|
||||||
"SpotifyWARPDesc" = "ترافیک را از طریق وارپ به اسپاتیفای هدایت میکند"
|
|
||||||
"IRWARP" = "دامنههای ایران"
|
|
||||||
"IRWARPDesc" = "ترافیک را از طریق وارپ به دامنههای کشور ایران هدایت میکند"
|
|
||||||
"Inbounds" = "ورودیها"
|
"Inbounds" = "ورودیها"
|
||||||
"InboundsDesc" = "پذیرش کلاینت خاص"
|
"InboundsDesc" = "پذیرش کلاینت خاص"
|
||||||
"Outbounds" = "خروجیها"
|
"Outbounds" = "خروجیها"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan"
|
"logConfigsDesc" = "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan"
|
||||||
"blockConfigs" = "Pelindung"
|
"blockConfigs" = "Pelindung"
|
||||||
"blockConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta."
|
"blockConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta."
|
||||||
"blockConnectionsConfigs" = "Blokir Koneksi"
|
"basicRouting" = "Perutean Dasar"
|
||||||
"blockConnectionsConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta."
|
"blockConnectionsConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta."
|
||||||
"directConnectionsConfigs" = "Koneksi Langsung"
|
|
||||||
"directConnectionsConfigsDesc" = "Koneksi langsung memastikan bahwa lalu lintas tertentu tidak dialihkan melalui server lain."
|
"directConnectionsConfigsDesc" = "Koneksi langsung memastikan bahwa lalu lintas tertentu tidak dialihkan melalui server lain."
|
||||||
"blockips" = "Blokir IP"
|
"blockips" = "Blokir IP"
|
||||||
"blockdomains" = "Blokir Domain"
|
"blockdomains" = "Blokir Domain"
|
||||||
"directips" = "IP Langsung"
|
"directips" = "IP Langsung"
|
||||||
"directdomains" = "Domain Langsung"
|
"directdomains" = "Domain Langsung"
|
||||||
"ipv4Configs" = "Pengalihan IPv4"
|
"ipv4Routing" = "Perutean IPv4"
|
||||||
"ipv4ConfigsDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4."
|
"ipv4RoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4."
|
||||||
"warpConfigs" = "Pengalihan WARP"
|
"warpRouting" = "Perutean WARP"
|
||||||
"warpConfigsDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP."
|
"warpRoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP."
|
||||||
"Template" = "Template Konfigurasi Xray Lanjutan"
|
"Template" = "Template Konfigurasi Xray Lanjutan"
|
||||||
"TemplateDesc" = "File konfigurasi Xray akhir akan dibuat berdasarkan template ini."
|
"TemplateDesc" = "File konfigurasi Xray akhir akan dibuat berdasarkan template ini."
|
||||||
"FreedomStrategy" = "Strategi Protokol Freedom"
|
"FreedomStrategy" = "Strategi Protokol Freedom"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"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."
|
"TorrentDesc" = "Memblokir protokol BitTorrent."
|
||||||
"PrivateIp" = "Blokir Koneksi ke IP Pribadi"
|
|
||||||
"PrivateIpDesc" = "Memblokir pembentukan koneksi ke rentang IP pribadi."
|
|
||||||
"Ads" = "Blokir Iklan"
|
|
||||||
"AdsDesc" = "Memblokir situs web periklanan."
|
|
||||||
"Family" = "Proteksi Keluarga"
|
"Family" = "Proteksi Keluarga"
|
||||||
"FamilyDesc" = "Memblokir konten dewasa dan situs web berbahaya."
|
"FamilyDesc" = "Memblokir konten dewasa dan situs web berbahaya."
|
||||||
"Security" = "Pelindung Keamanan"
|
|
||||||
"SecurityDesc" = "Memblokir situs web malware, phishing, dan penambang kripto."
|
|
||||||
"Speedtest" = "Blokir Speedtest"
|
|
||||||
"SpeedtestDesc" = "Memblokir pembentukan koneksi ke situs web speedtest."
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "Rute lalu lintas ke Google melalui IPv4."
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Rute lalu lintas ke Netflix melalui IPv4."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Tambahkan pengalihan untuk Google melalui WARP."
|
|
||||||
"OpenAIWARP" = "ChatGPT"
|
|
||||||
"OpenAIWARPDesc" = "Rute lalu lintas ke ChatGPT melalui WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Rute lalu lintas ke Netflix melalui WARP."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Merutekan lalu lintas ke Meta (Instagram, Facebook, WhatsApp, Threads,...) melalui WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Merutekan lalu lintas ke Apple melalui WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Merutekan lalu lintas ke Reddit melalui WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Rute lalu lintas ke Spotify melalui WARP."
|
|
||||||
"IRWARP" = "Domain Iran"
|
|
||||||
"IRWARPDesc" = "Rute lalu lintas ke domain Iran melalui WARP."
|
|
||||||
"Inbounds" = "Masuk"
|
"Inbounds" = "Masuk"
|
||||||
"InboundsDesc" = "Menerima klien tertentu."
|
"InboundsDesc" = "Menerima klien tertentu."
|
||||||
"Outbounds" = "Keluar"
|
"Outbounds" = "Keluar"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário."
|
"logConfigsDesc" = "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário."
|
||||||
"blockConfigs" = "Escudo de Proteção"
|
"blockConfigs" = "Escudo de Proteção"
|
||||||
"blockConfigsDesc" = "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados."
|
"blockConfigsDesc" = "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados."
|
||||||
"blockConnectionsConfigs" = "Bloquear Conexões"
|
"basicRouting" = "Roteamento Básico"
|
||||||
"blockConnectionsConfigsDesc" = "Essas opções bloquearão o tráfego com base no país solicitado."
|
"blockConnectionsConfigsDesc" = "Essas opções bloquearão o tráfego com base no país solicitado."
|
||||||
"directConnectionsConfigs" = "Conexões Diretas"
|
|
||||||
"directConnectionsConfigsDesc" = "Uma conexão direta garante que o tráfego específico não seja roteado por outro servidor."
|
"directConnectionsConfigsDesc" = "Uma conexão direta garante que o tráfego específico não seja roteado por outro servidor."
|
||||||
"blockips" = "Bloquear IPs"
|
"blockips" = "Bloquear IPs"
|
||||||
"blockdomains" = "Bloquear Domínios"
|
"blockdomains" = "Bloquear Domínios"
|
||||||
"directips" = "IPs Diretos"
|
"directips" = "IPs Diretos"
|
||||||
"directdomains" = "Domínios Diretos"
|
"directdomains" = "Domínios Diretos"
|
||||||
"ipv4Configs" = "Roteamento IPv4"
|
"ipv4Routing" = "Roteamento IPv4"
|
||||||
"ipv4ConfigsDesc" = "Essas opções roteam o tráfego para um destino específico via IPv4."
|
"ipv4RoutingDesc" = "Essas opções roteam o tráfego para um destino específico via IPv4."
|
||||||
"warpConfigs" = "Roteamento WARP"
|
"warpRouting" = "Roteamento WARP"
|
||||||
"warpConfigsDesc" = "Essas opções roteam o tráfego para um destino específico via WARP."
|
"warpRoutingDesc" = "Essas opções roteam o tráfego para um destino específico via WARP."
|
||||||
"Template" = "Modelo de Configuração Avançada do Xray"
|
"Template" = "Modelo de Configuração Avançada do Xray"
|
||||||
"TemplateDesc" = "O arquivo final de configuração do Xray será gerado com base neste modelo."
|
"TemplateDesc" = "O arquivo final de configuração do Xray será gerado com base neste modelo."
|
||||||
"FreedomStrategy" = "Estratégia do Protocolo Freedom"
|
"FreedomStrategy" = "Estratégia do Protocolo Freedom"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Definir a estratégia geral de roteamento de tráfego para resolver todas as solicitações."
|
"RoutingStrategyDesc" = "Definir a estratégia geral de roteamento de tráfego para resolver todas as solicitações."
|
||||||
"Torrent" = "Bloquear Protocolo BitTorrent"
|
"Torrent" = "Bloquear Protocolo BitTorrent"
|
||||||
"TorrentDesc" = "Bloqueia o protocolo BitTorrent."
|
"TorrentDesc" = "Bloqueia o protocolo BitTorrent."
|
||||||
"PrivateIp" = "Bloquear Conexão para IPs Privados"
|
|
||||||
"PrivateIpDesc" = "Bloqueia a conexão com faixas de IP privadas."
|
|
||||||
"Ads" = "Bloquear Anúncios"
|
|
||||||
"AdsDesc" = "Bloqueia sites de publicidade."
|
|
||||||
"Family" = "Proteção Familiar"
|
"Family" = "Proteção Familiar"
|
||||||
"FamilyDesc" = "Bloqueia conteúdo adulto e sites maliciosos."
|
"FamilyDesc" = "Bloqueia conteúdo adulto e sites maliciosos."
|
||||||
"Security" = "Escudo de Segurança"
|
|
||||||
"SecurityDesc" = "Bloqueia sites de malware, phishing e mineradores de criptomoedas."
|
|
||||||
"Speedtest" = "Bloquear Speedtest"
|
|
||||||
"SpeedtestDesc" = "Bloqueia a conexão com sites de teste de velocidade."
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "Roteia tráfego para o Google via IPv4."
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Roteia tráfego para a Netflix via IPv4."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Adiciona roteamento para o Google via WARP."
|
|
||||||
"OpenAIWARP" = "ChatGPT"
|
|
||||||
"OpenAIWARPDesc" = "Roteia tráfego para o ChatGPT via WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Roteia tráfego para a Netflix via WARP."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Roteia tráfego para Meta (Instagram, Facebook, WhatsApp, Threads,...) via WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Roteia tráfego para a Apple via WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Roteia tráfego para o Reddit via WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Roteia tráfego para o Spotify via WARP."
|
|
||||||
"IRWARP" = "Domínios do Irã"
|
|
||||||
"IRWARPDesc" = "Roteia tráfego para domínios do Irã via WARP."
|
|
||||||
"Inbounds" = "Inbounds"
|
"Inbounds" = "Inbounds"
|
||||||
"InboundsDesc" = "Aceitar clientes específicos."
|
"InboundsDesc" = "Aceitar clientes específicos."
|
||||||
"Outbounds" = "Outbounds"
|
"Outbounds" = "Outbounds"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Журналы могут повлиять на эффективность вашего сервера. Рекомендуется включать их с умом только в случае ваших нужд!"
|
"logConfigsDesc" = "Журналы могут повлиять на эффективность вашего сервера. Рекомендуется включать их с умом только в случае ваших нужд!"
|
||||||
"blockConfigs" = "Блокировка конфигураций"
|
"blockConfigs" = "Блокировка конфигураций"
|
||||||
"blockConfigsDesc" = "Эти параметры не позволят пользователям подключаться к определенным протоколам и веб-сайтам"
|
"blockConfigsDesc" = "Эти параметры не позволят пользователям подключаться к определенным протоколам и веб-сайтам"
|
||||||
"blockConnectionsConfigs" = "Блокировать соединения"
|
"basicRouting" = "Базовые соединения"
|
||||||
"blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от запрашиваемой страны."
|
"blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от запрашиваемой страны."
|
||||||
"directConnectionsConfigs" = "Прямые соединения"
|
|
||||||
"directConnectionsConfigsDesc" = "Прямое соединение гарантирует, что определенный трафик не будет перенаправлен через другой сервер."
|
"directConnectionsConfigsDesc" = "Прямое соединение гарантирует, что определенный трафик не будет перенаправлен через другой сервер."
|
||||||
"blockips" = "Блокировать IP"
|
"blockips" = "Блокировать IP"
|
||||||
"blockdomains" = "Блокировать домены"
|
"blockdomains" = "Блокировать домены"
|
||||||
"directips" = "Прямые IP"
|
"directips" = "Прямые IP"
|
||||||
"directdomains" = "Прямые домены"
|
"directdomains" = "Прямые домены"
|
||||||
"ipv4Configs" = "Настройки IPv4"
|
"ipv4Routing" = "Правила IPv4"
|
||||||
"ipv4ConfigsDesc" = "Эти параметры позволят пользователям маршрутизироваться к целевым доменам только через IPv4"
|
"ipv4RoutingDesc" = "Эти параметры позволят пользователям маршрутизироваться к целевым доменам только через IPv4"
|
||||||
"warpConfigs" = "Настройки WARP"
|
"warpRouting" = "Правила WARP"
|
||||||
"warpConfigsDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare"
|
"warpRoutingDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare"
|
||||||
"Template" = "Шаблон конфигурации Xray"
|
"Template" = "Шаблон конфигурации Xray"
|
||||||
"TemplateDesc" = "Создание файла конфигурации Xray на основе этого шаблона"
|
"TemplateDesc" = "Создание файла конфигурации Xray на основе этого шаблона"
|
||||||
"FreedomStrategy" = "Настройка стратегии протокола Freedom"
|
"FreedomStrategy" = "Настройка стратегии протокола Freedom"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS"
|
"RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS"
|
||||||
"Torrent" = "Запрет использования BitTorrent"
|
"Torrent" = "Запрет использования BitTorrent"
|
||||||
"TorrentDesc" = "Изменение шаблона конфигурации для предупреждения использования BitTorrent пользователями"
|
"TorrentDesc" = "Изменение шаблона конфигурации для предупреждения использования BitTorrent пользователями"
|
||||||
"PrivateIp" = "Запрет частных диапазонов IP-адресов для подключения"
|
|
||||||
"PrivateIpDesc" = "Изменение шаблона конфигурации для предупреждения подключения к диапазонам частных IP-адресов"
|
|
||||||
"Ads" = "Блокировка рекламы"
|
|
||||||
"AdsDesc" = "Изменение конфигурации для блокировки рекламы"
|
|
||||||
"Family" = "Блокируйте вредоносное ПО и контент для взрослых"
|
"Family" = "Блокируйте вредоносное ПО и контент для взрослых"
|
||||||
"FamilyDesc" = "DNS-преобразователи Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
|
"FamilyDesc" = "DNS-преобразователи Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
|
||||||
"Security" = "Блокируйте вредоносное ПО, фишинговые сайты и сайты криптомайнеров"
|
|
||||||
"SecurityDesc" = "Изменение шаблона конфигурации для защиты безопасности."
|
|
||||||
"Speedtest" = "Блокировать сайты для проверки скорости"
|
|
||||||
"SpeedtestDesc" = "Изменение шаблона конфигурации для предупреждения подключения к веб-сайтам для тестирования скорости"
|
|
||||||
"GoogleIPv4" = "Использовать IPv4 для Google"
|
|
||||||
"GoogleIPv4Desc" = "Добавить маршрутизацию для Google для подключения к IPv4"
|
|
||||||
"NetflixIPv4" = "Использовать IPv4 для Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Добавить маршрутизацию для Netflix для подключения к IPv4"
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Направляет трафик в Google через WARP."
|
|
||||||
"OpenAIWARP" = "OpenAI (ChatGPT)"
|
|
||||||
"OpenAIWARPDesc" = "Направляет трафик в OpenAI (ChatGPT) через WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Направляет трафик в Netflix через WARP."
|
|
||||||
"MetaWARP" = "Мета"
|
|
||||||
"MetaWARPDesc" = "Направляет трафик в Meta (Instagram, Facebook, WhatsApp, Threads...) через WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Направляет трафик в Apple через WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Направляет трафик в Reddit через WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Направляет трафик в Spotify через WARP."
|
|
||||||
"IRWARP" = "Маршрутизация доменов Ирана через WARP"
|
|
||||||
"IRWARPDesc" = "Добавить маршрутизацию для доменов Ирана через WARP"
|
|
||||||
"Inbounds" = "Входящие"
|
"Inbounds" = "Входящие"
|
||||||
"InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных пользователей"
|
"InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных пользователей"
|
||||||
"Outbounds" = "Исходящие"
|
"Outbounds" = "Исходящие"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir"
|
"logConfigsDesc" = "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir"
|
||||||
"blockConfigs" = "Koruma Kalkanı"
|
"blockConfigs" = "Koruma Kalkanı"
|
||||||
"blockConfigsDesc" = "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller."
|
"blockConfigsDesc" = "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller."
|
||||||
"blockConnectionsConfigs" = "Bağlantıları Engelle"
|
"basicRouting" = "Temel Yönlendirme"
|
||||||
"blockConnectionsConfigsDesc" = "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir."
|
"blockConnectionsConfigsDesc" = "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir."
|
||||||
"directConnectionsConfigs" = "Doğrudan Bağlantılar"
|
|
||||||
"directConnectionsConfigsDesc" = "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmediğini sağlar."
|
"directConnectionsConfigsDesc" = "Doğrudan bağlantı, belirli bir trafiğin başka bir sunucu üzerinden yönlendirilmediğini sağlar."
|
||||||
"blockips" = "IP'leri Engelle"
|
"blockips" = "IP'leri Engelle"
|
||||||
"blockdomains" = "Alan Adlarını Engelle"
|
"blockdomains" = "Alan Adlarını Engelle"
|
||||||
"directips" = "Doğrudan IP'ler"
|
"directips" = "Doğrudan IP'ler"
|
||||||
"directdomains" = "Doğrudan Alan Adları"
|
"directdomains" = "Doğrudan Alan Adları"
|
||||||
"ipv4Configs" = "IPv4 Yönlendirme"
|
"ipv4Routing" = "IPv4 Yönlendirme"
|
||||||
"ipv4ConfigsDesc" = "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir."
|
"ipv4RoutingDesc" = "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir."
|
||||||
"warpConfigs" = "WARP Yönlendirme"
|
"warpRouting" = "WARP Yönlendirme"
|
||||||
"warpConfigsDesc" = "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir."
|
"warpRoutingDesc" = "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir."
|
||||||
"Template" = "Gelişmiş Xray Yapılandırma Şablonu"
|
"Template" = "Gelişmiş Xray Yapılandırma Şablonu"
|
||||||
"TemplateDesc" = "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır."
|
"TemplateDesc" = "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır."
|
||||||
"FreedomStrategy" = "Freedom Protokol Stratejisi"
|
"FreedomStrategy" = "Freedom Protokol Stratejisi"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın."
|
"RoutingStrategyDesc" = "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın."
|
||||||
"Torrent" = "BitTorrent Protokolünü Engelle"
|
"Torrent" = "BitTorrent Protokolünü Engelle"
|
||||||
"TorrentDesc" = "BitTorrent protokolünü engeller."
|
"TorrentDesc" = "BitTorrent protokolünü engeller."
|
||||||
"PrivateIp" = "Özel IP'lere Bağlantıyı Engelle"
|
|
||||||
"PrivateIpDesc" = "Özel IP aralıklarına bağlantı kurmayı engeller."
|
|
||||||
"Ads" = "Reklamları Engelle"
|
|
||||||
"AdsDesc" = "Reklam web sitelerini engeller."
|
|
||||||
"Family" = "Aile Koruması"
|
"Family" = "Aile Koruması"
|
||||||
"FamilyDesc" = "Yetişkin içerikli ve kötü amaçlı yazılım web sitelerini engeller."
|
"FamilyDesc" = "Yetişkin içerikli ve kötü amaçlı yazılım web sitelerini engeller."
|
||||||
"Security" = "Güvenlik Kalkanı"
|
|
||||||
"SecurityDesc" = "Kötü amaçlı yazılım, kimlik avı ve kripto madencilik web sitelerini engeller."
|
|
||||||
"Speedtest" = "Speedtest Bağlantısını Engelle"
|
|
||||||
"SpeedtestDesc" = "Speedtest web sitelerine bağlantı kurmayı engeller."
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "Google'a trafiği IPv4 üzerinden yönlendirir."
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Netflix'e trafiği IPv4 üzerinden yönlendirir."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Google'a trafiği WARP üzerinden yönlendirir."
|
|
||||||
"OpenAIWARP" = "ChatGPT"
|
|
||||||
"OpenAIWARPDesc" = "ChatGPT'ye trafiği WARP üzerinden yönlendirir."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Netflix'e trafiği WARP üzerinden yönlendirir."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Meta'ya (Instagram, Facebook, WhatsApp, Threads,...) trafiği WARP üzerinden yönlendirir."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Apple'a trafiği WARP üzerinden yönlendirir."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Reddit'e trafiği WARP üzerinden yönlendirir."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Spotify'a trafiği WARP üzerinden yönlendirir."
|
|
||||||
"IRWARP" = "İran alan adları"
|
|
||||||
"IRWARPDesc" = "İran alan adlarına trafiği WARP üzerinden yönlendirir."
|
|
||||||
"Inbounds" = "Gelenler"
|
"Inbounds" = "Gelenler"
|
||||||
"InboundsDesc" = "Belirli müşterileri kabul eder."
|
"InboundsDesc" = "Belirli müşterileri kabul eder."
|
||||||
"Outbounds" = "Gidenler"
|
"Outbounds" = "Gidenler"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Журнали можуть вплинути на ефективність вашого сервера. Рекомендується вмикати його з розумом лише у випадку ваших потреб"
|
"logConfigsDesc" = "Журнали можуть вплинути на ефективність вашого сервера. Рекомендується вмикати його з розумом лише у випадку ваших потреб"
|
||||||
"blockConfigs" = "Захисний екран"
|
"blockConfigs" = "Захисний екран"
|
||||||
"blockConfigsDesc" = "Ці параметри блокуватимуть трафік на основі конкретних запитуваних протоколів і веб-сайтів."
|
"blockConfigsDesc" = "Ці параметри блокуватимуть трафік на основі конкретних запитуваних протоколів і веб-сайтів."
|
||||||
"blockConnectionsConfigs" = "Блокувати з'єднання"
|
"basicRouting" = "Основна Маршрутизація"
|
||||||
"blockConnectionsConfigsDesc" = "Ці параметри блокуватимуть трафік на основі запитаних країн."
|
"blockConnectionsConfigsDesc" = "Ці параметри блокуватимуть трафік на основі запитаних країн."
|
||||||
"directConnectionsConfigs" = "Прямі з'єднання"
|
|
||||||
"directConnectionsConfigsDesc" = "Пряме з'єднання гарантує, що певний трафік не буде маршрутизовано через інший сервер."
|
"directConnectionsConfigsDesc" = "Пряме з'єднання гарантує, що певний трафік не буде маршрутизовано через інший сервер."
|
||||||
"blockips" = "Блокувати IP"
|
"blockips" = "Блокувати IP"
|
||||||
"blockdomains" = "Блокувати домени"
|
"blockdomains" = "Блокувати домени"
|
||||||
"directips" = "Прямі IP"
|
"directips" = "Прямі IP"
|
||||||
"directdomains" = "Прямі домени"
|
"directdomains" = "Прямі домени"
|
||||||
"ipv4Configs" = "Маршрутизація IPv4"
|
"ipv4Routing" = "Маршрутизація IPv4"
|
||||||
"ipv4ConfigsDesc" = "Ці параметри спрямовуватимуть трафік на основі певного призначення через IPv4."
|
"ipv4RoutingDesc" = "Ці параметри спрямовуватимуть трафік на основі певного призначення через IPv4."
|
||||||
"warpConfigs" = "WARP маршрутизація"
|
"warpRouting" = "WARP Маршрутизація"
|
||||||
"warpConfigsDesc" = "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через WARP."
|
"warpRoutingDesc" = "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через WARP."
|
||||||
"Template" = "Шаблон розширеної конфігурації Xray"
|
"Template" = "Шаблон розширеної конфігурації Xray"
|
||||||
"TemplateDesc" = "Остаточний конфігураційний файл Xray буде створено на основі цього шаблону."
|
"TemplateDesc" = "Остаточний конфігураційний файл Xray буде створено на основі цього шаблону."
|
||||||
"FreedomStrategy" = "Стратегія протоколу свободи"
|
"FreedomStrategy" = "Стратегія протоколу свободи"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Установити загальну стратегію маршрутизації трафіку для вирішення всіх запитів."
|
"RoutingStrategyDesc" = "Установити загальну стратегію маршрутизації трафіку для вирішення всіх запитів."
|
||||||
"Torrent" = "Блокувати протокол BitTorrent"
|
"Torrent" = "Блокувати протокол BitTorrent"
|
||||||
"TorrentDesc" = "Блокує протокол BitTorrent."
|
"TorrentDesc" = "Блокує протокол BitTorrent."
|
||||||
"PrivateIp" = "Блокувати підключення до приватних IP-адрес"
|
|
||||||
"PrivateIpDesc" = "Блокує встановлення підключень до приватних діапазонів IP."
|
|
||||||
"Ads" = "Блокувати рекламу"
|
|
||||||
"AdsDesc" = "Блокує рекламні веб-сайти."
|
|
||||||
"Family" = "Захист сім'ї"
|
"Family" = "Захист сім'ї"
|
||||||
"FamilyDesc" = "Блокує вміст для дорослих і веб-сайти з шкідливими програмами."
|
"FamilyDesc" = "Блокує вміст для дорослих і веб-сайти з шкідливими програмами."
|
||||||
"Security" = "Щит безпеки"
|
|
||||||
"SecurityDesc" = "Блокує веб-сайти шкідливого програмного забезпечення, фішингу та майнерів."
|
|
||||||
"Speedtest" = "Заблокувати Speedtest"
|
|
||||||
"SpeedtestDesc" = "Блокує підключення до веб-сайтів для тестування швидкості."
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "Направляє трафік до Google через IPv4."
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Направляє трафік до Netflix через IPv4."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Додати маршрутизацію для Google через WARP."
|
|
||||||
"OpenAIWARP" = "ChatGPT"
|
|
||||||
"OpenAIWARPDesc" = "Направляє трафік до ChatGPT через WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Направляє трафік до Netflix через WARP."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Направляє трафік до Meta (Instagram, Facebook, WhatsApp, Threads,...) через WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Направляє трафік до Apple через WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Направляє трафік до Reddit через WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Направляє трафік до Spotify через WARP."
|
|
||||||
"IRWARP" = "Іранські домени"
|
|
||||||
"IRWARPDesc" = "Направляє трафік до доменів Ірану через WARP"
|
|
||||||
"Inbounds" = "Вхідні"
|
"Inbounds" = "Вхідні"
|
||||||
"InboundsDesc" = "Прийняття певних клієнтів."
|
"InboundsDesc" = "Прийняття певних клієнтів."
|
||||||
"Outbounds" = "Вихід"
|
"Outbounds" = "Вихід"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "Nhật ký có thể ảnh hưởng đến hiệu suất máy chủ của bạn. Bạn chỉ nên kích hoạt nó một cách khôn ngoan trong trường hợp bạn cần"
|
"logConfigsDesc" = "Nhật ký có thể ảnh hưởng đến hiệu suất máy chủ của bạn. Bạn chỉ nên kích hoạt nó một cách khôn ngoan trong trường hợp bạn cần"
|
||||||
"blockConfigs" = "Cấu hình Chặn"
|
"blockConfigs" = "Cấu hình Chặn"
|
||||||
"blockConfigsDesc" = "Những tùy chọn này sẽ ngăn người dùng kết nối đến các giao thức và trang web cụ thể."
|
"blockConfigsDesc" = "Những tùy chọn này sẽ ngăn người dùng kết nối đến các giao thức và trang web cụ thể."
|
||||||
"blockConnectionsConfigs" = "Chặn Kết Nối"
|
"basicRouting" = "Định tuyến Cơ bản"
|
||||||
"blockConnectionsConfigsDesc" = "Các tùy chọn này sẽ chặn lưu lượng truy cập dựa trên quốc gia được yêu cầu cụ thể."
|
"blockConnectionsConfigsDesc" = "Các tùy chọn này sẽ chặn lưu lượng truy cập dựa trên quốc gia được yêu cầu cụ thể."
|
||||||
"directConnectionsConfigs" = "Kết Nối Trực Tiếp"
|
|
||||||
"directConnectionsConfigsDesc" = "Kết nối trực tiếp đảm bảo rằng lưu lượng truy cập cụ thể không được định tuyến qua máy chủ khác."
|
"directConnectionsConfigsDesc" = "Kết nối trực tiếp đảm bảo rằng lưu lượng truy cập cụ thể không được định tuyến qua máy chủ khác."
|
||||||
"blockips" = "Chặn IP"
|
"blockips" = "Chặn IP"
|
||||||
"blockdomains" = "Chặn Tên Miền"
|
"blockdomains" = "Chặn Tên Miền"
|
||||||
"directips" = "IP Trực Tiếp"
|
"directips" = "IP Trực Tiếp"
|
||||||
"directdomains" = "Tên Miền Trực Tiếp"
|
"directdomains" = "Tên Miền Trực Tiếp"
|
||||||
"ipv4Configs" = "Cấu hình IPv4"
|
"ipv4Routing" = "Định tuyến IPv4"
|
||||||
"ipv4ConfigsDesc" = "Những tùy chọn này sẽ chỉ định kết nối đến các tên miền mục tiêu qua IPv4."
|
"ipv4RoutingDesc" = "Những tùy chọn này sẽ chỉ định kết nối đến các tên miền mục tiêu qua IPv4."
|
||||||
"warpConfigs" = "Cấu hình WARP"
|
"warpRouting" = "Định tuyến WARP"
|
||||||
"warpConfigsDesc" = "Cảnh báo: Trước khi sử dụng những tùy chọn này, hãy cài đặt WARP ở chế độ proxy socks5 trên máy chủ của bạn bằng cách làm theo các bước trên GitHub của bảng điều khiển. WARP sẽ định tuyến lưu lượng đến các trang web qua máy chủ Cloudflare."
|
"warpRoutingDesc" = "Cảnh báo: Trước khi sử dụng những tùy chọn này, hãy cài đặt WARP ở chế độ proxy socks5 trên máy chủ của bạn bằng cách làm theo các bước trên GitHub của bảng điều khiển. WARP sẽ định tuyến lưu lượng đến các trang web qua máy chủ Cloudflare."
|
||||||
"Template" = "Mẫu Cấu hình Xray"
|
"Template" = "Mẫu Cấu hình Xray"
|
||||||
"TemplateDesc" = "Tạo tệp cấu hình Xray cuối cùng dựa trên mẫu này."
|
"TemplateDesc" = "Tạo tệp cấu hình Xray cuối cùng dựa trên mẫu này."
|
||||||
"FreedomStrategy" = "Cấu hình Chiến lược cho Giao thức Freedom"
|
"FreedomStrategy" = "Cấu hình Chiến lược cho Giao thức Freedom"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "Đặt chiến lược định tuyến tổng thể cho việc giải quyết DNS."
|
"RoutingStrategyDesc" = "Đặt chiến lược định tuyến tổng thể cho việc giải quyết DNS."
|
||||||
"Torrent" = "Cấu hình sử dụng BitTorrent"
|
"Torrent" = "Cấu hình sử dụng BitTorrent"
|
||||||
"TorrentDesc" = "Thay đổi mẫu cấu hình để tránh việc người dùng sử dụng BitTorrent."
|
"TorrentDesc" = "Thay đổi mẫu cấu hình để tránh việc người dùng sử dụng BitTorrent."
|
||||||
"PrivateIp" = "Cấm kết nối đến dải IP Riêng tư"
|
|
||||||
"PrivateIpDesc" = "Thay đổi mẫu cấu hình để tránh kết nối đến dải IP riêng tư."
|
|
||||||
"Ads" = "Chặn Quảng cáo"
|
|
||||||
"AdsDesc" = "Thay đổi mẫu cấu hình để chặn quảng cáo."
|
|
||||||
"Family" = "Chặn phần mềm độc hại và nội dung người lớn"
|
"Family" = "Chặn phần mềm độc hại và nội dung người lớn"
|
||||||
"FamilyDesc" = "Trình phân giải DNS của Cloudflare để chặn phần mềm độc hại và nội dung người lớn để bảo vệ gia đình."
|
"FamilyDesc" = "Trình phân giải DNS của Cloudflare để chặn phần mềm độc hại và nội dung người lớn để bảo vệ gia đình."
|
||||||
"Security" = "Chặn các trang web chứa phần mềm độc hại, lừa đảo và khai thác tiền điện tử"
|
|
||||||
"SecurityDesc" = "Thay đổi mẫu cấu hình để bảo vệ Bảo mật."
|
|
||||||
"Speedtest" = "Chặn Trang web Speedtest"
|
|
||||||
"SpeedtestDesc" = "Thay đổi mẫu cấu hình để tránh kết nối đến các trang web Speedtest."
|
|
||||||
"GoogleIPv4" = "Sử dụng IPv4 cho Google"
|
|
||||||
"GoogleIPv4Desc" = "Thêm định tuyến cho Google để kết nối qua IPv4."
|
|
||||||
"NetflixIPv4" = "Sử dụng IPv4 cho Netflix"
|
|
||||||
"NetflixIPv4Desc" = "Thêm định tuyến cho Netflix để kết nối qua IPv4."
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "Định tuyến lưu lượng truy cập tới Google thông qua WARP."
|
|
||||||
"OpenAIWARP" = "OpenAI (ChatGPT)"
|
|
||||||
"OpenAIWARPDesc" = "Định tuyến lưu lượng truy cập tới OpenAI (ChatGPT) thông qua WARP."
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "Định tuyến lưu lượng truy cập tới Netflix thông qua WARP."
|
|
||||||
"MetaWARP" = "Meta"
|
|
||||||
"MetaWARPDesc" = "Định tuyến lưu lượng truy cập tới Meta (Instagram, Facebook, WhatsApp, Threads,...) thông qua WARP."
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "Định tuyến lưu lượng truy cập tới Apple thông qua WARP."
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "Định tuyến lưu lượng truy cập tới Reddit thông qua WARP."
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "Định tuyến lưu lượng truy cập tới Spotify thông qua WARP."
|
|
||||||
"IRWARP" = "Định tuyến tên miền của Iran qua WARP."
|
|
||||||
"IRWARPDesc" = "Thêm định tuyến cho các tên miền của Iran qua WARP."
|
|
||||||
"Inbounds" = "Đầu vào"
|
"Inbounds" = "Đầu vào"
|
||||||
"InboundsDesc" = "Thay đổi mẫu cấu hình để chấp nhận các máy khách cụ thể."
|
"InboundsDesc" = "Thay đổi mẫu cấu hình để chấp nhận các máy khách cụ thể."
|
||||||
"Outbounds" = "Đầu ra"
|
"Outbounds" = "Đầu ra"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "日志可能会影响服务器的性能,建议仅在需要时启用"
|
"logConfigsDesc" = "日志可能会影响服务器的性能,建议仅在需要时启用"
|
||||||
"blockConfigs" = "防护屏蔽"
|
"blockConfigs" = "防护屏蔽"
|
||||||
"blockConfigsDesc" = "这些选项将阻止用户连接到特定协议和网站"
|
"blockConfigsDesc" = "这些选项将阻止用户连接到特定协议和网站"
|
||||||
"blockConnectionsConfigs" = "阻止连接"
|
"basicRouting" = "基本路由"
|
||||||
"blockConnectionsConfigsDesc" = "这些选项将根据特定的请求国家阻止流量。"
|
"blockConnectionsConfigsDesc" = "这些选项将根据特定的请求国家阻止流量。"
|
||||||
"directConnectionsConfigs" = "直接连接"
|
|
||||||
"directConnectionsConfigsDesc" = "直接连接确保特定的流量不会通过其他服务器路由。"
|
"directConnectionsConfigsDesc" = "直接连接确保特定的流量不会通过其他服务器路由。"
|
||||||
"blockips" = "阻止IP"
|
"blockips" = "阻止IP"
|
||||||
"blockdomains" = "阻止域名"
|
"blockdomains" = "阻止域名"
|
||||||
"directips" = "直接IP"
|
"directips" = "直接IP"
|
||||||
"directdomains" = "直接域名"
|
"directdomains" = "直接域名"
|
||||||
"ipv4Configs" = "IPv4 路由"
|
"ipv4Routing" = "IPv4 路由"
|
||||||
"ipv4ConfigsDesc" = "此选项将仅通过 IPv4 路由到目标域"
|
"ipv4RoutingDesc" = "此选项将仅通过 IPv4 路由到目标域"
|
||||||
"warpConfigs" = "WARP 路由"
|
"warpRouting" = "WARP 路由"
|
||||||
"warpConfigsDesc" = "注意:在使用这些选项之前,请按照面板 GitHub 上的步骤在你的服务器上以 socks5 代理模式安装 WARP。WARP 将通过 Cloudflare 服务器将流量路由到网站。"
|
"warpRoutingDesc" = "注意:在使用这些选项之前,请按照面板 GitHub 上的步骤在你的服务器上以 socks5 代理模式安装 WARP。WARP 将通过 Cloudflare 服务器将流量路由到网站。"
|
||||||
"Template" = "高级 Xray 配置模板"
|
"Template" = "高级 Xray 配置模板"
|
||||||
"TemplateDesc" = "最终的 Xray 配置文件将基于此模板生成"
|
"TemplateDesc" = "最终的 Xray 配置文件将基于此模板生成"
|
||||||
"FreedomStrategy" = "Freedom 协议策略"
|
"FreedomStrategy" = "Freedom 协议策略"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "设置 DNS 解析的整体路由策略"
|
"RoutingStrategyDesc" = "设置 DNS 解析的整体路由策略"
|
||||||
"Torrent" = "屏蔽 BitTorrent 协议"
|
"Torrent" = "屏蔽 BitTorrent 协议"
|
||||||
"TorrentDesc" = "禁止使用 BitTorrent"
|
"TorrentDesc" = "禁止使用 BitTorrent"
|
||||||
"PrivateIp" = "屏蔽私有 IP"
|
|
||||||
"PrivateIpDesc" = "阻止连接到私有 IP"
|
|
||||||
"Ads" = "屏蔽广告"
|
|
||||||
"AdsDesc" = "屏蔽广告网站"
|
|
||||||
"Family" = "家庭保护"
|
"Family" = "家庭保护"
|
||||||
"FamilyDesc" = "屏蔽成人内容和恶意网站"
|
"FamilyDesc" = "屏蔽成人内容和恶意网站"
|
||||||
"Security" = "安全防护"
|
|
||||||
"SecurityDesc" = "屏蔽恶意软件、网络钓鱼和挖矿网站"
|
|
||||||
"Speedtest" = "屏蔽测速网站"
|
|
||||||
"SpeedtestDesc" = "阻止连接到测速网站"
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "通过 IPv4 将流量路由到谷歌"
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "通过 IPv4 将流量路由到 Netflix"
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "通过 WARP 将流量路由到 Google"
|
|
||||||
"OpenAIWARP" = "OpenAI (ChatGPT)"
|
|
||||||
"OpenAIWARPDesc" = "通过 WARP 将流量路由到 OpenAI (ChatGPT)"
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "通过 WARP 将流量路由到 Netflix"
|
|
||||||
"MetaWARP"="Meta"
|
|
||||||
"MetaWARPDesc" = "通过 WARP 将流量路由到 Meta(Instagram、Facebook、WhatsApp、Threads...)"
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "通过 WARP 将流量路由到 Apple"
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "通过 WARP 将流量路由到 Reddit"
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "通过 WARP 将流量路由到 Spotify"
|
|
||||||
"IRWARP" = "伊朗域名"
|
|
||||||
"IRWARPDesc" = "通过 WARP 将流量路由到伊朗域名"
|
|
||||||
"Inbounds" = "入站规则"
|
"Inbounds" = "入站规则"
|
||||||
"InboundsDesc" = "接受来自特定客户端的流量"
|
"InboundsDesc" = "接受来自特定客户端的流量"
|
||||||
"Outbounds" = "出站规则"
|
"Outbounds" = "出站规则"
|
||||||
|
|
|
@ -330,18 +330,17 @@
|
||||||
"logConfigsDesc" = "日誌可能會影響伺服器的效能,建議僅在需要時啟用"
|
"logConfigsDesc" = "日誌可能會影響伺服器的效能,建議僅在需要時啟用"
|
||||||
"blockConfigs" = "防護遮蔽"
|
"blockConfigs" = "防護遮蔽"
|
||||||
"blockConfigsDesc" = "這些選項將阻止使用者連線到特定協議和網站"
|
"blockConfigsDesc" = "這些選項將阻止使用者連線到特定協議和網站"
|
||||||
"blockConnectionsConfigs" = "阻止連線"
|
"basicRouting" = "基本路由"
|
||||||
"blockConnectionsConfigsDesc" = "這些選項將根據特定的請求國家阻止流量。"
|
"blockConnectionsConfigsDesc" = "這些選項將根據特定的請求國家阻止流量。"
|
||||||
"directConnectionsConfigs" = "直接連線"
|
|
||||||
"directConnectionsConfigsDesc" = "直接連線確保特定的流量不會通過其他伺服器路由。"
|
"directConnectionsConfigsDesc" = "直接連線確保特定的流量不會通過其他伺服器路由。"
|
||||||
"blockips" = "阻止IP"
|
"blockips" = "阻止IP"
|
||||||
"blockdomains" = "阻止域名"
|
"blockdomains" = "阻止域名"
|
||||||
"directips" = "直接IP"
|
"directips" = "直接IP"
|
||||||
"directdomains" = "直接域名"
|
"directdomains" = "直接域名"
|
||||||
"ipv4Configs" = "IPv4 路由"
|
"ipv4Routing" = "IPv4 路由"
|
||||||
"ipv4ConfigsDesc" = "此選項將僅通過 IPv4 路由到目標域"
|
"ipv4RoutingDesc" = "此選項將僅通過 IPv4 路由到目標域"
|
||||||
"warpConfigs" = "WARP 路由"
|
"warpRouting" = "WARP 路由"
|
||||||
"warpConfigsDesc" = "注意:在使用這些選項之前,請按照面板 GitHub 上的步驟在你的伺服器上以 socks5 代理模式安裝 WARP。WARP 將通過 Cloudflare 伺服器將流量路由到網站。"
|
"warpRoutingDesc" = "注意:在使用這些選項之前,請按照面板 GitHub 上的步驟在你的伺服器上以 socks5 代理模式安裝 WARP。WARP 將通過 Cloudflare 伺服器將流量路由到網站。"
|
||||||
"Template" = "高階 Xray 配置模板"
|
"Template" = "高階 Xray 配置模板"
|
||||||
"TemplateDesc" = "最終的 Xray 配置檔案將基於此模板生成"
|
"TemplateDesc" = "最終的 Xray 配置檔案將基於此模板生成"
|
||||||
"FreedomStrategy" = "Freedom 協議策略"
|
"FreedomStrategy" = "Freedom 協議策略"
|
||||||
|
@ -350,36 +349,8 @@
|
||||||
"RoutingStrategyDesc" = "設定 DNS 解析的整體路由策略"
|
"RoutingStrategyDesc" = "設定 DNS 解析的整體路由策略"
|
||||||
"Torrent" = "遮蔽 BitTorrent 協議"
|
"Torrent" = "遮蔽 BitTorrent 協議"
|
||||||
"TorrentDesc" = "禁止使用 BitTorrent"
|
"TorrentDesc" = "禁止使用 BitTorrent"
|
||||||
"PrivateIp" = "遮蔽私有 IP"
|
|
||||||
"PrivateIpDesc" = "阻止連線到私有 IP"
|
|
||||||
"Ads" = "遮蔽廣告"
|
|
||||||
"AdsDesc" = "遮蔽廣告網站"
|
|
||||||
"Family" = "家庭保護"
|
"Family" = "家庭保護"
|
||||||
"FamilyDesc" = "遮蔽成人內容和惡意網站"
|
"FamilyDesc" = "遮蔽成人內容和惡意網站"
|
||||||
"Security" = "安全防護"
|
|
||||||
"SecurityDesc" = "遮蔽惡意軟體、網路釣魚和挖礦網站"
|
|
||||||
"Speedtest" = "遮蔽測速網站"
|
|
||||||
"SpeedtestDesc" = "阻止連線到測速網站"
|
|
||||||
"GoogleIPv4" = "Google"
|
|
||||||
"GoogleIPv4Desc" = "通過 IPv4 將流量路由到谷歌"
|
|
||||||
"NetflixIPv4" = "Netflix"
|
|
||||||
"NetflixIPv4Desc" = "通過 IPv4 將流量路由到 Netflix"
|
|
||||||
"GoogleWARP" = "Google"
|
|
||||||
"GoogleWARPDesc" = "通過 WARP 將流量路由到 Google"
|
|
||||||
"OpenAIWARP" = "OpenAI (ChatGPT)"
|
|
||||||
"OpenAIWARPDesc" = "通過 WARP 將流量路由到 OpenAI (ChatGPT)"
|
|
||||||
"NetflixWARP" = "Netflix"
|
|
||||||
"NetflixWARPDesc" = "通過 WARP 將流量路由到 Netflix"
|
|
||||||
"MetaWARP"="Meta"
|
|
||||||
"MetaWARPDesc" = "通過 WARP 將流量路由到 Meta(Instagram、Facebook、WhatsApp、Threads...)"
|
|
||||||
"AppleWARP" = "Apple"
|
|
||||||
"AppleWARPDesc" = "通過 WARP 將流量路由到 Apple"
|
|
||||||
"RedditWARP" = "Reddit"
|
|
||||||
"RedditWARPDesc" = "通過 WARP 將流量路由到 Reddit"
|
|
||||||
"SpotifyWARP" = "Spotify"
|
|
||||||
"SpotifyWARPDesc" = "通過 WARP 將流量路由到 Spotify"
|
|
||||||
"IRWARP" = "伊朗域名"
|
|
||||||
"IRWARPDesc" = "通過 WARP 將流量路由到伊朗域名"
|
|
||||||
"Inbounds" = "入站規則"
|
"Inbounds" = "入站規則"
|
||||||
"InboundsDesc" = "接受來自特定客戶端的流量"
|
"InboundsDesc" = "接受來自特定客戶端的流量"
|
||||||
"Outbounds" = "出站規則"
|
"Outbounds" = "出站規則"
|
||||||
|
|
248
x-ui.sh
248
x-ui.sh
|
@ -48,6 +48,10 @@ elif [[ "${release}" == "armbian" ]]; then
|
||||||
echo "Your OS is Armbian"
|
echo "Your OS is Armbian"
|
||||||
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
|
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
|
||||||
echo "Your OS is OpenSUSE Tumbleweed"
|
echo "Your OS is OpenSUSE Tumbleweed"
|
||||||
|
elif [[ "${release}" == "openEuler" ]]; then
|
||||||
|
if [[ ${os_version} -lt 2203 ]]; then
|
||||||
|
echo -e "${red} Please use OpenEuler 22.03 or higher ${plain}\n" && exit 1
|
||||||
|
fi
|
||||||
elif [[ "${release}" == "centos" ]]; then
|
elif [[ "${release}" == "centos" ]]; then
|
||||||
if [[ ${os_version} -lt 8 ]]; then
|
if [[ ${os_version} -lt 8 ]]; then
|
||||||
echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
|
echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
|
||||||
|
@ -76,7 +80,7 @@ elif [[ "${release}" == "rocky" ]]; then
|
||||||
if [[ ${os_version} -lt 8 ]]; then
|
if [[ ${os_version} -lt 8 ]]; then
|
||||||
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
|
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
|
||||||
fi
|
fi
|
||||||
elif [[ "${release}" == "oracle" ]]; then
|
elif [[ "${release}" == "ol" ]]; then
|
||||||
if [[ ${os_version} -lt 8 ]]; then
|
if [[ ${os_version} -lt 8 ]]; then
|
||||||
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
|
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -86,6 +90,7 @@ else
|
||||||
echo "- Ubuntu 20.04+"
|
echo "- Ubuntu 20.04+"
|
||||||
echo "- Debian 11+"
|
echo "- Debian 11+"
|
||||||
echo "- CentOS 8+"
|
echo "- CentOS 8+"
|
||||||
|
echo "- OpenEuler 22.03+"
|
||||||
echo "- Fedora 36+"
|
echo "- Fedora 36+"
|
||||||
echo "- Arch Linux"
|
echo "- Arch Linux"
|
||||||
echo "- Parch Linux"
|
echo "- Parch Linux"
|
||||||
|
@ -176,7 +181,7 @@ update_menu() {
|
||||||
chmod +x /usr/local/x-ui/x-ui.sh
|
chmod +x /usr/local/x-ui/x-ui.sh
|
||||||
chmod +x /usr/bin/x-ui
|
chmod +x /usr/bin/x-ui
|
||||||
|
|
||||||
if [[ $? == 0 ]]; then
|
if [[ $? == 0 ]]; then
|
||||||
echo -e "${green}Update successful. The panel has automatically restarted.${plain}"
|
echo -e "${green}Update successful. The panel has automatically restarted.${plain}"
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
|
@ -211,7 +216,7 @@ custom_version() {
|
||||||
|
|
||||||
# Function to handle the deletion of the script file
|
# Function to handle the deletion of the script file
|
||||||
delete_script() {
|
delete_script() {
|
||||||
rm "$0" # Remove the script file itself
|
rm "$0" # Remove the script file itself
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,11 +286,10 @@ reset_webbasepath() {
|
||||||
|
|
||||||
# Apply the new web base path setting
|
# Apply the new web base path setting
|
||||||
/usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" >/dev/null 2>&1
|
/usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" >/dev/null 2>&1
|
||||||
systemctl restart x-ui
|
|
||||||
|
|
||||||
# Display confirmation message
|
|
||||||
echo -e "Web base path has been reset to: ${green}${config_webBasePath}${plain}"
|
echo -e "Web base path has been reset to: ${green}${config_webBasePath}${plain}"
|
||||||
echo -e "${green}Please use the new web base path to access the panel.${plain}"
|
echo -e "${green}Please use the new web base path to access the panel.${plain}"
|
||||||
|
restart
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_config() {
|
reset_config() {
|
||||||
|
@ -482,7 +486,7 @@ enable_bbr() {
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
|
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
|
||||||
;;
|
;;
|
||||||
centos | almalinux | rocky | oracle)
|
centos | almalinux | rocky | ol)
|
||||||
yum -y update && yum -y install ca-certificates
|
yum -y update && yum -y install ca-certificates
|
||||||
;;
|
;;
|
||||||
fedora | amzn)
|
fedora | amzn)
|
||||||
|
@ -743,39 +747,64 @@ delete_ports() {
|
||||||
}
|
}
|
||||||
|
|
||||||
update_geo() {
|
update_geo() {
|
||||||
local defaultBinFolder="/usr/local/x-ui/bin"
|
echo -e "${green}\t1.${plain} Loyalsoldier (geoip.dat, geosite.dat)"
|
||||||
read -p "Please enter x-ui bin folder path. Leave blank for default. (Default: '${defaultBinFolder}')" binFolder
|
echo -e "${green}\t2.${plain} chocolate4u (geoip_IR.dat, geosite_IR.dat)"
|
||||||
binFolder=${binFolder:-${defaultBinFolder}}
|
echo -e "${green}\t3.${plain} vuong2023 (geoip_VN.dat, geosite_VN.dat)"
|
||||||
if [[ ! -d ${binFolder} ]]; then
|
echo -e "${green}\t0.${plain} Back to Main Menu"
|
||||||
LOGE "Folder ${binFolder} not exists!"
|
read -p "Choose an option: " choice
|
||||||
LOGI "making bin folder: ${binFolder}..."
|
|
||||||
mkdir -p ${binFolder}
|
|
||||||
fi
|
|
||||||
|
|
||||||
systemctl stop x-ui
|
systemctl stop x-ui
|
||||||
cd ${binFolder}
|
cd /usr/local/x-ui/bin
|
||||||
rm -f geoip.dat geosite.dat geoip_IR.dat geosite_IR.dat geoip_VN.dat geosite_VN.dat
|
|
||||||
wget -N https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat
|
case "$choice" in
|
||||||
wget -N https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat
|
0)
|
||||||
wget -O geoip_IR.dat -N https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geoip.dat
|
show_menu
|
||||||
wget -O geosite_IR.dat -N https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geosite.dat
|
;;
|
||||||
wget -O geoip_VN.dat https://github.com/vuong2023/vn-v2ray-rules/releases/latest/download/geoip.dat
|
1)
|
||||||
wget -O geosite_VN.dat https://github.com/vuong2023/vn-v2ray-rules/releases/latest/download/geosite.dat
|
rm -f geoip.dat geosite.dat
|
||||||
|
wget -N https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat
|
||||||
|
wget -N https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat
|
||||||
|
echo -e "${green}Loyalsoldier datasets have been updated successfully!${plain}"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
rm -f geoip_IR.dat geosite_IR.dat
|
||||||
|
wget -O geoip_IR.dat -N https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geoip.dat
|
||||||
|
wget -O geosite_IR.dat -N https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geosite.dat
|
||||||
|
echo -e "${green}chocolate4u datasets have been updated successfully!${plain}"
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
rm -f geoip_VN.dat geosite_VN.dat
|
||||||
|
wget -O geoip_VN.dat -N https://github.com/vuong2023/vn-v2ray-rules/releases/latest/download/geoip.dat
|
||||||
|
wget -O geosite_VN.dat -N https://github.com/vuong2023/vn-v2ray-rules/releases/latest/download/geosite.dat
|
||||||
|
echo -e "${green}vuong2023 datasets have been updated successfully!${plain}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid option selected! No updates made."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
systemctl start x-ui
|
systemctl start x-ui
|
||||||
echo -e "${green}Geosite.dat + Geoip.dat + geoip_IR.dat + geosite_IR.dat have been updated successfully in bin folder '${binfolder}'!${plain}"
|
|
||||||
before_show_menu
|
before_show_menu
|
||||||
}
|
}
|
||||||
|
|
||||||
install_acme() {
|
install_acme() {
|
||||||
cd ~
|
# Check if acme.sh is already installed
|
||||||
LOGI "install acme..."
|
if command -v ~/.acme.sh/acme.sh &>/dev/null; then
|
||||||
curl https://get.acme.sh | sh
|
LOGI "acme.sh is already installed."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
LOGI "Installing acme.sh..."
|
||||||
|
cd ~ || return 1 # Ensure you can change to the home directory
|
||||||
|
|
||||||
|
curl -s https://get.acme.sh | sh
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
LOGE "install acme failed"
|
LOGE "Installation of acme.sh failed."
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
LOGI "install acme succeed"
|
LOGI "Installation of acme.sh succeeded."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -783,7 +812,10 @@ ssl_cert_issue_main() {
|
||||||
echo -e "${green}\t1.${plain} Get SSL"
|
echo -e "${green}\t1.${plain} Get SSL"
|
||||||
echo -e "${green}\t2.${plain} Revoke"
|
echo -e "${green}\t2.${plain} Revoke"
|
||||||
echo -e "${green}\t3.${plain} Force Renew"
|
echo -e "${green}\t3.${plain} Force Renew"
|
||||||
|
echo -e "${green}\t4.${plain} Show Existing Domains"
|
||||||
|
echo -e "${green}\t5.${plain} Set Cert paths for the panel"
|
||||||
echo -e "${green}\t0.${plain} Back to Main Menu"
|
echo -e "${green}\t0.${plain} Back to Main Menu"
|
||||||
|
|
||||||
read -p "Choose an option: " choice
|
read -p "Choose an option: " choice
|
||||||
case "$choice" in
|
case "$choice" in
|
||||||
0)
|
0)
|
||||||
|
@ -793,17 +825,87 @@ ssl_cert_issue_main() {
|
||||||
ssl_cert_issue
|
ssl_cert_issue
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
local domain=""
|
local domains=$(find /root/cert/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
|
||||||
read -p "Please enter your domain name to revoke the certificate: " domain
|
if [ -z "$domains" ]; then
|
||||||
~/.acme.sh/acme.sh --revoke -d ${domain}
|
echo "No certificates found to revoke."
|
||||||
LOGI "Certificate revoked"
|
else
|
||||||
|
echo "Existing domains:"
|
||||||
|
echo "$domains"
|
||||||
|
read -p "Please enter a domain from the list to revoke the certificate: " domain
|
||||||
|
if echo "$domains" | grep -qw "$domain"; then
|
||||||
|
~/.acme.sh/acme.sh --revoke -d ${domain}
|
||||||
|
LOGI "Certificate revoked for domain: $domain"
|
||||||
|
else
|
||||||
|
echo "Invalid domain entered."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
3)
|
3)
|
||||||
local domain=""
|
local domains=$(find /root/cert/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
|
||||||
read -p "Please enter your domain name to forcefully renew an SSL certificate: " domain
|
if [ -z "$domains" ]; then
|
||||||
~/.acme.sh/acme.sh --renew -d ${domain} --force
|
echo "No certificates found to renew."
|
||||||
|
else
|
||||||
|
echo "Existing domains:"
|
||||||
|
echo "$domains"
|
||||||
|
read -p "Please enter a domain from the list to renew the SSL certificate: " domain
|
||||||
|
if echo "$domains" | grep -qw "$domain"; then
|
||||||
|
~/.acme.sh/acme.sh --renew -d ${domain} --force
|
||||||
|
LOGI "Certificate forcefully renewed for domain: $domain"
|
||||||
|
else
|
||||||
|
echo "Invalid domain entered."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
local domains=$(find /root/cert/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
|
||||||
|
if [ -z "$domains" ]; then
|
||||||
|
echo "No certificates found."
|
||||||
|
else
|
||||||
|
echo "Existing domains and their paths:"
|
||||||
|
for domain in $domains; do
|
||||||
|
local cert_path="/root/cert/${domain}/fullchain.pem"
|
||||||
|
local key_path="/root/cert/${domain}/privkey.pem"
|
||||||
|
if [[ -f "${cert_path}" && -f "${key_path}" ]]; then
|
||||||
|
echo -e "Domain: ${domain}"
|
||||||
|
echo -e "\tCertificate Path: ${cert_path}"
|
||||||
|
echo -e "\tPrivate Key Path: ${key_path}"
|
||||||
|
else
|
||||||
|
echo -e "Domain: ${domain} - Certificate or Key missing."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
local domains=$(find /root/cert/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
|
||||||
|
if [ -z "$domains" ]; then
|
||||||
|
echo "No certificates found."
|
||||||
|
else
|
||||||
|
echo "Available domains:"
|
||||||
|
echo "$domains"
|
||||||
|
read -p "Please choose a domain to set the panel paths: " domain
|
||||||
|
|
||||||
|
if echo "$domains" | grep -qw "$domain"; then
|
||||||
|
local webCertFile="/root/cert/${domain}/fullchain.pem"
|
||||||
|
local webKeyFile="/root/cert/${domain}/privkey.pem"
|
||||||
|
|
||||||
|
if [[ -f "${webCertFile}" && -f "${webKeyFile}" ]]; then
|
||||||
|
/usr/local/x-ui/x-ui cert -webCert "$webCertFile" -webCertKey "$webKeyFile"
|
||||||
|
echo "Panel paths set for domain: $domain"
|
||||||
|
echo " - Certificate File: $webCertFile"
|
||||||
|
echo " - Private Key File: $webKeyFile"
|
||||||
|
restart
|
||||||
|
else
|
||||||
|
echo "Certificate or private key not found for domain: $domain."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Invalid domain entered."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Invalid choice"
|
||||||
;;
|
;;
|
||||||
*) echo "Invalid choice" ;;
|
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -817,12 +919,13 @@ ssl_cert_issue() {
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# install socat second
|
# install socat second
|
||||||
case "${release}" in
|
case "${release}" in
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt update && apt install socat -y
|
apt update && apt install socat -y
|
||||||
;;
|
;;
|
||||||
centos | almalinux | rocky | oracle)
|
centos | almalinux | rocky | ol)
|
||||||
yum -y update && yum -y install socat
|
yum -y update && yum -y install socat
|
||||||
;;
|
;;
|
||||||
fedora | amzn)
|
fedora | amzn)
|
||||||
|
@ -843,23 +946,23 @@ ssl_cert_issue() {
|
||||||
LOGI "install socat succeed..."
|
LOGI "install socat succeed..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# get the domain here,and we need verify it
|
# get the domain here, and we need to verify it
|
||||||
local domain=""
|
local domain=""
|
||||||
read -p "Please enter your domain name:" domain
|
read -p "Please enter your domain name: " domain
|
||||||
LOGD "your domain is:${domain},check it..."
|
LOGD "Your domain is: ${domain}, checking it..."
|
||||||
# here we need to judge whether there exists cert already
|
|
||||||
local currentCert=$(~/.acme.sh/acme.sh --list | tail -1 | awk '{print $1}')
|
|
||||||
|
|
||||||
if [ ${currentCert} == ${domain} ]; then
|
# check if there already exists a certificate
|
||||||
|
local currentCert=$(~/.acme.sh/acme.sh --list | tail -1 | awk '{print $1}')
|
||||||
|
if [ "${currentCert}" == "${domain}" ]; then
|
||||||
local certInfo=$(~/.acme.sh/acme.sh --list)
|
local certInfo=$(~/.acme.sh/acme.sh --list)
|
||||||
LOGE "system already has certs here,can not issue again,current certs details:"
|
LOGE "System already has certificates for this domain. Cannot issue again. Current certificate details:"
|
||||||
LOGI "$certInfo"
|
LOGI "$certInfo"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
LOGI "your domain is ready for issuing cert now..."
|
LOGI "Your domain is ready for issuing certificates now..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# create a directory for install cert
|
# create a directory for the certificate
|
||||||
certPath="/root/cert/${domain}"
|
certPath="/root/cert/${domain}"
|
||||||
if [ ! -d "$certPath" ]; then
|
if [ ! -d "$certPath" ]; then
|
||||||
mkdir -p "$certPath"
|
mkdir -p "$certPath"
|
||||||
|
@ -868,48 +971,70 @@ ssl_cert_issue() {
|
||||||
mkdir -p "$certPath"
|
mkdir -p "$certPath"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# get needed port here
|
# get the port number for the standalone server
|
||||||
local WebPort=80
|
local WebPort=80
|
||||||
read -p "please choose which port do you use,default will be 80 port:" WebPort
|
read -p "Please choose which port to use (default is 80): " WebPort
|
||||||
if [[ ${WebPort} -gt 65535 || ${WebPort} -lt 1 ]]; then
|
if [[ ${WebPort} -gt 65535 || ${WebPort} -lt 1 ]]; then
|
||||||
LOGE "your input ${WebPort} is invalid,will use default port"
|
LOGE "Your input ${WebPort} is invalid, will use default port 80."
|
||||||
|
WebPort=80
|
||||||
fi
|
fi
|
||||||
LOGI "will use port:${WebPort} to issue certs,please make sure this port is open..."
|
LOGI "Will use port: ${WebPort} to issue certificates. Please make sure this port is open."
|
||||||
# NOTE:This should be handled by user
|
|
||||||
# open the port and kill the occupied progress
|
# issue the certificate
|
||||||
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
|
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
|
||||||
~/.acme.sh/acme.sh --issue -d ${domain} --listen-v6 --standalone --httpport ${WebPort}
|
~/.acme.sh/acme.sh --issue -d ${domain} --listen-v6 --standalone --httpport ${WebPort}
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
LOGE "issue certs failed,please check logs"
|
LOGE "Issuing certificate failed, please check logs."
|
||||||
rm -rf ~/.acme.sh/${domain}
|
rm -rf ~/.acme.sh/${domain}
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
LOGE "issue certs succeed,installing certs..."
|
LOGE "Issuing certificate succeeded, installing certificates..."
|
||||||
fi
|
fi
|
||||||
# install cert
|
|
||||||
|
# install the certificate
|
||||||
~/.acme.sh/acme.sh --installcert -d ${domain} \
|
~/.acme.sh/acme.sh --installcert -d ${domain} \
|
||||||
--key-file /root/cert/${domain}/privkey.pem \
|
--key-file /root/cert/${domain}/privkey.pem \
|
||||||
--fullchain-file /root/cert/${domain}/fullchain.pem
|
--fullchain-file /root/cert/${domain}/fullchain.pem
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
LOGE "install certs failed,exit"
|
LOGE "Installing certificate failed, exiting."
|
||||||
rm -rf ~/.acme.sh/${domain}
|
rm -rf ~/.acme.sh/${domain}
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
LOGI "install certs succeed,enable auto renew..."
|
LOGI "Installing certificate succeeded, enabling auto renew..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# enable auto-renew
|
||||||
~/.acme.sh/acme.sh --upgrade --auto-upgrade
|
~/.acme.sh/acme.sh --upgrade --auto-upgrade
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
LOGE "auto renew failed, certs details:"
|
LOGE "Auto renew failed, certificate details:"
|
||||||
ls -lah cert/*
|
ls -lah cert/*
|
||||||
chmod 755 $certPath/*
|
chmod 755 $certPath/*
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
LOGI "auto renew succeed, certs details:"
|
LOGI "Auto renew succeeded, certificate details:"
|
||||||
ls -lah cert/*
|
ls -lah cert/*
|
||||||
chmod 755 $certPath/*
|
chmod 755 $certPath/*
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Prompt user to set panel paths after successful certificate installation
|
||||||
|
read -p "Would you like to set this certificate for the panel? (y/n): " setPanel
|
||||||
|
if [[ "$setPanel" == "y" || "$setPanel" == "Y" ]]; then
|
||||||
|
local webCertFile="/root/cert/${domain}/fullchain.pem"
|
||||||
|
local webKeyFile="/root/cert/${domain}/privkey.pem"
|
||||||
|
|
||||||
|
if [[ -f "$webCertFile" && -f "$webKeyFile" ]]; then
|
||||||
|
/usr/local/x-ui/x-ui cert -webCert "$webCertFile" -webCertKey "$webKeyFile"
|
||||||
|
LOGI "Panel paths set for domain: $domain"
|
||||||
|
LOGI " - Certificate File: $webCertFile"
|
||||||
|
LOGI " - Private Key File: $webKeyFile"
|
||||||
|
restart
|
||||||
|
else
|
||||||
|
LOGE "Error: Certificate or private key file not found for domain: $domain."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
LOGI "Skipping panel path setting."
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
ssl_cert_issue_CF() {
|
ssl_cert_issue_CF() {
|
||||||
|
@ -1022,7 +1147,6 @@ run_speedtest() {
|
||||||
# Run Speedtest
|
# Run Speedtest
|
||||||
speedtest
|
speedtest
|
||||||
}
|
}
|
||||||
|
|
||||||
create_iplimit_jails() {
|
create_iplimit_jails() {
|
||||||
# Use default bantime if not passed => 15 minutes
|
# Use default bantime if not passed => 15 minutes
|
||||||
local bantime="${1:-15}"
|
local bantime="${1:-15}"
|
||||||
|
@ -1172,7 +1296,7 @@ install_iplimit() {
|
||||||
debian | armbian)
|
debian | armbian)
|
||||||
apt update && apt install fail2ban -y
|
apt update && apt install fail2ban -y
|
||||||
;;
|
;;
|
||||||
centos | almalinux | rocky | oracle)
|
centos | almalinux | rocky | ol)
|
||||||
yum update -y && yum install epel-release -y
|
yum update -y && yum install epel-release -y
|
||||||
yum -y install fail2ban
|
yum -y install fail2ban
|
||||||
;;
|
;;
|
||||||
|
@ -1253,7 +1377,7 @@ remove_iplimit() {
|
||||||
apt-get purge -y fail2ban -y
|
apt-get purge -y fail2ban -y
|
||||||
apt-get autoremove -y
|
apt-get autoremove -y
|
||||||
;;
|
;;
|
||||||
centos | almalinux | rocky | oracle)
|
centos | almalinux | rocky | ol)
|
||||||
yum remove fail2ban -y
|
yum remove fail2ban -y
|
||||||
yum autoremove -y
|
yum autoremove -y
|
||||||
;;
|
;;
|
||||||
|
|
Loading…
Reference in a new issue