diff --git a/README.md b/README.md
index e803ab5c..552b1eea 100644
--- a/README.md
+++ b/README.md
@@ -352,8 +352,7 @@ XUI_BIN_FOLDER="bin" XUI_DB_FOLDER="/etc/x-ui" go build main.go
# Acknowledgment
- [Iran v2ray rules](https://github.com/chocolate4u/Iran-v2ray-rules) (License: **GPL-3.0**): _Enhanced v2ray/xray and v2ray/xray-clients routing rules with built-in Iranian domains and a focus on security and adblocking._
-- [Iran Hosted Domains](https://github.com/bootmortis/iran-hosted-domains) (License: **MIT**): _A comprehensive list of Iranian domains and services that are hosted within the country._
-- [PersianBlocker](https://github.com/MasterKia/PersianBlocker) (License: **AGPLv3**): _An optimal and extensive list to block ads and trackers on Persian websites._
+- [Vietnam Adblock rules](https://github.com/vuong2023/vn-v2ray-rules) (License: **GPL-3.0**): _A hosted domain hosted in Vietnam and blocklist with the most efficiency for Vietnamese._
# Suggestion System
@@ -363,7 +362,8 @@ XUI_BIN_FOLDER="bin" XUI_DB_FOLDER="/etc/x-ui" go build main.go
- Fedora 36+
- Arch Linux
- Manjaro
-- Armbian (for ARM devices)
+- Armbian
+- AlmaLinux 9+
# Pictures
diff --git a/install.sh b/install.sh
index 8c470cca..3dc2bb61 100644
--- a/install.sh
+++ b/install.sh
@@ -27,7 +27,7 @@ arch3xui() {
case "$(uname -m)" in
x86_64 | x64 | amd64) echo 'amd64' ;;
armv8* | armv8 | arm64 | aarch64) echo 'arm64' ;;
- armv7* | armv7 | arm | arm32 ) echo 'arm32' ;;
+ armv7* | armv7 | arm | arm32 ) echo 'arm' ;;
*) echo -e "${green}Unsupported CPU architecture! ${plain}" && rm -f install.sh && exit 1 ;;
esac
}
@@ -54,6 +54,11 @@ elif [[ "${release}" == "debian" ]]; then
if [[ ${os_version} -lt 10 ]]; then
echo -e "${red} Please use Debian 10 or higher ${plain}\n" && exit 1
fi
+
+elif [[ "${release}" == "almalinux" ]]; then
+ if [[ ${os_version} -lt 9 ]]; then
+ echo -e "${red} Please use AlmaLinux 9 or higher ${plain}\n" && exit 1
+ fi
elif [[ "${release}" == "arch" ]]; then
echo "Your OS is ArchLinux"
elif [[ "${release}" == "manjaro" ]]; then
@@ -67,7 +72,7 @@ fi
install_base() {
case "${release}" in
- centos|fedora)
+ centos|fedora|almalinux)
yum -y update && yum install -y -q wget curl tar
;;
arch|manjaro)
diff --git a/web/assets/css/custom.css b/web/assets/css/custom.css
index 4ef4b436..ca7d23b1 100644
--- a/web/assets/css/custom.css
+++ b/web/assets/css/custom.css
@@ -1117,3 +1117,7 @@ li.ant-select-dropdown-menu-item:empty:after {
padding: 0.5rem;
border-radius: 1rem;
}
+
+.ant-input-group-addon:not(:first-child):not(:last-child), .ant-input-group-wrap:not(:first-child):not(:last-child), .ant-input-group>.ant-input:not(:first-child):not(:last-child) {
+ border-radius: 0rem 1rem 1rem 0rem;
+}
diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js
index 5aad52dd..eb5b8c3b 100644
--- a/web/assets/js/model/outbound.js
+++ b/web/assets/js/model/outbound.js
@@ -839,12 +839,12 @@ Outbound.ShadowsocksSettings = class extends CommonClass {
}
};
Outbound.SocksSettings = class extends CommonClass {
- constructor(address, port, user, password) {
+ constructor(address, port, user, pass) {
super();
this.address = address;
this.port = port;
this.user = user;
- this.password = password;
+ this.pass = pass;
}
static fromJson(json={}) {
@@ -854,7 +854,7 @@ Outbound.SocksSettings = class extends CommonClass {
servers[0].address,
servers[0].port,
ObjectUtil.isArrEmpty(servers[0].users) ? '' : servers[0].users[0].user,
- ObjectUtil.isArrEmpty(servers[0].password) ? '' : servers[0].users[0].password,
+ ObjectUtil.isArrEmpty(servers[0].pass) ? '' : servers[0].users[0].pass,
);
}
@@ -863,18 +863,18 @@ Outbound.SocksSettings = class extends CommonClass {
servers: [{
address: this.address,
port: this.port,
- users: ObjectUtil.isEmpty(this.user) ? [] : [{user: this.user, password: this.password}],
+ users: ObjectUtil.isEmpty(this.user) ? [] : [{user: this.user, pass: this.pass}],
}],
};
}
};
Outbound.HttpSettings = class extends CommonClass {
- constructor(address, port, user, password) {
+ constructor(address, port, user, pass) {
super();
this.address = address;
this.port = port;
this.user = user;
- this.password = password;
+ this.pass = pass;
}
static fromJson(json={}) {
@@ -884,7 +884,7 @@ Outbound.HttpSettings = class extends CommonClass {
servers[0].address,
servers[0].port,
ObjectUtil.isArrEmpty(servers[0].users) ? '' : servers[0].users[0].user,
- ObjectUtil.isArrEmpty(servers[0].password) ? '' : servers[0].users[0].password,
+ ObjectUtil.isArrEmpty(servers[0].pass) ? '' : servers[0].users[0].pass,
);
}
@@ -893,7 +893,7 @@ Outbound.HttpSettings = class extends CommonClass {
servers: [{
address: this.address,
port: this.port,
- users: ObjectUtil.isEmpty(this.user) ? [] : [{user: this.user, password: this.password}],
+ users: ObjectUtil.isEmpty(this.user) ? [] : [{user: this.user, pass: this.pass}],
}],
};
}
diff --git a/web/html/login.html b/web/html/login.html
index 3ec9da2e..34eff41c 100644
--- a/web/html/login.html
+++ b/web/html/login.html
@@ -114,6 +114,7 @@
position: relative;
border-radius: 25px;
width: 100%;
+ transition: all 0.3s cubic-bezier(.645,.045,.355,1);
}
.dark .wave-btn-bg {
color: #fff;
@@ -123,7 +124,6 @@
background-origin: border-box;
background-clip: padding-box, border-box;
background-size: 300%;
- transition: all 0.3s cubic-bezier(.645,.045,.355,1);
width: 100%;
z-index: 1;
}
@@ -291,8 +291,7 @@
-
+
[[ loading ? '' : '{{ i18n "login" }}' ]]
diff --git a/web/html/xui/form/outbound.html b/web/html/xui/form/outbound.html
index 7b1caa91..590a1a93 100644
--- a/web/html/xui/form/outbound.html
+++ b/web/html/xui/form/outbound.html
@@ -94,12 +94,13 @@
+
-
+
diff --git a/web/html/xui/form/stream/stream_tcp.html b/web/html/xui/form/stream/stream_tcp.html
index 3fa0cec9..941a3d79 100644
--- a/web/html/xui/form/stream/stream_tcp.html
+++ b/web/html/xui/form/stream/stream_tcp.html
@@ -33,7 +33,7 @@
- +
+ +
diff --git a/web/html/xui/xray.html b/web/html/xui/xray.html
index 6e727d57..54f10ddf 100644
--- a/web/html/xui/xray.html
+++ b/web/html/xui/xray.html
@@ -157,6 +157,7 @@
+
@@ -544,6 +545,11 @@
"geosite:category-ads-all",
"ext:geosite_IR.dat:category-ads-all"
],
+ security: [
+ "ext:geosite_IR.dat:malware",
+ "ext:geosite_IR.dat:phishing",
+ "ext:geosite_IR.dat:cryptominers"
+ ],
speedtest: ["geosite:speedtest"],
openai: ["geosite:openai"],
google: ["geosite:google"],
@@ -560,7 +566,7 @@
ir: [
"regexp:.*\\.ir$",
"regexp:.*\\.xn--mgba3a4f16a$", // .ایران
- "ext:geosite_IR.dat:ir" // have rules to bypass all .ir domains.
+ "ext:geosite_IR.dat:ir"
],
vn: [
"regexp:.*\\.vn$",
@@ -571,9 +577,7 @@
familyProtectDNS: {
"servers": [
"1.1.1.3", // https://developers.cloudflare.com/1.1.1.1/setup/
- "1.0.0.3",
- "94.140.14.15", // https://adguard-dns.io/kb/general/dns-providers/
- "94.140.15.16"
+ "1.0.0.3"
],
"queryStrategy": "UseIPv4"
},
@@ -1182,6 +1186,18 @@
}
},
},
+ 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);
diff --git a/web/html/xui/xray_rule_modal.html b/web/html/xui/xray_rule_modal.html
index 97e396a5..9ed9e06a 100644
--- a/web/html/xui/xray_rule_modal.html
+++ b/web/html/xui/xray_rule_modal.html
@@ -36,8 +36,8 @@
-
- [[ x ]]
+
+ [[ x ]]
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index 416e540e..77e4fb79 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -59,7 +59,7 @@
"settings" = "Panel Settings"
"xray" = "Xray Settings"
"logout" = "Logout"
-"link" = "Management"
+"link" = "Manage"
[pages.login]
"title" = "Login"
@@ -79,7 +79,7 @@
"xrayStatus" = "Status"
"stopXray" = "Stop"
"restartXray" = "Restart"
-"xraySwitch" = "SwitchV"
+"xraySwitch" = "Version"
"xraySwitchClick" = "Choose the version you want to switch to."
"xraySwitchClickDesk" = "Choose wisely, as older versions may not be compatible with current configurations."
"operationHours" = "Uptime"
@@ -327,8 +327,10 @@
"PrivateIpDesc" = "Change the configuration template to avoid connecting to private IP ranges."
"Ads" = "Block Ads"
"AdsDesc" = "Change the configuration template to block ads."
-"Family" = "Block Malware and Adult Content"
-"FamilyDesc" = "DNS resolvers to block malware and adult content for family protection."
+"Family" = "Block malware and Adult Content"
+"FamilyDesc" = "Cloudflare DNS resolvers to block malware and adult content for family protection."
+"Security" = "Block Malware, Phishing and Cryptominers Websites"
+"SecurityDesc" = "Change the configuration template for Security protection."
"Speedtest" = "Block Speedtest Websites"
"SpeedtestDesc" = "Change the configuration template to avoid connecting to speedtest websites."
"IRIp" = "Disable Connection to Iran IPs"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 63da5dbf..767eef04 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -76,10 +76,10 @@
"title" = "Estado del Sistema"
"memory" = "Memoria"
"hard" = "Disco Duro"
-"xrayStatus" = "Estado de Xray"
-"stopXray" = "Detener Xray"
+"xrayStatus" = "Estado de"
+"stopXray" = "Detener"
"restartXray" = "Reiniciar"
-"xraySwitch" = "Cambiar Versión"
+"xraySwitch" = "Versión"
"xraySwitchClick" = "Elige la versión a la que deseas cambiar."
"xraySwitchClickDesk" = "Elige sabiamente, ya que las versiones anteriores pueden no ser compatibles con las configuraciones actuales."
"operationHours" = "Tiempo de Funcionamiento"
@@ -327,8 +327,10 @@
"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" = "Bloquear Malware y Contenido para Adultos"
-"FamilyDesc" = "Resolvedores de DNS para bloquear malware y contenido para adultos para protección familiar."
+"Family" = "Bloquee malware y contenido para adultos"
+"FamilyDesc" = "Resolutores de DNS de Cloudflare para bloquear malware y contenido para adultos para protección familiar."
+"Security" = "Bloquee sitios web de malware, phishing y criptomineros"
+"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."
"IRIp" = "Desactivar Conexión a Rangos de IP de Irán"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index b405761c..11ff658d 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -79,7 +79,7 @@
"xrayStatus" = "وضعیت"
"stopXray" = "توقف"
"restartXray" = "شروع مجدد"
-"xraySwitch" = "تغییر ورژن"
+"xraySwitch" = "ورژن"
"xraySwitchClick" = "ورژن مورد نظر را انتخاب کنید"
"xraySwitchClickDesk" = "لطفا با دقت انتخاب کنید ، در صورت انتخاب اشتباه امکان قطعی سیستم وجود دارد "
"operationHours" = "آپ تایم سیستم"
@@ -328,7 +328,9 @@
"Ads" = "مسدود کردن تبلیغات"
"AdsDesc" = "الگوی تنظیمات را برای مسدود کردن تبلیغات تغییر میدهد"
"Family" = "فعال کردن حالت خانواده"
-"FamilyDesc" = "برای جلوگیری از ارتباط با وبسایت های ناامن"
+"FamilyDesc" = "مسدود کردن محتوای بزرگسالان به کمک دی ان اس کلودفلر برای حالت خانواده "
+"Security" = "مسدود کردن وبسایتهای بدافزار، فیشینگ و کریپتومینرها"
+"SecurityDesc" = "الگوی پیکربندی را برای حفاظت از امنیت تغییر دهید"
"Speedtest" = "جلوگیری از اتصال به سایت های تست سرعت"
"SpeedtestDesc" = "الگوی تنظیمات را برای فیلتر کردن اتصال به سایت های تست سرعت تغییر میدهد"
"IRIp" = "جلوگیری از اتصال آیپی های ایران"
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index c2949667..721e415e 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -77,9 +77,9 @@
"memory" = "Память"
"hard" = "Жесткий диск"
"xrayStatus" = "Статус"
-"stopXray" = "Остановить Xray"
-"restartXray" = "Перезапустить Xray"
-"xraySwitch" = "Переключить версию"
+"stopXray" = "Остановить"
+"restartXray" = "Перезапустить"
+"xraySwitch" = "Версия"
"xraySwitchClick" = "Выберите желаемую версию"
"xraySwitchClickDesk" = "Выбирайте внимательно, так как старые версии могут быть несовместимы с текущими конфигурациями"
"operationHours" = "Время работы системы"
@@ -327,8 +327,10 @@
"PrivateIpDesc" = "Изменение шаблона конфигурации для предупреждения подключения к диапазонам частных IP-адресов"
"Ads" = "Блокировка рекламы"
"AdsDesc" = "Изменение конфигурации для блокировки рекламы"
-"Family" = "Блокировать вредоносное ПО и контент для взрослых"
-"FamilyDesc" = "Резольверы DNS для блокировки вредоносных программ и контента для взрослых для защиты семьи"
+"Family" = "Блокируйте вредоносное ПО и контент для взрослых"
+"FamilyDesc" = "DNS-преобразователи Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
+"Security" = "Блокируйте вредоносное ПО, фишинговые сайты и сайты криптомайнеров"
+"SecurityDesc" = "Изменение шаблона конфигурации для защиты безопасности."
"Speedtest" = "Блокировать сайты для проверки скорости"
"SpeedtestDesc" = "Изменение шаблона конфигурации для предупреждения подключения к веб-сайтам для тестирования скорости"
"IRIp" = "Заблокировать подключения к диапазонам IP-адресов Ирана"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index d16c46ed..4d3b62f2 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -74,12 +74,12 @@
[pages.index]
"title" = "Trạng thái hệ thống"
-"memory" = "Bộ nhớ"
-"hard" = "Ổ cứng"
-"xrayStatus" = "Trạng thái của Xray"
-"stopXray" = "Dừng Xray"
-"restartXray" = "Khởi động lại Xray"
-"xraySwitch" = "Chuyển đổi phiên bản"
+"memory" = "ĐẬP"
+"hard" = "Đĩa"
+"xrayStatus" = "Trạng thái"
+"stopXray" = "Dừng lại"
+"restartXray" = "Khởi động lại"
+"xraySwitch" = "Phiên bản"
"xraySwitchClick" = "Chọn phiên bản mà bạn muốn chuyển đổi sang."
"xraySwitchClickDesk" = "Hãy lựa chọn thận trọng, vì các phiên bản cũ có thể không tương thích với các cấu hình hiện tại."
"operationHours" = "Thời gian hoạt động"
@@ -327,8 +327,10 @@
"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 cho Người lớn"
-"FamilyDesc" = "Các trình giải quyết DNS để chặn phần mềm độc hại và nội dung cho bảo vệ gia đình."
+"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."
+"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."
"IRIp" = "Vô hiệu hóa kết nối đến dải IP của Iran"
diff --git a/web/translation/translate.zh_Hans.toml b/web/translation/translate.zh_Hans.toml
index 8093255a..ac9c1537 100644
--- a/web/translation/translate.zh_Hans.toml
+++ b/web/translation/translate.zh_Hans.toml
@@ -10,8 +10,8 @@
"remark" = "备注"
"enable" = "启用"
"protocol" = "协议"
-"search" = "搜尋"
-"filter" = "过滤器"
+"search" = "搜索"
+"filter" = "筛选"
"loading" = "加载中..."
"second" = "秒"
"minute" = "分钟"
@@ -30,8 +30,8 @@
"sure" = "确定"
"encryption" = "加密"
"transmission" = "传输"
-"host" = "主持人"
-"path" = "小路"
+"host" = "Host"
+"path" = "Path"
"camouflage" = "伪装"
"status" = "状态"
"enabled" = "开启"
@@ -49,8 +49,8 @@
"install" = "安装"
"clients" = "客户端"
"usage" = "用法"
-"secretToken" = "秘密令牌"
-"remained" = "仍然存在"
+"secretToken" = "安全密钥"
+"remained" = "剩余"
"security" = "安全"
[menu]
@@ -79,7 +79,7 @@
"xrayStatus" = "状态"
"stopXray" = "停止"
"restartXray" = "重启"
-"xraySwitch" = "切换版本"
+"xraySwitch" = "版本"
"xraySwitchClick" = "点击你想切换的版本"
"xraySwitchClickDesk" = "请谨慎选择,旧版本可能配置不兼容"
"operationHours" = "系统正常运行时间"
@@ -148,7 +148,7 @@
"client" = "客户"
"export" = "导出链接"
"clone" = "克隆"
-"cloneInbound" = "创造"
+"cloneInbound" = "克隆"
"cloneInboundContent" = "此入站的所有项目除 Port、Listening IP、Clients 将应用于克隆"
"cloneInboundOk" = "从创建克隆"
"resetAllTraffic" = "重置所有入站流量"
@@ -327,8 +327,10 @@
"PrivateIpDesc" = "更改配置模板以避免连接私有 IP 范围"
"Ads" = "屏蔽广告"
"AdsDesc" = "修改配置模板屏蔽广告"
-"Family" = "启用家庭友好配置"
-"FamilyDesc" = "避免为家人连接到不安全的网站"
+"Family" = "阻止恶意软件和成人内容"
+"FamilyDesc" = "Cloudflare DNS 解析器可阻止恶意软件和成人内容以保护家庭."
+"Security" = "阻止恶意软件、网络钓鱼和加密货币挖矿网站"
+"SecurityDesc" = "更改安全防护配置模板."
"Speedtest" = "阻止测速网站"
"SpeedtestDesc" = "更改配置模板以避免连接到速度测试网站。 重新启动面板以应用更改。"
"IRIp" = "禁止伊朗 IP 范围连接"
@@ -377,7 +379,7 @@
"SpotifyWARPDesc" = "为Spotify添加路由到WARP"
"IRWARP" = "将伊朗域名路由到 WARP"
"IRWARPDesc" = "将伊朗域的路由添加到 WARP。 重启面板生效"
-"Inbounds" = "界内"
+"Inbounds" = "入站"
"InboundsDesc" = "更改配置模板接受特殊客户端"
"Outbounds" = "出站"
"OutboundsDesc" = "更改配置模板定义此服务器的传出方式"
@@ -405,7 +407,7 @@
"editOutbound" = "编辑出站"
"editReverse" = "编辑反向"
"tag" = "标签"
-"tagDesc" = "独特的标签"
+"tagDesc" = "唯一标记"
"address" = "地址"
"reverse" = "反转"
"domain" = "域名"
diff --git a/x-ui.sh b/x-ui.sh
index 144c377a..7e9a4826 100644
--- a/x-ui.sh
+++ b/x-ui.sh
@@ -54,6 +54,10 @@ elif [[ "${release}" == "debian" ]]; then
if [[ ${os_version} -lt 10 ]]; then
echo -e "${red} Please use Debian 10 or higher ${plain}\n" && exit 1
fi
+elif [[ "${release}" == "almalinux" ]]; then
+ if [[ ${os_version} -lt 9 ]]; then
+ echo -e "${red} Please use Almalinux 9 or higher ${plain}\n" && exit 1
+ fi
elif [[ "${release}" == "arch" ]]; then
echo "Your OS is ArchLinux"
elif [[ "${release}" == "manjaro" ]]; then
@@ -126,6 +130,24 @@ update() {
fi
}
+custom_version() {
+ echo "Enter the panel version (like 2.0.0):"
+ read panel_version
+
+ if [ -z "$panel_version" ]; then
+ echo "Panel version cannot be empty. Exiting."
+ exit 1
+ fi
+
+ download_link="https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh"
+
+ # Use the entered panel version in the download link
+ install_command="bash <(curl -Ls $download_link) v$panel_version"
+
+ echo "Downloading and installing panel version $panel_version..."
+ eval $install_command
+}
+
uninstall() {
confirm "Are you sure you want to uninstall the panel? xray will also uninstalled!" "n"
if [[ $? != 0 ]]; then
@@ -1035,36 +1057,37 @@ show_menu() {
${green}3X-ui Panel Management Script${plain}
${green}0.${plain} Exit Script
————————————————
- ${green}1.${plain} Install x-ui
- ${green}2.${plain} Update x-ui
- ${green}3.${plain} Uninstall x-ui
+ ${green}1.${plain} Install
+ ${green}2.${plain} Update
+ ${green}3.${plain} Custom Version
+ ${green}4.${plain} Uninstall
————————————————
- ${green}4.${plain} Reset Username & Password & Secret Token
- ${green}5.${plain} Reset Panel Settings
- ${green}6.${plain} Change Panel Port
- ${green}7.${plain} View Current Panel Settings
+ ${green}5.${plain} Reset Username & Password & Secret Token
+ ${green}6.${plain} Reset Settings
+ ${green}7.${plain} Change Port
+ ${green}8.${plain} View Current Settings
————————————————
- ${green}8.${plain} Start x-ui
- ${green}9.${plain} Stop x-ui
- ${green}10.${plain} Restart x-ui
- ${green}11.${plain} Check x-ui Status
- ${green}12.${plain} Check x-ui Logs
+ ${green}9.${plain} Start
+ ${green}10.${plain} Stop
+ ${green}11.${plain} Restart
+ ${green}12.${plain} Check Status
+ ${green}13.${plain} Check Logs
————————————————
- ${green}13.${plain} Enable x-ui On System Startup
- ${green}14.${plain} Disable x-ui On System Startup
+ ${green}14.${plain} Enable x-ui On System Startup
+ ${green}15.${plain} Disable x-ui On System Startup
————————————————
- ${green}15.${plain} SSL Certificate Management
- ${green}16.${plain} Cloudflare SSL Certificate
- ${green}17.${plain} IP Limit Management
- ${green}18.${plain} WARP Management
+ ${green}16.${plain} SSL Certificate Management
+ ${green}17.${plain} Cloudflare SSL Certificate
+ ${green}18.${plain} IP Limit Management
+ ${green}19.${plain} WARP Management
————————————————
- ${green}19.${plain} Enable BBR
- ${green}20.${plain} Update Geo Files
- ${green}21.${plain} Active Firewall and open ports
- ${green}22.${plain} Speedtest by Ookla
+ ${green}20.${plain} Enable BBR
+ ${green}21.${plain} Update Geo Files
+ ${green}22.${plain} Active Firewall and open ports
+ ${green}23.${plain} Speedtest by Ookla
"
show_status
- echo && read -p "Please enter your selection [0-22]: " num
+ echo && read -p "Please enter your selection [0-23]: " num
case "${num}" in
0)
@@ -1077,67 +1100,70 @@ show_menu() {
check_install && update
;;
3)
- check_install && uninstall
+ check_install && custom_version
;;
4)
- check_install && reset_user
+ check_install && uninstall
;;
5)
- check_install && reset_config
+ check_install && reset_user
;;
6)
- check_install && set_port
+ check_install && reset_config
;;
7)
- check_install && check_config
+ check_install && set_port
;;
8)
- check_install && start
+ check_install && check_config
;;
9)
- check_install && stop
+ check_install && start
;;
10)
- check_install && restart
+ check_install && stop
;;
11)
- check_install && status
+ check_install && restart
;;
12)
- check_install && show_log
+ check_install && status
;;
13)
- check_install && enable
+ check_install && show_log
;;
14)
- check_install && disable
+ check_install && enable
;;
15)
- ssl_cert_issue_main
+ check_install && disable
;;
16)
- ssl_cert_issue_CF
+ ssl_cert_issue_main
;;
17)
- iplimit_main
+ ssl_cert_issue_CF
;;
18)
- warp_cloudflare
+ iplimit_main
;;
19)
- enable_bbr
+ warp_cloudflare
;;
20)
- update_geo
+ enable_bbr
;;
21)
- open_ports
+ update_geo
;;
22)
+ open_ports
+ ;;
+ 23)
run_speedtest
;;
*)
- LOGE "Please enter the correct number [0-22]"
+ LOGE "Please enter the correct number [0-23]"
;;
esac
}