mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-02-28 13:13:00 +00:00
Compare commits
No commits in common. "48fe3c3a647d13451bc8ec3c6bca83223797549c" and "e726bd4a95809bfc79eae92d7e38dce5b9dc7604" have entirely different histories.
48fe3c3a64
...
e726bd4a95
10 changed files with 82 additions and 251 deletions
9
main.go
9
main.go
|
|
@ -16,7 +16,6 @@ import (
|
||||||
"github.com/mhsanaei/3x-ui/v2/logger"
|
"github.com/mhsanaei/3x-ui/v2/logger"
|
||||||
"github.com/mhsanaei/3x-ui/v2/sub"
|
"github.com/mhsanaei/3x-ui/v2/sub"
|
||||||
"github.com/mhsanaei/3x-ui/v2/util/crypto"
|
"github.com/mhsanaei/3x-ui/v2/util/crypto"
|
||||||
"github.com/mhsanaei/3x-ui/v2/util/sys"
|
|
||||||
"github.com/mhsanaei/3x-ui/v2/web"
|
"github.com/mhsanaei/3x-ui/v2/web"
|
||||||
"github.com/mhsanaei/3x-ui/v2/web/global"
|
"github.com/mhsanaei/3x-ui/v2/web/global"
|
||||||
"github.com/mhsanaei/3x-ui/v2/web/service"
|
"github.com/mhsanaei/3x-ui/v2/web/service"
|
||||||
|
|
@ -71,7 +70,7 @@ func runWebServer() {
|
||||||
|
|
||||||
sigCh := make(chan os.Signal, 1)
|
sigCh := make(chan os.Signal, 1)
|
||||||
// Trap shutdown signals
|
// Trap shutdown signals
|
||||||
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM, sys.SIGUSR1)
|
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM)
|
||||||
for {
|
for {
|
||||||
sig := <-sigCh
|
sig := <-sigCh
|
||||||
|
|
||||||
|
|
@ -109,12 +108,6 @@ func runWebServer() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Println("Sub server restarted successfully.")
|
log.Println("Sub server restarted successfully.")
|
||||||
case sys.SIGUSR1:
|
|
||||||
logger.Info("Received USR1 signal, restarting xray-core...")
|
|
||||||
err := server.RestartXray()
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("Failed to restart xray-core:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// --- FIX FOR TELEGRAM BOT CONFLICT (409) on full shutdown ---
|
// --- FIX FOR TELEGRAM BOT CONFLICT (409) on full shutdown ---
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,11 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v4/net"
|
"github.com/shirou/gopsutil/v4/net"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
var SIGUSR1 = syscall.SIGUSR1
|
|
||||||
|
|
||||||
func GetTCPCount() (int, error) {
|
func GetTCPCount() (int, error) {
|
||||||
stats, err := net.Connections("tcp")
|
stats, err := net.Connections("tcp")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var SIGUSR1 = syscall.SIGUSR1
|
|
||||||
|
|
||||||
func getLinesNum(filename string) (int, error) {
|
func getLinesNum(filename string) (int, error) {
|
||||||
file, err := os.Open(filename)
|
file, err := os.Open(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,6 @@ import (
|
||||||
"github.com/shirou/gopsutil/v4/net"
|
"github.com/shirou/gopsutil/v4/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
var SIGUSR1 = syscall.Signal(0)
|
|
||||||
|
|
||||||
// GetConnectionCount returns the number of active connections for the specified protocol ("tcp" or "udp").
|
// GetConnectionCount returns the number of active connections for the specified protocol ("tcp" or "udp").
|
||||||
func GetConnectionCount(proto string) (int, error) {
|
func GetConnectionCount(proto string) (int, error) {
|
||||||
if proto != "tcp" && proto != "udp" {
|
if proto != "tcp" && proto != "udp" {
|
||||||
|
|
|
||||||
|
|
@ -490,7 +490,3 @@ func (s *Server) GetCron() *cron.Cron {
|
||||||
func (s *Server) GetWSHub() any {
|
func (s *Server) GetWSHub() any {
|
||||||
return s.wsHub
|
return s.wsHub
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) RestartXray() error {
|
|
||||||
return s.xrayService.RestartXray(true)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
5
x-ui.rc
5
x-ui.rc
|
|
@ -11,8 +11,3 @@ depend() {
|
||||||
start_pre(){
|
start_pre(){
|
||||||
cd /usr/local/x-ui
|
cd /usr/local/x-ui
|
||||||
}
|
}
|
||||||
reload() {
|
|
||||||
ebegin "Reloading ${RC_SVCNAME}"
|
|
||||||
kill -USR1 $pidfile
|
|
||||||
eend $?
|
|
||||||
}
|
|
||||||
|
|
@ -9,7 +9,6 @@ Environment="XRAY_VMESS_AEAD_FORCED=false"
|
||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=/usr/lib/x-ui/
|
WorkingDirectory=/usr/lib/x-ui/
|
||||||
ExecStart=/usr/lib/x-ui/x-ui
|
ExecStart=/usr/lib/x-ui/x-ui
|
||||||
ExecReload=kill -USR1 $MAINPID
|
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5s
|
RestartSec=5s
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ Environment="XRAY_VMESS_AEAD_FORCED=false"
|
||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=/usr/local/x-ui/
|
WorkingDirectory=/usr/local/x-ui/
|
||||||
ExecStart=/usr/local/x-ui/x-ui
|
ExecStart=/usr/local/x-ui/x-ui
|
||||||
ExecReload=kill -USR1 $MAINPID
|
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5s
|
RestartSec=5s
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ Environment="XRAY_VMESS_AEAD_FORCED=false"
|
||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=/usr/local/x-ui/
|
WorkingDirectory=/usr/local/x-ui/
|
||||||
ExecStart=/usr/local/x-ui/x-ui
|
ExecStart=/usr/local/x-ui/x-ui
|
||||||
ExecReload=kill -USR1 $MAINPID
|
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5s
|
RestartSec=5s
|
||||||
|
|
||||||
|
|
|
||||||
290
x-ui.sh
290
x-ui.sh
|
|
@ -408,16 +408,6 @@ restart() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
restart_xray() {
|
|
||||||
systemctl reload x-ui
|
|
||||||
LOGI "xray-core Restart signal sent successfully, Please check the log information to confirm whether xray restarted successfully"
|
|
||||||
sleep 2
|
|
||||||
show_xray_status
|
|
||||||
if [[ $# == 0 ]]; then
|
|
||||||
before_show_menu
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
status() {
|
status() {
|
||||||
if [[ $release == "alpine" ]]; then
|
if [[ $release == "alpine" ]]; then
|
||||||
rc-service x-ui status
|
rc-service x-ui status
|
||||||
|
|
@ -1698,81 +1688,55 @@ run_librespeed() {
|
||||||
}
|
}
|
||||||
|
|
||||||
create_honeypot() {
|
create_honeypot() {
|
||||||
|
|
||||||
|
local pkg_manager=""
|
||||||
local server_ip=$(curl -s --max-time 3 https://4.ident.me)
|
local server_ip=$(curl -s --max-time 3 https://4.ident.me)
|
||||||
|
|
||||||
echo -e "${plain}Do you want to use: ${green}Apache ${plain}or ${green}Nginx"
|
echo -e "${yellow}${plain}Downloading sources and Utilites..."
|
||||||
|
if command -v dnf &>/dev/null; then
|
||||||
|
pkg_manager="dnf"
|
||||||
|
dnf install httpd -y
|
||||||
|
elif command -v yum &>/dev/null; then
|
||||||
|
pkg_manager="yum"
|
||||||
|
yum install httpd
|
||||||
|
elif command -v apt-get &>/dev/null; then
|
||||||
|
pkg_manager="apt-get"
|
||||||
|
apt-get install apache2
|
||||||
|
elif command -v apt &>/dev/null; then
|
||||||
|
pkg_manager="apt"
|
||||||
|
apt install apache2
|
||||||
|
fi
|
||||||
|
|
||||||
read -p "Apache or Nginx: " nginx_or_apache
|
if [[ -z $pkg_manager ]]; then
|
||||||
|
echo "Error: Package manager not found. You may need to install HoneyPot manually."
|
||||||
echo -e "${yellow}Downloading sources and Utilites..."
|
return 1
|
||||||
|
fi
|
||||||
if [ "$nginx_or_apache" = "Apache" ]; then
|
|
||||||
case "${release}" in
|
|
||||||
ubuntu)
|
|
||||||
apt-get update
|
|
||||||
apt-get install apache2 -y
|
|
||||||
;;
|
|
||||||
debian)
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y apache2
|
|
||||||
;;
|
|
||||||
armbian)
|
|
||||||
apt-get update && apt-get install apache2 -y
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
|
||||||
dnf -y update && dnf -y install httpd
|
|
||||||
;;
|
|
||||||
centos)
|
|
||||||
yum -y install apache2
|
|
||||||
;;
|
|
||||||
arch | manjaro | parch)
|
|
||||||
pacman -Syu --noconfirm apache
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Start apache server for HoneyPot
|
# Start apache server for HoneyPot
|
||||||
case "${release}" in
|
|
||||||
ubuntu)
|
|
||||||
systemctl enable apache2
|
systemctl enable apache2
|
||||||
systemctl start apache2
|
systemctl start apache2
|
||||||
;;
|
|
||||||
debian)
|
|
||||||
systemctl enable apache2
|
|
||||||
systemctl start apache2
|
|
||||||
;;
|
|
||||||
armbian)
|
|
||||||
systemctl enable apache2
|
|
||||||
systemctl start apache2
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
|
||||||
systemctl enable httpd
|
|
||||||
systemctl start httpd
|
|
||||||
;;
|
|
||||||
centos)
|
|
||||||
systemctl enable httpd
|
|
||||||
systemctl start httpd
|
|
||||||
;;
|
|
||||||
arch | manjaro | parch)
|
|
||||||
systemctl enable apache
|
|
||||||
systemctl start apache
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo -e "${red}Cannot start apache service.${plain}\n"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
echo -e "${yellow}${plain}Installing HoneyPot..."
|
||||||
echo -e "${yellow}Installing HoneyPot..."
|
|
||||||
|
|
||||||
git clone https://github.com/d3l1f3r/SpaceSaver.git
|
git clone https://github.com/d3l1f3r/SpaceSaver.git
|
||||||
mv SpaceSaver/ /var/www/html/
|
mv SpaceSaver/ /var/www/html/
|
||||||
|
|
||||||
# Config for apache2
|
# Configs
|
||||||
|
echo """
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName SpaceSaver
|
||||||
|
DocumentRoot /var/www/html/SpaceSaver
|
||||||
|
|
||||||
|
<Directory /var/www/html/SpaceSaver>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
</VirtualHost>""" >> /etc/apache2/sites-enabled/spacesaver.conf
|
||||||
|
|
||||||
echo """
|
echo """
|
||||||
<VirtualHost *:80>
|
<VirtualHost *:80>
|
||||||
ServerName SpaceSaver
|
ServerName SpaceSaver
|
||||||
|
|
@ -1788,120 +1752,18 @@ create_honeypot() {
|
||||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
</VirtualHost>""" >> /etc/apache2/sites-available/spacesaver.conf
|
</VirtualHost>""" >> /etc/apache2/sites-available/spacesaver.conf
|
||||||
|
|
||||||
ln -sf /etc/apache2/sites-available/spacesaver.conf /etc/apache2/sites-enabled/
|
|
||||||
|
|
||||||
# Restarting apache server
|
# Restarting apache server
|
||||||
case "${release}" in
|
sudo systemctl reload apache2
|
||||||
ubuntu)
|
|
||||||
systemctl reload apache2
|
|
||||||
;;
|
|
||||||
debian)
|
|
||||||
systemctl reload apache2
|
|
||||||
;;
|
|
||||||
armbian)
|
|
||||||
systemctl reload apache2
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
|
||||||
systemctl reload httpd
|
|
||||||
;;
|
|
||||||
centos)
|
|
||||||
systemctl reload httpd
|
|
||||||
;;
|
|
||||||
arch | manjaro | parch)
|
|
||||||
systemctl reload httpd
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo -e "${red}Cannot reload apache service.${plain}\n"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Access rights to HoneyPot's files
|
# Access rights to HoneyPot's files
|
||||||
chown -R www-data:www-data /var/www/html/SpaceSaver
|
sudo chown -R www-data:www-data /var/www/html/SpaceSaver
|
||||||
chmod -R 755 /var/www/html/SpaceSaver
|
sudo chmod -R 755 /var/www/html/SpaceSaver
|
||||||
chmod 644 /var/www/html/SpaceSaver/index.html
|
chmod 644 /var/www/html/SpaceSaver/index.html
|
||||||
|
|
||||||
echo -e "${plain}Done!"
|
sudo systemctl reload apache2
|
||||||
echo -e "${green}Available here -> http://$server_ip:80"
|
|
||||||
|
|
||||||
elif [ "$nginx_or_apache" = "Nginx" ]; then
|
echo -e "${green}${plain}Done!"
|
||||||
case "${release}" in
|
echo -e "${green}${plain}Available here -> http://$server_ip:80"
|
||||||
ubuntu)
|
|
||||||
apt-get update
|
|
||||||
apt-get install nginx -y
|
|
||||||
;;
|
|
||||||
debian)
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y nginx
|
|
||||||
;;
|
|
||||||
armbian)
|
|
||||||
apt-get update && apt-get install nginx -y
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
|
||||||
dnf -y update && dnf -y install nginx
|
|
||||||
;;
|
|
||||||
centos)
|
|
||||||
yum -y install nginx
|
|
||||||
;;
|
|
||||||
arch | manjaro | parch)
|
|
||||||
pacman -Syu --noconfirm nginx
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Start nginx server for HoneyPot
|
|
||||||
systemctl enable nginx
|
|
||||||
systemctl start nginx
|
|
||||||
|
|
||||||
#Downloading HoneyPot's files
|
|
||||||
git clone https://github.com/d3l1f3r/SpaceSaver.git
|
|
||||||
mv SpaceSaver/ /var/www/html/
|
|
||||||
|
|
||||||
# Config for nginx
|
|
||||||
tee /etc/nginx/sites-available/spacesaver.conf >/dev/null << 'EOF'
|
|
||||||
server {
|
|
||||||
listen 80 default_server; # ← важно для локального доступа
|
|
||||||
server_name 127.0.0.1 localhost SpaceSaver _;
|
|
||||||
|
|
||||||
root /var/www/html/SpaceSaver;
|
|
||||||
index index.html;
|
|
||||||
|
|
||||||
# Security Headers
|
|
||||||
add_header X-Content-Type-Options nosniff always;
|
|
||||||
add_header X-Frame-Options SAMEORIGIN always;
|
|
||||||
add_header X-XSS-Protection "1; mode=block" always;
|
|
||||||
add_header Referrer-Policy strict-origin-when-cross-origin always;
|
|
||||||
add_header Permissions-Policy "interest-cohort=()" always;
|
|
||||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
|
||||||
|
|
||||||
server_tokens off;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ /index.html;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ /\. {
|
|
||||||
deny all;
|
|
||||||
access_log off;
|
|
||||||
log_not_found off;
|
|
||||||
}
|
|
||||||
|
|
||||||
access_log /var/log/nginx/spacesaver.access.log;
|
|
||||||
error_log /var/log/nginx/spacesaver.error.log;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
|
||||||
ln -sf /etc/nginx/sites-available/spacesaver.conf /etc/nginx/sites-enabled/
|
|
||||||
systemctl reload nginx
|
|
||||||
|
|
||||||
echo -e "${plain}Done!"
|
|
||||||
echo -e "${green}Available here -> http://$server_ip:80"
|
|
||||||
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
change_dns() {
|
change_dns() {
|
||||||
|
|
@ -2443,29 +2305,28 @@ show_menu() {
|
||||||
│ ${green}11.${plain} Start │
|
│ ${green}11.${plain} Start │
|
||||||
│ ${green}12.${plain} Stop │
|
│ ${green}12.${plain} Stop │
|
||||||
│ ${green}13.${plain} Restart │
|
│ ${green}13.${plain} Restart │
|
||||||
| ${green}14.${plain} Restart Xray │
|
│ ${green}14.${plain} Check Status │
|
||||||
│ ${green}15.${plain} Check Status │
|
│ ${green}15.${plain} Logs Management │
|
||||||
│ ${green}16.${plain} Logs Management │
|
|
||||||
│────────────────────────────────────────────────│
|
│────────────────────────────────────────────────│
|
||||||
│ ${green}17.${plain} Enable Autostart │
|
│ ${green}16.${plain} Enable Autostart │
|
||||||
│ ${green}18.${plain} Disable Autostart │
|
│ ${green}17.${plain} Disable Autostart │
|
||||||
│────────────────────────────────────────────────│
|
│────────────────────────────────────────────────│
|
||||||
│ ${green}19.${plain} SSL Certificate Management │
|
│ ${green}18.${plain} SSL Certificate Management │
|
||||||
│ ${green}20.${plain} Cloudflare SSL Certificate │
|
│ ${green}19.${plain} Cloudflare SSL Certificate │
|
||||||
│ ${green}21.${plain} IP Limit Management │
|
│ ${green}20.${plain} IP Limit Management │
|
||||||
│ ${green}22.${plain} Firewall Management │
|
│ ${green}21.${plain} Firewall Management │
|
||||||
│ ${green}23.${plain} SSH Port Forwarding Management │
|
│ ${green}22.${plain} SSH Port Forwarding Management │
|
||||||
│ ${green}24.${plain} HoneyPot (Fakesite) │
|
│ ${green}23.${plain} HoneyPot (Fakesite) │
|
||||||
│ ${green}25.${plain} Change DNS resolver │
|
│ ${green}24.${plain} Change DNS resolver │
|
||||||
│────────────────────────────────────────────────│
|
│────────────────────────────────────────────────│
|
||||||
│ ${green}26.${plain} Enable BBR │
|
│ ${green}25.${plain} Enable BBR │
|
||||||
│ ${green}27.${plain} Update Geo Files │
|
│ ${green}26.${plain} Update Geo Files │
|
||||||
│ ${green}28.${plain} Speedtest by Ookla │
|
│ ${green}27.${plain} Speedtest by Ookla │
|
||||||
│ ${green}29.${plain} Librespeed │
|
│ ${green}28.${plain} Librespeed │
|
||||||
╚────────────────────────────────────────────────╝
|
╚────────────────────────────────────────────────╝
|
||||||
"
|
"
|
||||||
show_status
|
show_status
|
||||||
echo && read -rp "Please enter your selection [0-29]: " num
|
echo && read -rp "Please enter your selection [0-28]: " num
|
||||||
|
|
||||||
case "${num}" in
|
case "${num}" in
|
||||||
0)
|
0)
|
||||||
|
|
@ -2511,55 +2372,52 @@ show_menu() {
|
||||||
check_install && restart
|
check_install && restart
|
||||||
;;
|
;;
|
||||||
14)
|
14)
|
||||||
check_install && restart_xray
|
|
||||||
;;
|
|
||||||
15)
|
|
||||||
check_install && status
|
check_install && status
|
||||||
;;
|
;;
|
||||||
16)
|
15)
|
||||||
check_install && show_log
|
check_install && show_log
|
||||||
;;
|
;;
|
||||||
17)
|
16)
|
||||||
check_install && enable
|
check_install && enable
|
||||||
;;
|
;;
|
||||||
18)
|
17)
|
||||||
check_install && disable
|
check_install && disable
|
||||||
;;
|
;;
|
||||||
19)
|
18)
|
||||||
ssl_cert_issue_main
|
ssl_cert_issue_main
|
||||||
;;
|
;;
|
||||||
20)
|
19)
|
||||||
ssl_cert_issue_CF
|
ssl_cert_issue_CF
|
||||||
;;
|
;;
|
||||||
21)
|
20)
|
||||||
iplimit_main
|
iplimit_main
|
||||||
;;
|
;;
|
||||||
22)
|
21)
|
||||||
firewall_menu
|
firewall_menu
|
||||||
;;
|
;;
|
||||||
23)
|
22)
|
||||||
SSH_port_forwarding
|
SSH_port_forwarding
|
||||||
;;
|
;;
|
||||||
24)
|
23)
|
||||||
create_honeypot
|
create_honeypot
|
||||||
;;
|
;;
|
||||||
25)
|
24)
|
||||||
change_dns
|
change_dns
|
||||||
;;
|
;;
|
||||||
26)
|
25)
|
||||||
bbr_menu
|
bbr_menu
|
||||||
;;
|
;;
|
||||||
27)
|
26)
|
||||||
update_geo
|
update_geo
|
||||||
;;
|
;;
|
||||||
28)
|
27)
|
||||||
run_speedtest
|
run_speedtest
|
||||||
;;
|
;;
|
||||||
29)
|
28)
|
||||||
run_librespeed
|
run_librespeed
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
LOGE "Please enter the correct number [0-29]"
|
LOGE "Please enter the correct number [0-28]"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue