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 @@
-
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/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 }