3x-ui/x-ui.sh

1816 lines
56 KiB
Bash
Raw Normal View History

2023-02-09 22:18:06 +03:00
#!/bin/bash
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
plain='\033[0m'
#Add some basic function here
function LOGD() {
echo -e "${yellow}[DEG] $* ${plain}"
}
function LOGE() {
echo -e "${red}[ERR] $* ${plain}"
}
function LOGI() {
echo -e "${green}[INF] $* ${plain}"
}
2023-04-18 08:51:21 +03:00
2023-02-09 22:18:06 +03:00
# check root
[[ $EUID -ne 0 ]] && LOGE "ERROR: You must be root to run this script! \n" && exit 1
# Check OS and set release variable
2023-03-11 18:05:35 +03:00
if [[ -f /etc/os-release ]]; then
source /etc/os-release
release=$ID
elif [[ -f /usr/lib/os-release ]]; then
source /usr/lib/os-release
release=$ID
2023-02-09 22:18:06 +03:00
else
echo "Failed to check the system OS, please contact the author!" >&2
exit 1
2023-02-09 22:18:06 +03:00
fi
echo "The OS release is: $release"
2023-02-09 22:18:06 +03:00
os_version=""
os_version=$(grep "^VERSION_ID" /etc/os-release | cut -d '=' -f2 | tr -d '"' | tr -d '.')
2023-02-09 22:18:06 +03:00
2024-04-01 11:42:28 +03:00
if [[ "${release}" == "arch" ]]; then
echo "Your OS is Arch Linux"
2024-05-09 20:49:15 +03:00
elif [[ "${release}" == "parch" ]]; then
2024-09-24 12:53:12 +03:00
echo "Your OS is Parch Linux"
2024-04-01 11:42:28 +03:00
elif [[ "${release}" == "manjaro" ]]; then
echo "Your OS is Manjaro"
elif [[ "${release}" == "armbian" ]]; then
echo "Your OS is Armbian"
elif [[ "${release}" == "alpine" ]]; then
echo "Your OS is Alpine Linux"
2024-05-09 20:49:15 +03:00
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
echo "Your OS is OpenSUSE Tumbleweed"
2024-10-06 18:10:07 +03:00
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
2024-04-01 11:42:28 +03:00
elif [[ "${release}" == "centos" ]]; then
2023-03-11 18:05:35 +03:00
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
fi
2023-05-13 18:36:16 +03:00
elif [[ "${release}" == "ubuntu" ]]; then
if [[ ${os_version} -lt 2004 ]]; then
2024-04-01 11:42:28 +03:00
echo -e "${red} Please use Ubuntu 20 or higher version!${plain}\n" && exit 1
2023-03-11 18:05:35 +03:00
fi
2023-03-11 18:38:43 +03:00
elif [[ "${release}" == "fedora" ]]; then
2023-03-11 18:05:35 +03:00
if [[ ${os_version} -lt 36 ]]; then
2024-04-01 11:42:28 +03:00
echo -e "${red} Please use Fedora 36 or higher version!${plain}\n" && exit 1
2023-03-11 18:05:35 +03:00
fi
2024-09-24 12:53:12 +03:00
elif [[ "${release}" == "amzn" ]]; then
if [[ ${os_version} != "2023" ]]; then
echo -e "${red} Please use Amazon Linux 2023!${plain}\n" && exit 1
fi
2023-03-11 18:38:43 +03:00
elif [[ "${release}" == "debian" ]]; then
if [[ ${os_version} -lt 11 ]]; then
echo -e "${red} Please use Debian 11 or higher ${plain}\n" && exit 1
2023-03-11 18:05:35 +03:00
fi
elif [[ "${release}" == "almalinux" ]]; then
2024-09-25 12:19:41 +03:00
if [[ ${os_version} -lt 80 ]]; then
echo -e "${red} Please use AlmaLinux 8.0 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "rocky" ]]; then
2024-09-25 11:16:47 +03:00
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
fi
2024-10-08 17:42:47 +03:00
elif [[ "${release}" == "ol" ]]; then
2024-04-01 11:42:28 +03:00
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
fi
else
echo -e "${red}Your operating system is not supported by this script.${plain}\n"
echo "Please ensure you are using one of the following supported operating systems:"
echo "- Ubuntu 20.04+"
echo "- Debian 11+"
echo "- CentOS 8+"
2024-10-06 18:10:07 +03:00
echo "- OpenEuler 22.03+"
2024-04-01 11:42:28 +03:00
echo "- Fedora 36+"
echo "- Arch Linux"
2024-05-09 20:49:15 +03:00
echo "- Parch Linux"
2024-04-01 11:42:28 +03:00
echo "- Manjaro"
echo "- Armbian"
2024-09-25 12:19:41 +03:00
echo "- AlmaLinux 8.0+"
2024-09-25 11:16:47 +03:00
echo "- Rocky Linux 8+"
2024-04-01 11:42:28 +03:00
echo "- Oracle Linux 8+"
2024-05-09 20:49:15 +03:00
echo "- OpenSUSE Tumbleweed"
2024-09-24 12:53:12 +03:00
echo "- Amazon Linux 2023"
2024-04-01 11:42:28 +03:00
exit 1
2023-03-11 18:05:35 +03:00
fi
# Declare Variables
log_folder="${XUI_LOG_FOLDER:=/var/log}"
iplimit_log_path="${log_folder}/3xipl.log"
iplimit_banned_log_path="${log_folder}/3xipl-banned.log"
2023-02-09 22:18:06 +03:00
confirm() {
if [[ $# > 1 ]]; then
2023-04-21 18:33:23 +03:00
echo && read -p "$1 [Default $2]: " temp
2023-04-30 00:27:15 +03:00
if [[ "${temp}" == "" ]]; then
2023-02-09 22:18:06 +03:00
temp=$2
fi
else
read -p "$1 [y/n]: " temp
fi
2023-04-30 00:27:15 +03:00
if [[ "${temp}" == "y" || "${temp}" == "Y" ]]; then
2023-02-09 22:18:06 +03:00
return 0
else
return 1
fi
}
confirm_restart() {
confirm "Restart the panel, Attention: Restarting the panel will also restart xray" "y"
if [[ $? == 0 ]]; then
restart
else
show_menu
fi
}
before_show_menu() {
echo && echo -n -e "${yellow}Press enter to return to the main menu: ${plain}" && read temp
show_menu
}
install() {
2023-03-11 18:05:35 +03:00
bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh)
2023-02-09 22:18:06 +03:00
if [[ $? == 0 ]]; then
if [[ $# == 0 ]]; then
start
else
start 0
fi
fi
}
update() {
2024-01-01 23:09:21 +03:00
confirm "This function will forcefully reinstall the latest version, and the data will not be lost. Do you want to continue?" "y"
2023-04-24 16:25:29 +03:00
if [[ $? != 0 ]]; then
LOGE "Cancelled"
if [[ $# == 0 ]]; then
before_show_menu
fi
2023-04-24 16:25:29 +03:00
return 0
fi
bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh)
if [[ $? == 0 ]]; then
LOGI "Update is complete, Panel has automatically restarted "
2024-11-04 12:33:07 +03:00
before_show_menu
2023-02-09 22:18:06 +03:00
fi
}
2024-06-24 16:22:05 +03:00
update_menu() {
echo -e "${yellow}Updating Menu${plain}"
confirm "This function will update the menu to the latest changes." "y"
if [[ $? != 0 ]]; then
LOGE "Cancelled"
if [[ $# == 0 ]]; then
before_show_menu
fi
return 0
fi
2024-10-07 18:21:32 +03:00
2024-06-24 16:22:05 +03:00
wget --no-check-certificate -O /usr/bin/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh
chmod +x /usr/local/x-ui/x-ui.sh
chmod +x /usr/bin/x-ui
2024-10-07 18:21:32 +03:00
if [[ $? == 0 ]]; then
2024-06-24 16:22:05 +03:00
echo -e "${green}Update successful. The panel has automatically restarted.${plain}"
2024-11-04 12:33:07 +03:00
before_show_menu
2024-06-24 16:22:05 +03:00
else
echo -e "${red}Failed to update the menu.${plain}"
return 1
fi
}
2024-10-31 03:18:37 +03:00
legacy_version() {
2024-10-04 15:31:15 +03:00
echo "Enter the panel version (like 2.4.0):"
read tag_version
2023-12-23 17:28:11 +03:00
2024-10-04 15:31:15 +03:00
if [ -z "$tag_version" ]; then
2023-12-23 17:28:11 +03:00
echo "Panel version cannot be empty. Exiting."
2024-01-20 16:58:44 +03:00
exit 1
2023-12-23 17:28:11 +03:00
fi
# Use the entered panel version in the download link
2024-10-31 03:18:37 +03:00
install_command="bash <(curl -Ls "https://raw.githubusercontent.com/mhsanaei/3x-ui/v$tag_version/install.sh") v$tag_version"
2023-12-23 17:28:11 +03:00
2024-10-04 15:31:15 +03:00
echo "Downloading and installing panel version $tag_version..."
2023-12-23 17:28:11 +03:00
eval $install_command
}
# Function to handle the deletion of the script file
delete_script() {
2024-10-07 18:21:32 +03:00
rm "$0" # Remove the script file itself
exit 1
}
2023-02-09 22:18:06 +03:00
uninstall() {
confirm "Are you sure you want to uninstall the panel? xray will also uninstalled!" "n"
if [[ $? != 0 ]]; then
if [[ $# == 0 ]]; then
show_menu
fi
return 0
fi
systemctl stop x-ui
systemctl disable x-ui
rm /etc/systemd/system/x-ui.service -f
systemctl daemon-reload
systemctl reset-failed
rm /etc/x-ui/ -rf
rm /usr/local/x-ui/ -rf
echo ""
echo -e "Uninstalled Successfully.\n"
echo "If you need to install this panel again, you can use below command:"
echo -e "${green}bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)${plain}"
2023-02-09 22:18:06 +03:00
echo ""
# Trap the SIGTERM signal
trap delete_script SIGTERM
delete_script
2023-02-09 22:18:06 +03:00
}
reset_user() {
confirm "Are you sure to reset the username and password of the panel?" "n"
2023-02-09 22:18:06 +03:00
if [[ $? != 0 ]]; then
if [[ $# == 0 ]]; then
show_menu
fi
return 0
fi
read -rp "Please set the login username [default is a random username]: " config_account
[[ -z $config_account ]] && config_account=$(date +%s%N | md5sum | cut -c 1-8)
read -rp "Please set the login password [default is a random password]: " config_password
[[ -z $config_password ]] && config_password=$(date +%s%N | md5sum | cut -c 1-8)
/usr/local/x-ui/x-ui setting -username ${config_account} -password ${config_password} >/dev/null 2>&1
/usr/local/x-ui/x-ui setting -remove_secret >/dev/null 2>&1
echo -e "Panel login username has been reset to: ${green} ${config_account} ${plain}"
echo -e "Panel login password has been reset to: ${green} ${config_password} ${plain}"
echo -e "${yellow} Panel login secret token disabled ${plain}"
echo -e "${green} Please use the new login username and password to access the X-UI panel. Also remember them! ${plain}"
2023-02-09 22:18:06 +03:00
confirm_restart
}
2024-06-24 15:43:39 +03:00
gen_random_string() {
local length="$1"
2024-07-27 15:56:37 +03:00
local random_string=$(LC_ALL=C tr -dc 'a-zA-Z0-9' </dev/urandom | fold -w "$length" | head -n 1)
2024-06-24 15:43:39 +03:00
echo "$random_string"
}
reset_webbasepath() {
echo -e "${yellow}Resetting Web Base Path${plain}"
2024-10-07 18:21:32 +03:00
read -rp "Are you sure you want to reset the web base path? (y/n): " confirm
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo -e "${yellow}Operation canceled.${plain}"
return
2024-06-24 15:43:39 +03:00
fi
config_webBasePath=$(gen_random_string 10)
2024-10-07 18:21:32 +03:00
2024-06-24 15:43:39 +03:00
# Apply the new web base path setting
/usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" >/dev/null 2>&1
2024-10-07 18:38:23 +03:00
2024-06-24 16:22:05 +03:00
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}"
2024-10-07 18:38:23 +03:00
restart
2024-06-24 15:43:39 +03:00
}
2023-02-09 22:18:06 +03:00
reset_config() {
2023-04-18 08:51:21 +03:00
confirm "Are you sure you want to reset all panel settings, Account data will not be lost, Username and password will not change" "n"
2023-02-09 22:18:06 +03:00
if [[ $? != 0 ]]; then
if [[ $# == 0 ]]; then
show_menu
fi
return 0
fi
/usr/local/x-ui/x-ui setting -reset
2024-11-04 12:33:07 +03:00
echo -e "All panel settings have been reset to default."
restart
2023-02-09 22:18:06 +03:00
}
check_config() {
local info=$(/usr/local/x-ui/x-ui setting -show true)
2023-02-09 22:18:06 +03:00
if [[ $? != 0 ]]; then
2023-04-18 08:51:21 +03:00
LOGE "get current settings error, please check logs"
2023-02-09 22:18:06 +03:00
show_menu
return
2023-02-09 22:18:06 +03:00
fi
LOGI "${info}"
local existing_webBasePath=$(echo "$info" | grep -Eo 'webBasePath: .+' | awk '{print $2}')
local existing_port=$(echo "$info" | grep -Eo 'port: .+' | awk '{print $2}')
2024-11-12 14:25:16 +03:00
local existing_cert=$(/usr/local/x-ui/x-ui setting -getCert true | grep -Eo 'cert: .+' | awk '{print $2}')
local server_ip=$(curl -s https://api.ipify.org)
2024-11-12 14:25:16 +03:00
if [[ -n "$existing_cert" ]]; then
local domain=$(basename "$(dirname "$existing_cert")")
if [[ "$domain" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo -e "${green}Access URL: https://${domain}:${existing_port}${existing_webBasePath}${plain}"
else
echo -e "${green}Access URL: https://${server_ip}:${existing_port}${existing_webBasePath}${plain}"
fi
else
echo -e "${green}Access URL: http://${server_ip}:${existing_port}${existing_webBasePath}${plain}"
fi
2023-02-09 22:18:06 +03:00
}
set_port() {
echo && echo -n -e "Enter port number[1-65535]: " && read port
if [[ -z "${port}" ]]; then
LOGD "Cancelled"
before_show_menu
else
/usr/local/x-ui/x-ui setting -port ${port}
2023-04-18 08:51:21 +03:00
echo -e "The port is set, Please restart the panel now, and use the new port ${green}${port}${plain} to access web panel"
2023-02-09 22:18:06 +03:00
confirm_restart
fi
}
start() {
check_status
if [[ $? == 0 ]]; then
echo ""
2023-04-18 08:51:21 +03:00
LOGI "Panel is running, No need to start again, If you need to restart, please select restart"
2023-02-09 22:18:06 +03:00
else
systemctl start x-ui
sleep 2
check_status
if [[ $? == 0 ]]; then
LOGI "x-ui Started Successfully"
else
2023-04-18 08:51:21 +03:00
LOGE "panel Failed to start, Probably because it takes longer than two seconds to start, Please check the log information later"
2023-02-09 22:18:06 +03:00
fi
fi
if [[ $# == 0 ]]; then
before_show_menu
fi
}
stop() {
check_status
if [[ $? == 1 ]]; then
echo ""
2023-04-18 08:51:21 +03:00
LOGI "Panel stopped, No need to stop again!"
2023-02-09 22:18:06 +03:00
else
systemctl stop x-ui
sleep 2
check_status
if [[ $? == 1 ]]; then
LOGI "x-ui and xray stopped successfully"
else
2023-04-18 08:51:21 +03:00
LOGE "Panel stop failed, Probably because the stop time exceeds two seconds, Please check the log information later"
2023-02-09 22:18:06 +03:00
fi
fi
if [[ $# == 0 ]]; then
before_show_menu
fi
}
restart() {
systemctl restart x-ui
sleep 2
check_status
if [[ $? == 0 ]]; then
LOGI "x-ui and xray Restarted successfully"
else
2023-04-18 08:51:21 +03:00
LOGE "Panel restart failed, Probably because it takes longer than two seconds to start, Please check the log information later"
2023-02-09 22:18:06 +03:00
fi
if [[ $# == 0 ]]; then
before_show_menu
fi
}
status() {
systemctl status x-ui -l
if [[ $# == 0 ]]; then
before_show_menu
fi
}
enable() {
systemctl enable x-ui
if [[ $? == 0 ]]; then
LOGI "x-ui Set to boot automatically on startup successfully"
else
LOGE "x-ui Failed to set Autostart"
fi
if [[ $# == 0 ]]; then
before_show_menu
fi
}
disable() {
systemctl disable x-ui
if [[ $? == 0 ]]; then
LOGI "x-ui Autostart Cancelled successfully"
else
LOGE "x-ui Failed to cancel autostart"
fi
if [[ $# == 0 ]]; then
before_show_menu
fi
}
show_log() {
2024-10-15 22:33:41 +03:00
echo -e "${green}\t1.${plain} Debug Log"
echo -e "${green}\t2.${plain} Clear All logs"
echo -e "${green}\t0.${plain} Back to Main Menu"
read -p "Choose an option: " choice
case "$choice" in
0)
2024-11-04 12:33:07 +03:00
show_menu
2024-10-15 22:33:41 +03:00
;;
1)
journalctl -u x-ui -e --no-pager -f -p debug
if [[ $# == 0 ]]; then
2023-02-09 22:18:06 +03:00
before_show_menu
2024-10-15 22:33:41 +03:00
fi
;;
2)
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s
echo "All Logs cleared."
restart
;;
*)
2024-11-04 12:33:07 +03:00
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
show_log
2024-10-15 22:33:41 +03:00
;;
esac
2023-02-09 22:18:06 +03:00
}
show_banlog() {
2024-11-04 12:33:07 +03:00
local system_log="/var/log/fail2ban.log"
echo -e "${green}Checking ban logs...${plain}\n"
if ! systemctl is-active --quiet fail2ban; then
echo -e "${red}Fail2ban service is not running!${plain}\n"
return 1
fi
if [[ -f "$system_log" ]]; then
echo -e "${green}Recent system ban activities from fail2ban.log:${plain}"
grep "3x-ipl" "$system_log" | grep -E "Ban|Unban" | tail -n 10 || echo -e "${yellow}No recent system ban activities found${plain}"
echo ""
fi
if [[ -f "${iplimit_banned_log_path}" ]]; then
echo -e "${green}3X-IPL ban log entries:${plain}"
2024-01-20 16:58:44 +03:00
if [[ -s "${iplimit_banned_log_path}" ]]; then
2024-11-04 12:33:07 +03:00
grep -v "INIT" "${iplimit_banned_log_path}" | tail -n 10 || echo -e "${yellow}No ban entries found${plain}"
2024-01-20 16:58:44 +03:00
else
2024-11-04 12:33:07 +03:00
echo -e "${yellow}Ban log file is empty${plain}"
2024-01-20 16:58:44 +03:00
fi
else
2024-11-04 12:33:07 +03:00
echo -e "${red}Ban log file not found at: ${iplimit_banned_log_path}${plain}"
fi
2024-11-04 12:33:07 +03:00
echo -e "\n${green}Current jail status:${plain}"
fail2ban-client status 3x-ipl || echo -e "${yellow}Unable to get jail status${plain}"
}
2024-02-21 15:46:45 +03:00
bbr_menu() {
echo -e "${green}\t1.${plain} Enable BBR"
echo -e "${green}\t2.${plain} Disable BBR"
echo -e "${green}\t0.${plain} Back to Main Menu"
read -p "Choose an option: " choice
case "$choice" in
0)
show_menu
;;
1)
enable_bbr
2024-11-04 12:33:07 +03:00
bbr_menu
2024-02-21 15:46:45 +03:00
;;
2)
disable_bbr
2024-11-04 12:33:07 +03:00
bbr_menu
;;
*)
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
bbr_menu
2024-02-21 15:46:45 +03:00
;;
esac
}
disable_bbr() {
if ! grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf || ! grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf; then
echo -e "${yellow}BBR is not currently enabled.${plain}"
2024-11-04 12:33:07 +03:00
before_show_menu
2024-02-21 15:46:45 +03:00
fi
# Replace BBR with CUBIC configurations
sed -i 's/net.core.default_qdisc=fq/net.core.default_qdisc=pfifo_fast/' /etc/sysctl.conf
sed -i 's/net.ipv4.tcp_congestion_control=bbr/net.ipv4.tcp_congestion_control=cubic/' /etc/sysctl.conf
# Apply changes
sysctl -p
# Verify that BBR is replaced with CUBIC
if [[ $(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}') == "cubic" ]]; then
echo -e "${green}BBR has been replaced with CUBIC successfully.${plain}"
else
echo -e "${red}Failed to replace BBR with CUBIC. Please check your system configuration.${plain}"
fi
}
enable_bbr() {
2023-04-18 08:51:21 +03:00
if grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf && grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf; then
echo -e "${green}BBR is already enabled!${plain}"
2024-11-04 12:33:07 +03:00
before_show_menu
2023-04-18 08:51:21 +03:00
fi
2023-02-09 22:18:06 +03:00
2023-04-18 08:51:21 +03:00
# Check the OS and install necessary packages
case "${release}" in
2024-04-01 11:42:28 +03:00
ubuntu | debian | armbian)
2024-01-20 16:58:44 +03:00
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
;;
2024-10-08 17:42:47 +03:00
centos | almalinux | rocky | ol)
2024-01-20 16:58:44 +03:00
yum -y update && yum -y install ca-certificates
;;
2024-09-26 13:19:18 +03:00
fedora | amzn)
2024-01-20 16:58:44 +03:00
dnf -y update && dnf -y install ca-certificates
;;
arch | manjaro | parch)
2024-04-01 11:42:28 +03:00
pacman -Sy --noconfirm ca-certificates
;;
2024-01-20 16:58:44 +03:00
*)
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
exit 1
;;
esac
2023-04-18 08:51:21 +03:00
# Enable BBR
echo "net.core.default_qdisc=fq" | tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | tee -a /etc/sysctl.conf
2023-04-18 08:51:21 +03:00
# Apply changes
sysctl -p
2023-02-09 22:18:06 +03:00
2023-04-18 08:51:21 +03:00
# Verify that BBR is enabled
if [[ $(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}') == "bbr" ]]; then
echo -e "${green}BBR has been enabled successfully.${plain}"
else
echo -e "${red}Failed to enable BBR. Please check your system configuration.${plain}"
fi
2023-02-09 22:18:06 +03:00
}
update_shell() {
2023-03-11 18:05:35 +03:00
wget -O /usr/bin/x-ui -N --no-check-certificate https://github.com/MHSanaei/3x-ui/raw/main/x-ui.sh
2023-02-09 22:18:06 +03:00
if [[ $? != 0 ]]; then
echo ""
2023-04-18 08:51:21 +03:00
LOGE "Failed to download script, Please check whether the machine can connect Github"
2023-02-09 22:18:06 +03:00
before_show_menu
else
chmod +x /usr/bin/x-ui
2024-11-04 12:33:07 +03:00
LOGI "Upgrade script succeeded, Please rerun the script"
before_show_menu
2023-02-09 22:18:06 +03:00
fi
}
# 0: running, 1: not running, 2: not installed
check_status() {
if [[ ! -f /etc/systemd/system/x-ui.service ]]; then
return 2
fi
temp=$(systemctl status x-ui | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1)
2023-04-30 00:27:15 +03:00
if [[ "${temp}" == "running" ]]; then
2023-02-09 22:18:06 +03:00
return 0
else
return 1
fi
}
check_enabled() {
temp=$(systemctl is-enabled x-ui)
2023-04-30 00:27:15 +03:00
if [[ "${temp}" == "enabled" ]]; then
2023-02-09 22:18:06 +03:00
return 0
else
return 1
fi
}
check_uninstall() {
check_status
if [[ $? != 2 ]]; then
echo ""
2023-04-18 08:51:21 +03:00
LOGE "Panel installed, Please do not reinstall"
2023-02-09 22:18:06 +03:00
if [[ $# == 0 ]]; then
before_show_menu
fi
return 1
else
return 0
fi
}
check_install() {
check_status
if [[ $? == 2 ]]; then
echo ""
LOGE "Please install the panel first"
if [[ $# == 0 ]]; then
before_show_menu
fi
return 1
else
return 0
fi
}
show_status() {
check_status
case $? in
0)
echo -e "Panel state: ${green}Running${plain}"
2023-02-09 22:18:06 +03:00
show_enable_status
;;
1)
echo -e "Panel state: ${yellow}Not Running${plain}"
show_enable_status
;;
2)
echo -e "Panel state: ${red}Not Installed${plain}"
;;
esac
show_xray_status
}
show_enable_status() {
check_enabled
if [[ $? == 0 ]]; then
echo -e "Start automatically: ${green}Yes${plain}"
else
echo -e "Start automatically: ${red}No${plain}"
fi
}
check_xray_status() {
count=$(ps -ef | grep "xray-linux" | grep -v "grep" | wc -l)
if [[ count -ne 0 ]]; then
return 0
else
return 1
fi
}
show_xray_status() {
check_xray_status
if [[ $? == 0 ]]; then
echo -e "xray state: ${green}Running${plain}"
2023-02-09 22:18:06 +03:00
else
echo -e "xray state: ${red}Not Running${plain}"
fi
}
2024-02-07 20:53:11 +03:00
firewall_menu() {
echo -e "${green}\t1.${plain} Install Firewall & open ports"
echo -e "${green}\t2.${plain} Allowed List"
echo -e "${green}\t3.${plain} Delete Ports from List"
echo -e "${green}\t4.${plain} Disable Firewall"
echo -e "${green}\t0.${plain} Back to Main Menu"
read -p "Choose an option: " choice
case "$choice" in
0)
show_menu
;;
1)
open_ports
2024-11-04 12:33:07 +03:00
firewall_menu
2024-02-07 20:53:11 +03:00
;;
2)
sudo ufw status
2024-11-04 12:33:07 +03:00
firewall_menu
2024-02-07 20:53:11 +03:00
;;
3)
delete_ports
2024-11-04 12:33:07 +03:00
firewall_menu
2024-02-07 20:53:11 +03:00
;;
4)
sudo ufw disable
2024-11-04 12:33:07 +03:00
firewall_menu
;;
*)
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
firewall_menu
2024-02-07 20:53:11 +03:00
;;
esac
}
open_ports() {
2023-05-13 18:36:16 +03:00
if ! command -v ufw &>/dev/null; then
2023-04-18 08:51:21 +03:00
echo "ufw firewall is not installed. Installing now..."
apt-get update
apt-get install -y ufw
else
2023-04-18 08:51:21 +03:00
echo "ufw firewall is already installed"
fi
2023-04-18 08:51:21 +03:00
# Check if the firewall is inactive
if ufw status | grep -q "Status: active"; then
echo "Firewall is already active"
2023-04-18 08:51:21 +03:00
else
echo "Activating firewall..."
2023-04-18 08:51:21 +03:00
# Open the necessary ports
ufw allow ssh
ufw allow http
ufw allow https
ufw allow 2053/tcp
2023-04-18 08:51:21 +03:00
# Enable the firewall
ufw --force enable
2023-04-18 08:51:21 +03:00
fi
# Prompt the user to enter a list of ports
read -p "Enter the ports you want to open (e.g. 80,443,2053 or range 400-500): " ports
# Check if the input is valid
if ! [[ $ports =~ ^([0-9]+|[0-9]+-[0-9]+)(,([0-9]+|[0-9]+-[0-9]+))*$ ]]; then
2023-05-13 18:36:16 +03:00
echo "Error: Invalid input. Please enter a comma-separated list of ports or a range of ports (e.g. 80,443,2053 or 400-500)." >&2
exit 1
2023-04-18 08:51:21 +03:00
fi
# Open the specified ports using ufw
2023-05-13 18:36:16 +03:00
IFS=',' read -ra PORT_LIST <<<"$ports"
2023-04-18 08:51:21 +03:00
for port in "${PORT_LIST[@]}"; do
if [[ $port == *-* ]]; then
2023-05-13 18:36:16 +03:00
# Split the range into start and end ports
start_port=$(echo $port | cut -d'-' -f1)
end_port=$(echo $port | cut -d'-' -f2)
ufw allow $start_port:$end_port/tcp
ufw allow $start_port:$end_port/udp
2023-04-18 08:51:21 +03:00
else
ufw allow "$port"
2023-04-18 08:51:21 +03:00
fi
done
2023-04-18 08:51:21 +03:00
# Confirm that the ports are open
echo "The following ports are now open:"
ufw status | grep "ALLOW" | grep -Eo "[0-9]+(/[a-z]+)?"
echo "Firewall status:"
ufw status verbose
2023-04-18 08:51:21 +03:00
}
2024-02-07 20:53:11 +03:00
delete_ports() {
# Prompt the user to enter the ports they want to delete
read -p "Enter the ports you want to delete (e.g. 80,443,2053 or range 400-500): " ports
# Check if the input is valid
if ! [[ $ports =~ ^([0-9]+|[0-9]+-[0-9]+)(,([0-9]+|[0-9]+-[0-9]+))*$ ]]; then
echo "Error: Invalid input. Please enter a comma-separated list of ports or a range of ports (e.g. 80,443,2053 or 400-500)." >&2
exit 1
fi
# Delete the specified ports using ufw
IFS=',' read -ra PORT_LIST <<<"$ports"
for port in "${PORT_LIST[@]}"; do
if [[ $port == *-* ]]; then
# Split the range into start and end ports
start_port=$(echo $port | cut -d'-' -f1)
end_port=$(echo $port | cut -d'-' -f2)
# Delete the port range
ufw delete allow $start_port:$end_port/tcp
ufw delete allow $start_port:$end_port/udp
2024-02-07 20:53:11 +03:00
else
ufw delete allow "$port"
fi
done
# Confirm that the ports are deleted
2024-10-07 18:21:32 +03:00
2024-02-07 20:53:11 +03:00
echo "Deleted the specified ports:"
for port in "${PORT_LIST[@]}"; do
if [[ $port == *-* ]]; then
start_port=$(echo $port | cut -d'-' -f1)
end_port=$(echo $port | cut -d'-' -f2)
# Check if the port range has been successfully deleted
(ufw status | grep -q "$start_port:$end_port") || echo "$start_port-$end_port"
else
# Check if the individual port has been successfully deleted
(ufw status | grep -q "$port") || echo "$port"
fi
done
2024-02-07 20:53:11 +03:00
}
2023-04-18 08:51:21 +03:00
update_geo() {
2024-10-07 16:37:53 +03:00
echo -e "${green}\t1.${plain} Loyalsoldier (geoip.dat, geosite.dat)"
echo -e "${green}\t2.${plain} chocolate4u (geoip_IR.dat, geosite_IR.dat)"
echo -e "${green}\t3.${plain} vuong2023 (geoip_VN.dat, geosite_VN.dat)"
echo -e "${green}\t0.${plain} Back to Main Menu"
read -p "Choose an option: " choice
2024-10-07 18:21:32 +03:00
systemctl stop x-ui
2024-10-07 16:37:53 +03:00
cd /usr/local/x-ui/bin
case "$choice" in
0)
show_menu
;;
1)
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}"
2024-11-04 12:33:07 +03:00
restart
2024-10-07 16:37:53 +03:00
;;
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}"
2024-11-04 12:33:07 +03:00
restart
2024-10-07 16:37:53 +03:00
;;
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}"
2024-11-04 12:33:07 +03:00
restart
2024-10-07 16:37:53 +03:00
;;
*)
2024-11-04 12:33:07 +03:00
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
update_geo
2024-10-07 16:37:53 +03:00
;;
esac
2024-10-07 18:21:32 +03:00
systemctl start x-ui
2023-04-18 08:51:21 +03:00
before_show_menu
}
2023-02-15 21:57:42 +03:00
install_acme() {
2024-10-07 16:28:00 +03:00
# Check if acme.sh is already installed
if command -v ~/.acme.sh/acme.sh &>/dev/null; then
LOGI "acme.sh is already installed."
return 0
fi
LOGI "Installing acme.sh..."
2024-10-07 18:21:32 +03:00
cd ~ || return 1 # Ensure you can change to the home directory
2024-10-07 16:28:00 +03:00
curl -s https://get.acme.sh | sh
2023-02-15 21:57:42 +03:00
if [ $? -ne 0 ]; then
2024-10-07 16:28:00 +03:00
LOGE "Installation of acme.sh failed."
2023-02-15 21:57:42 +03:00
return 1
else
2024-10-07 16:28:00 +03:00
LOGI "Installation of acme.sh succeeded."
2023-02-15 21:57:42 +03:00
fi
2024-10-07 16:28:00 +03:00
2023-02-15 21:57:42 +03:00
return 0
}
ssl_cert_issue_main() {
echo -e "${green}\t1.${plain} Get SSL"
echo -e "${green}\t2.${plain} Revoke"
echo -e "${green}\t3.${plain} Force Renew"
2024-10-07 15:50:59 +03:00
echo -e "${green}\t4.${plain} Show Existing Domains"
echo -e "${green}\t5.${plain} Set Cert paths for the panel"
2023-09-01 12:56:03 +03:00
echo -e "${green}\t0.${plain} Back to Main Menu"
2024-10-07 15:50:59 +03:00
read -p "Choose an option: " choice
case "$choice" in
2024-01-20 16:58:44 +03:00
0)
show_menu
;;
1)
ssl_cert_issue
2024-11-04 12:33:07 +03:00
ssl_cert_issue_main
2024-01-20 16:58:44 +03:00
;;
2)
2024-10-07 15:50:59 +03:00
local domains=$(find /root/cert/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
if [ -z "$domains" ]; then
echo "No certificates found to revoke."
else
echo "Existing domains:"
echo "$domains"
read -p "Please enter a domain from the list to revoke the certificate: " domain
2024-10-07 18:21:32 +03:00
if echo "$domains" | grep -qw "$domain"; then
2024-10-07 15:50:59 +03:00
~/.acme.sh/acme.sh --revoke -d ${domain}
LOGI "Certificate revoked for domain: $domain"
else
echo "Invalid domain entered."
fi
fi
2024-11-04 12:33:07 +03:00
ssl_cert_issue_main
2024-01-20 16:58:44 +03:00
;;
3)
2024-10-07 15:50:59 +03:00
local domains=$(find /root/cert/ -mindepth 1 -maxdepth 1 -type d -exec basename {} \;)
if [ -z "$domains" ]; then
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
2024-10-07 18:21:32 +03:00
if echo "$domains" | grep -qw "$domain"; then
2024-10-07 15:50:59 +03:00
~/.acme.sh/acme.sh --renew -d ${domain} --force
LOGI "Certificate forcefully renewed for domain: $domain"
else
echo "Invalid domain entered."
fi
fi
2024-11-04 12:33:07 +03:00
ssl_cert_issue_main
2024-10-07 15:50:59 +03:00
;;
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
2024-11-04 12:33:07 +03:00
ssl_cert_issue_main
2024-10-07 15:50:59 +03:00
;;
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
2024-10-07 18:21:32 +03:00
if echo "$domains" | grep -qw "$domain"; then
local webCertFile="/root/cert/${domain}/fullchain.pem"
local webKeyFile="/root/cert/${domain}/privkey.pem"
2024-10-07 18:21:32 +03:00
if [[ -f "${webCertFile}" && -f "${webKeyFile}" ]]; then
2024-10-07 18:21:32 +03:00
/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"
2024-10-07 18:38:23 +03:00
restart
else
echo "Certificate or private key not found for domain: $domain."
fi
else
echo "Invalid domain entered."
fi
fi
2024-11-04 12:33:07 +03:00
ssl_cert_issue_main
;;
2024-10-07 18:21:32 +03:00
*)
2024-11-04 12:33:07 +03:00
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
ssl_cert_issue_main
2024-01-20 16:58:44 +03:00
;;
esac
}
2023-04-30 00:27:15 +03:00
ssl_cert_issue() {
2024-10-31 16:43:30 +03:00
local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}')
local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}')
# check for acme.sh first
if ! command -v ~/.acme.sh/acme.sh &>/dev/null; then
echo "acme.sh could not be found. we will install it"
install_acme
if [ $? -ne 0 ]; then
LOGE "install acme failed, please check logs"
exit 1
fi
2023-02-15 21:57:42 +03:00
fi
2024-10-07 16:18:56 +03:00
# install socat second
case "${release}" in
2024-01-20 16:58:44 +03:00
ubuntu | debian | armbian)
apt update && apt install socat -y
;;
2024-10-08 17:42:47 +03:00
centos | almalinux | rocky | ol)
2024-01-20 16:58:44 +03:00
yum -y update && yum -y install socat
;;
2024-09-26 13:19:18 +03:00
fedora | amzn)
2024-01-20 16:58:44 +03:00
dnf -y update && dnf -y install socat
;;
arch | manjaro | parch)
2024-04-01 11:42:28 +03:00
pacman -Sy --noconfirm socat
;;
2024-01-20 16:58:44 +03:00
*)
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
exit 1
;;
esac
2023-02-15 21:57:42 +03:00
if [ $? -ne 0 ]; then
LOGE "install socat failed, please check logs"
2023-02-15 21:57:42 +03:00
exit 1
else
LOGI "install socat succeed..."
fi
2023-04-02 20:31:08 +03:00
2024-10-07 16:18:56 +03:00
# get the domain here, and we need to verify it
2023-02-15 21:57:42 +03:00
local domain=""
2024-10-07 16:18:56 +03:00
read -p "Please enter your domain name: " domain
LOGD "Your domain is: ${domain}, checking it..."
2024-10-07 16:18:56 +03:00
# check if there already exists a certificate
local currentCert=$(~/.acme.sh/acme.sh --list | tail -1 | awk '{print $1}')
if [ "${currentCert}" == "${domain}" ]; then
2023-02-15 21:57:42 +03:00
local certInfo=$(~/.acme.sh/acme.sh --list)
2024-10-07 16:18:56 +03:00
LOGE "System already has certificates for this domain. Cannot issue again. Current certificate details:"
2023-02-15 21:57:42 +03:00
LOGI "$certInfo"
exit 1
2023-02-15 21:57:42 +03:00
else
2024-10-07 16:18:56 +03:00
LOGI "Your domain is ready for issuing certificates now..."
2023-02-15 21:57:42 +03:00
fi
2023-05-13 18:36:16 +03:00
2024-10-07 16:18:56 +03:00
# create a directory for the certificate
2023-05-13 18:36:16 +03:00
certPath="/root/cert/${domain}"
if [ ! -d "$certPath" ]; then
mkdir -p "$certPath"
else
rm -rf "$certPath"
mkdir -p "$certPath"
fi
2024-10-07 16:18:56 +03:00
# get the port number for the standalone server
2023-02-15 21:57:42 +03:00
local WebPort=80
2024-10-07 16:18:56 +03:00
read -p "Please choose which port to use (default is 80): " WebPort
2023-02-15 21:57:42 +03:00
if [[ ${WebPort} -gt 65535 || ${WebPort} -lt 1 ]]; then
2024-10-07 16:18:56 +03:00
LOGE "Your input ${WebPort} is invalid, will use default port 80."
WebPort=80
2023-02-15 21:57:42 +03:00
fi
2024-10-07 16:18:56 +03:00
LOGI "Will use port: ${WebPort} to issue certificates. Please make sure this port is open."
# issue the certificate
2023-02-15 21:57:42 +03:00
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
~/.acme.sh/acme.sh --issue -d ${domain} --listen-v6 --standalone --httpport ${WebPort}
2023-02-15 21:57:42 +03:00
if [ $? -ne 0 ]; then
2024-10-07 16:18:56 +03:00
LOGE "Issuing certificate failed, please check logs."
2023-02-15 21:57:42 +03:00
rm -rf ~/.acme.sh/${domain}
exit 1
else
2024-10-07 16:18:56 +03:00
LOGE "Issuing certificate succeeded, installing certificates..."
2023-02-15 21:57:42 +03:00
fi
2024-10-07 16:18:56 +03:00
# install the certificate
2023-04-02 20:31:08 +03:00
~/.acme.sh/acme.sh --installcert -d ${domain} \
--key-file /root/cert/${domain}/privkey.pem \
--fullchain-file /root/cert/${domain}/fullchain.pem
2023-02-15 21:57:42 +03:00
if [ $? -ne 0 ]; then
2024-10-07 16:18:56 +03:00
LOGE "Installing certificate failed, exiting."
2023-02-15 21:57:42 +03:00
rm -rf ~/.acme.sh/${domain}
exit 1
else
2024-10-07 16:18:56 +03:00
LOGI "Installing certificate succeeded, enabling auto renew..."
2023-02-15 21:57:42 +03:00
fi
2024-10-07 16:18:56 +03:00
# enable auto-renew
2023-05-13 18:36:16 +03:00
~/.acme.sh/acme.sh --upgrade --auto-upgrade
if [ $? -ne 0 ]; then
2024-10-07 16:18:56 +03:00
LOGE "Auto renew failed, certificate details:"
2023-05-13 18:36:16 +03:00
ls -lah cert/*
chmod 755 $certPath/*
exit 1
else
2024-10-07 16:18:56 +03:00
LOGI "Auto renew succeeded, certificate details:"
2023-05-13 18:36:16 +03:00
ls -lah cert/*
chmod 755 $certPath/*
fi
2024-10-07 16:18:56 +03:00
# 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"
2024-10-07 18:21:32 +03:00
2024-10-07 16:18:56 +03:00
if [[ -f "$webCertFile" && -f "$webKeyFile" ]]; then
2024-10-07 18:21:32 +03:00
/usr/local/x-ui/x-ui cert -webCert "$webCertFile" -webCertKey "$webKeyFile"
2024-10-07 16:18:56 +03:00
LOGI "Panel paths set for domain: $domain"
LOGI " - Certificate File: $webCertFile"
LOGI " - Private Key File: $webKeyFile"
2024-10-31 16:43:30 +03:00
echo -e "${green}Access URL: https://${domain}:${existing_port}${existing_webBasePath}${plain}"
2024-10-07 18:38:23 +03:00
restart
2024-10-07 16:18:56 +03:00
else
LOGE "Error: Certificate or private key file not found for domain: $domain."
fi
else
LOGI "Skipping panel path setting."
fi
2023-05-13 18:36:16 +03:00
}
2023-04-18 08:51:21 +03:00
ssl_cert_issue_CF() {
2024-11-13 19:27:55 +03:00
local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}')
local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}')
LOGI "****** Instructions for Use ******"
LOGI "Follow the steps below to complete the process:"
LOGI "1. Cloudflare Registered E-mail."
LOGI "2. Cloudflare Global API Key."
LOGI "3. The Domain Name."
LOGI "4. Once the certificate is issued, you will be prompted to set the certificate for the panel (optional)."
LOGI "5. The script also supports automatic renewal of the SSL certificate after installation."
confirm "Do you confirm the information and wish to proceed? [y/n]" "y"
if [ $? -eq 0 ]; then
2024-11-13 19:27:55 +03:00
# Check for acme.sh first
if ! command -v ~/.acme.sh/acme.sh &>/dev/null; then
2024-11-13 19:27:55 +03:00
echo "acme.sh could not be found. We will install it."
install_acme
if [ $? -ne 0 ]; then
2024-11-13 19:27:55 +03:00
LOGE "Install acme failed, please check logs."
exit 1
fi
fi
2024-11-13 19:27:55 +03:00
CF_Domain=""
2024-11-13 19:27:55 +03:00
certPath="/root/cert-CF"
if [ ! -d "$certPath" ]; then
2024-11-13 19:27:55 +03:00
mkdir -p $certPath
else
rm -rf $certPath
2024-11-13 19:27:55 +03:00
mkdir -p $certPath
fi
2024-11-13 19:27:55 +03:00
LOGD "Please set a domain name:"
2024-11-13 19:27:55 +03:00
read -p "Input your domain here: " CF_Domain
LOGD "Your domain name is set to: ${CF_Domain}"
# Set up Cloudflare API details
CF_GlobalKey=""
CF_AccountEmail=""
LOGD "Please set the API key:"
2024-11-13 19:27:55 +03:00
read -p "Input your key here: " CF_GlobalKey
LOGD "Your API key is: ${CF_GlobalKey}"
LOGD "Please set up registered email:"
2024-11-13 19:27:55 +03:00
read -p "Input your email here: " CF_AccountEmail
LOGD "Your registered email address is: ${CF_AccountEmail}"
# Set the default CA to Let's Encrypt
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
if [ $? -ne 0 ]; then
2024-11-13 19:27:55 +03:00
LOGE "Default CA, Let'sEncrypt fail, script exiting..."
exit 1
fi
2024-11-13 19:27:55 +03:00
export CF_Key="${CF_GlobalKey}"
2024-11-13 19:27:55 +03:00
export CF_Email="${CF_AccountEmail}"
# Issue the certificate using Cloudflare DNS
~/.acme.sh/acme.sh --issue --dns dns_cf -d ${CF_Domain} -d *.${CF_Domain} --log
if [ $? -ne 0 ]; then
LOGE "Certificate issuance failed, script exiting..."
exit 1
else
2024-11-13 19:27:55 +03:00
LOGI "Certificate issued successfully, Installing..."
fi
2024-11-13 19:27:55 +03:00
# Install the certificate
mkdir -p ${certPath}/${CF_Domain}
if [ $? -ne 0 ]; then
LOGE "Failed to create directory: ${certPath}/${CF_Domain}"
exit 1
fi
2024-11-13 19:27:55 +03:00
~/.acme.sh/acme.sh --installcert -d ${CF_Domain} -d *.${CF_Domain} \
--fullchain-file ${certPath}/${CF_Domain}/fullchain.pem \
2024-11-13 19:27:55 +03:00
--key-file ${certPath}/${CF_Domain}/privkey.pem
if [ $? -ne 0 ]; then
LOGE "Certificate installation failed, script exiting..."
exit 1
else
2024-11-13 19:27:55 +03:00
LOGI "Certificate installed successfully, Turning on automatic updates..."
fi
2024-11-13 19:27:55 +03:00
# Enable auto-update
~/.acme.sh/acme.sh --upgrade --auto-upgrade
if [ $? -ne 0 ]; then
2024-11-13 19:27:55 +03:00
LOGE "Auto update setup failed, script exiting..."
exit 1
else
2024-11-13 19:27:55 +03:00
LOGI "The certificate is installed and auto-renewal is turned on. Specific information is as follows:"
ls -lah ${certPath}/${CF_Domain}
chmod 755 ${certPath}/${CF_Domain}
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="${certPath}/${CF_Domain}/fullchain.pem"
local webKeyFile="${certPath}/${CF_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: $CF_Domain"
LOGI " - Certificate File: $webCertFile"
LOGI " - Private Key File: $webKeyFile"
echo -e "${green}Access URL: https://${CF_Domain}:${existing_port}${existing_webBasePath}${plain}"
restart
else
LOGE "Error: Certificate or private key file not found for domain: $CF_Domain."
fi
else
LOGI "Skipping panel path setting."
fi
else
show_menu
fi
}
run_speedtest() {
# Check if Speedtest is already installed
2024-01-20 16:58:44 +03:00
if ! command -v speedtest &>/dev/null; then
# If not installed, install it
2023-05-23 02:13:15 +03:00
local pkg_manager=""
local speedtest_install_script=""
2024-01-20 16:58:44 +03:00
if command -v dnf &>/dev/null; then
2023-05-23 02:13:15 +03:00
pkg_manager="dnf"
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh"
2024-01-20 16:58:44 +03:00
elif command -v yum &>/dev/null; then
2023-05-23 02:13:15 +03:00
pkg_manager="yum"
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh"
2024-01-20 16:58:44 +03:00
elif command -v apt-get &>/dev/null; then
2023-05-23 02:13:15 +03:00
pkg_manager="apt-get"
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
2024-01-20 16:58:44 +03:00
elif command -v apt &>/dev/null; then
2023-05-23 02:13:15 +03:00
pkg_manager="apt"
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
fi
2024-01-20 16:58:44 +03:00
2023-05-23 02:13:15 +03:00
if [[ -z $pkg_manager ]]; then
2023-04-03 23:30:29 +03:00
echo "Error: Package manager not found. You may need to install Speedtest manually."
return 1
2023-05-23 02:13:15 +03:00
else
curl -s $speedtest_install_script | bash
$pkg_manager install -y speedtest
2023-04-03 23:30:29 +03:00
fi
fi
# Run Speedtest
speedtest
}
2024-10-28 21:24:44 +03:00
create_iplimit_jails() {
# Use default bantime if not passed => 15 minutes
local bantime="${1:-15}"
2024-01-20 15:19:34 +03:00
2024-01-20 19:41:58 +03:00
# Uncomment 'allowipv6 = auto' in fail2ban.conf
2024-01-20 15:19:34 +03:00
sed -i 's/#allowipv6 = auto/allowipv6 = auto/g' /etc/fail2ban/fail2ban.conf
2024-10-28 21:24:44 +03:00
# On Debian 12+ fail2ban's default backend should be changed to systemd
if [[ "${release}" == "debian" && ${os_version} -ge 12 ]]; then
sed -i '0,/action =/s/backend = auto/backend = systemd/' /etc/fail2ban/jail.conf
fi
cat << EOF > /etc/fail2ban/jail.d/3x-ipl.conf
[3x-ipl]
enabled=true
backend=auto
filter=3x-ipl
2024-10-28 21:24:44 +03:00
action = %(known/action)s[name=%(__name__)s, protocol="%(protocol)s", chain="%(chain)s"]
logpath=${iplimit_log_path}
maxretry=2
findtime=32
bantime=${bantime}m
EOF
cat << EOF > /etc/fail2ban/filter.d/3x-ipl.conf
[Definition]
datepattern = ^%%Y/%%m/%%d %%H:%%M:%%S
failregex = \[LIMIT_IP\]\s*Email\s*=\s*<F-USER>.+</F-USER>\s*\|\|\s*SRC\s*=\s*<ADDR>
ignoreregex =
EOF
cat << EOF > /etc/fail2ban/action.d/3x-ipl.conf
[INCLUDES]
2024-10-28 21:24:44 +03:00
before = iptables-common.conf
[Definition]
actionstart = <iptables> -N f2b-<name>
<iptables> -A f2b-<name> -j <returntype>
<iptables> -I <chain> -p <protocol> -j f2b-<name>
actionstop = <iptables> -D <chain> -p <protocol> -j f2b-<name>
<actionflush>
<iptables> -X f2b-<name>
actioncheck = <iptables> -n -L <chain> | grep -q 'f2b-<name>[ \t]'
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
echo "\$(date +"%%Y/%%m/%%d %%H:%%M:%%S") BAN [Email] = <F-USER> [IP] = <ip> banned for <bantime> seconds." >> ${iplimit_banned_log_path}
actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
echo "\$(date +"%%Y/%%m/%%d %%H:%%M:%%S") UNBAN [Email] = <F-USER> [IP] = <ip> unbanned." >> ${iplimit_banned_log_path}
[Init]
2024-10-28 21:24:44 +03:00
# Use default settings from iptables-common.conf
# This will automatically handle both IPv4 and IPv6
name = default
protocol = tcp
chain = INPUT
EOF
2024-01-20 19:41:58 +03:00
echo -e "${green}Ip Limit jail files created with a bantime of ${bantime} minutes.${plain}"
}
iplimit_remove_conflicts() {
local jail_files=(
/etc/fail2ban/jail.conf
/etc/fail2ban/jail.local
)
for file in "${jail_files[@]}"; do
# Check for [3x-ipl] config in jail file then remove it
if test -f "${file}" && grep -qw '3x-ipl' ${file}; then
sed -i "/\[3x-ipl\]/,/^$/d" ${file}
echo -e "${yellow}Removing conflicts of [3x-ipl] in jail (${file})!${plain}\n"
fi
done
}
iplimit_main() {
echo -e "\n${green}\t1.${plain} Install Fail2ban and configure IP Limit"
echo -e "${green}\t2.${plain} Change Ban Duration"
echo -e "${green}\t3.${plain} Unban Everyone"
2024-10-28 21:24:44 +03:00
echo -e "${green}\t4.${plain} Ban Logs"
echo -e "${green}\t5.${plain} Real-Time Logs"
echo -e "${green}\t6.${plain} Service Status"
echo -e "${green}\t7.${plain} Service Restart"
echo -e "${green}\t8.${plain} Uninstall Fail2ban and IP Limit"
echo -e "${green}\t0.${plain} Back to Main Menu"
read -p "Choose an option: " choice
case "$choice" in
2024-01-20 16:58:44 +03:00
0)
show_menu
;;
1)
confirm "Proceed with installation of Fail2ban & IP Limit?" "y"
if [[ $? == 0 ]]; then
install_iplimit
else
iplimit_main
fi
;;
2)
read -rp "Please enter new Ban Duration in Minutes [default 30]: " NUM
if [[ $NUM =~ ^[0-9]+$ ]]; then
create_iplimit_jails ${NUM}
systemctl restart fail2ban
else
echo -e "${red}${NUM} is not a number! Please, try again.${plain}"
fi
iplimit_main
;;
3)
confirm "Proceed with Unbanning everyone from IP Limit jail?" "y"
if [[ $? == 0 ]]; then
fail2ban-client reload --restart --unban 3x-ipl
2024-01-21 04:15:17 +03:00
truncate -s 0 "${iplimit_banned_log_path}"
2024-01-20 16:58:44 +03:00
echo -e "${green}All users Unbanned successfully.${plain}"
iplimit_main
else
echo -e "${yellow}Cancelled.${plain}"
fi
iplimit_main
;;
4)
show_banlog
2024-11-04 12:33:07 +03:00
iplimit_main
2024-01-20 16:58:44 +03:00
;;
5)
2024-10-28 21:24:44 +03:00
tail -f /var/log/fail2ban.log
2024-11-04 12:33:07 +03:00
iplimit_main
2024-01-20 16:58:44 +03:00
;;
6)
2024-10-28 21:24:44 +03:00
service fail2ban status
2024-11-04 12:33:07 +03:00
iplimit_main
2024-06-04 13:52:21 +03:00
;;
7)
2024-10-28 21:24:44 +03:00
systemctl restart fail2ban
2024-11-04 12:33:07 +03:00
iplimit_main
2024-10-28 21:24:44 +03:00
;;
8)
2024-01-20 16:58:44 +03:00
remove_iplimit
2024-11-04 12:33:07 +03:00
iplimit_main
;;
*)
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
iplimit_main
2024-01-20 16:58:44 +03:00
;;
esac
}
install_iplimit() {
if ! command -v fail2ban-client &>/dev/null; then
echo -e "${green}Fail2ban is not installed. Installing now...!${plain}\n"
2024-01-20 16:58:44 +03:00
# Check the OS and install necessary packages
case "${release}" in
2024-06-04 13:27:59 +03:00
ubuntu)
if [[ "${os_version}" -ge 24 ]]; then
apt update && apt install python3-pip -y
python3 -m pip install pyasynchat --break-system-packages
fi
apt update && apt install fail2ban -y
;;
debian | armbian)
apt update && apt install fail2ban -y
2024-01-20 16:58:44 +03:00
;;
2024-10-08 17:42:47 +03:00
centos | almalinux | rocky | ol)
2024-01-20 16:58:44 +03:00
yum update -y && yum install epel-release -y
yum -y install fail2ban
;;
2024-09-26 13:19:18 +03:00
fedora | amzn)
2024-01-20 16:58:44 +03:00
dnf -y update && dnf -y install fail2ban
;;
arch | manjaro | parch)
2024-06-04 13:27:59 +03:00
pacman -Syu --noconfirm fail2ban
;;
2024-01-20 16:58:44 +03:00
*)
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
exit 1
;;
esac
if ! command -v fail2ban-client &>/dev/null; then
echo -e "${red}Fail2ban installation failed.${plain}\n"
exit 1
fi
echo -e "${green}Fail2ban installed successfully!${plain}\n"
else
echo -e "${yellow}Fail2ban is already installed.${plain}\n"
fi
echo -e "${green}Configuring IP Limit...${plain}\n"
# make sure there's no conflict for jail files
iplimit_remove_conflicts
# Check if log file exists
if ! test -f "${iplimit_banned_log_path}"; then
touch ${iplimit_banned_log_path}
fi
# Check if service log file exists so fail2ban won't return error
if ! test -f "${iplimit_log_path}"; then
touch ${iplimit_log_path}
fi
# Create the iplimit jail files
# we didn't pass the bantime here to use the default value
create_iplimit_jails
# Launching fail2ban
if ! systemctl is-active --quiet fail2ban; then
systemctl start fail2ban
2024-01-20 16:08:54 +03:00
systemctl enable fail2ban
else
systemctl restart fail2ban
fi
systemctl enable fail2ban
echo -e "${green}IP Limit installed and configured successfully!${plain}\n"
before_show_menu
}
2024-01-20 16:58:44 +03:00
remove_iplimit() {
echo -e "${green}\t1.${plain} Only remove IP Limit configurations"
echo -e "${green}\t2.${plain} Uninstall Fail2ban and IP Limit"
2024-11-04 12:33:07 +03:00
echo -e "${green}\t0.${plain} Back to Main Menu"
read -p "Choose an option: " num
case "$num" in
2024-01-20 16:58:44 +03:00
1)
rm -f /etc/fail2ban/filter.d/3x-ipl.conf
rm -f /etc/fail2ban/action.d/3x-ipl.conf
rm -f /etc/fail2ban/jail.d/3x-ipl.conf
systemctl restart fail2ban
echo -e "${green}IP Limit removed successfully!${plain}\n"
before_show_menu
;;
2)
rm -rf /etc/fail2ban
systemctl stop fail2ban
case "${release}" in
2024-04-01 11:42:28 +03:00
ubuntu | debian | armbian)
2024-01-20 16:58:44 +03:00
apt-get remove -y fail2ban
apt-get purge -y fail2ban -y
apt-get autoremove -y
;;
2024-10-08 17:42:47 +03:00
centos | almalinux | rocky | ol)
2024-01-20 16:58:44 +03:00
yum remove fail2ban -y
yum autoremove -y
;;
2024-09-26 13:19:18 +03:00
fedora | amzn)
2024-01-20 16:58:44 +03:00
dnf remove fail2ban -y
dnf autoremove -y
;;
arch | manjaro | parch)
2024-04-01 11:42:28 +03:00
pacman -Rns --noconfirm fail2ban
;;
2024-01-20 16:58:44 +03:00
*)
echo -e "${red}Unsupported operating system. Please uninstall Fail2ban manually.${plain}\n"
exit 1
;;
esac
echo -e "${green}Fail2ban and IP Limit removed successfully!${plain}\n"
before_show_menu
;;
0)
2024-11-04 12:33:07 +03:00
show_menu
2024-01-20 16:58:44 +03:00
;;
*)
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
remove_iplimit
;;
esac
}
SSH_port_forwarding() {
local server_ip=$(curl -s https://api.ipify.org)
local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}')
local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}')
local existing_listenIP=$(/usr/local/x-ui/x-ui setting -getListen true | grep -Eo 'listenIP: .+' | awk '{print $2}')
local existing_cert=$(/usr/local/x-ui/x-ui setting -getCert true | grep -Eo 'cert: .+' | awk '{print $2}')
local existing_key=$(/usr/local/x-ui/x-ui setting -getCert true | grep -Eo 'key: .+' | awk '{print $2}')
local config_listenIP=""
local listen_choice=""
if [[ -n "$existing_cert" && -n "$existing_key" ]]; then
echo -e "${green}Panel is secure with SSL.${plain}"
2024-11-04 12:33:07 +03:00
before_show_menu
fi
2024-10-31 16:43:30 +03:00
if [[ -z "$existing_cert" && -z "$existing_key" && (-z "$existing_listenIP" || "$existing_listenIP" == "0.0.0.0") ]]; then
echo -e "\n${red}Warning: No Cert and Key found! The panel is not secure.${plain}"
echo "Please obtain a certificate or set up SSH port forwarding."
fi
2024-10-31 16:43:30 +03:00
if [[ -n "$existing_listenIP" && "$existing_listenIP" != "0.0.0.0" && (-z "$existing_cert" && -z "$existing_key") ]]; then
echo -e "\n${green}Current SSH Port Forwarding Configuration:${plain}"
echo -e "Standard SSH command:"
echo -e "${yellow}ssh -L 2222:${existing_listenIP}:${existing_port} root@${server_ip}${plain}"
echo -e "\nIf using SSH key:"
echo -e "${yellow}ssh -i <sshkeypath> -L 2222:${existing_listenIP}:${existing_port} root@${server_ip}${plain}"
echo -e "\nAfter connecting, access the panel at:"
echo -e "${yellow}http://localhost:2222${existing_webBasePath}${plain}"
fi
2024-10-31 16:43:30 +03:00
echo -e "\nChoose an option:"
echo -e "${green}1.${plain} Set listen IP"
echo -e "${green}2.${plain} Clear listen IP"
2024-11-04 12:33:07 +03:00
echo -e "${green}0.${plain} Back to Main Menu"
read -p "Choose an option: " num
case "$num" in
2024-10-31 16:43:30 +03:00
1)
if [[ -z "$existing_listenIP" || "$existing_listenIP" == "0.0.0.0" ]]; then
echo -e "\nNo listenIP configured. Choose an option:"
echo -e "1. Use default IP (127.0.0.1)"
echo -e "2. Set a custom IP"
read -p "Select an option (1 or 2): " listen_choice
config_listenIP="127.0.0.1"
[[ "$listen_choice" == "2" ]] && read -p "Enter custom IP to listen on: " config_listenIP
/usr/local/x-ui/x-ui setting -listenIP "${config_listenIP}" >/dev/null 2>&1
echo -e "${green}listen IP has been set to ${config_listenIP}.${plain}"
echo -e "\n${green}SSH Port Forwarding Configuration:${plain}"
echo -e "Standard SSH command:"
echo -e "${yellow}ssh -L 2222:${config_listenIP}:${existing_port} root@${server_ip}${plain}"
echo -e "\nIf using SSH key:"
echo -e "${yellow}ssh -i <sshkeypath> -L 2222:${config_listenIP}:${existing_port} root@${server_ip}${plain}"
echo -e "\nAfter connecting, access the panel at:"
echo -e "${yellow}http://localhost:2222${existing_webBasePath}${plain}"
restart
2024-10-31 16:43:30 +03:00
else
config_listenIP="${existing_listenIP}"
echo -e "${green}Current listen IP is already set to ${config_listenIP}.${plain}"
fi
;;
2)
/usr/local/x-ui/x-ui setting -listenIP 0.0.0.0 >/dev/null 2>&1
echo -e "${green}Listen IP has been cleared.${plain}"
restart
;;
0)
2024-11-04 12:33:07 +03:00
show_menu
2024-10-31 16:43:30 +03:00
;;
*)
2024-11-04 12:33:07 +03:00
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
SSH_port_forwarding
2024-10-31 16:43:30 +03:00
;;
esac
}
2023-02-09 22:18:06 +03:00
show_usage() {
echo "x-ui control menu usages: "
echo "------------------------------------------"
2024-06-24 14:47:13 +03:00
echo -e "SUBCOMMANDS:"
echo -e "x-ui - Admin Management Script"
echo -e "x-ui start - Start"
echo -e "x-ui stop - Stop"
echo -e "x-ui restart - Restart"
echo -e "x-ui status - Current Status"
echo -e "x-ui settings - Current Settings"
echo -e "x-ui enable - Enable Autostart on OS Startup"
echo -e "x-ui disable - Disable Autostart on OS Startup"
echo -e "x-ui log - Check logs"
echo -e "x-ui banlog - Check Fail2ban ban logs"
2024-06-24 14:47:13 +03:00
echo -e "x-ui update - Update"
echo -e "x-ui custom - custom version"
echo -e "x-ui install - Install"
echo -e "x-ui uninstall - Uninstall"
2023-02-09 22:18:06 +03:00
echo "------------------------------------------"
}
show_menu() {
echo -e "
2024-06-24 14:47:13 +03:00
${green}3X-UI Panel Management Script${plain}
2023-02-15 21:57:42 +03:00
${green}0.${plain} Exit Script
2023-02-09 22:18:06 +03:00
————————————————
2023-12-23 17:28:11 +03:00
${green}1.${plain} Install
${green}2.${plain} Update
2024-06-24 16:22:05 +03:00
${green}3.${plain} Update Menu
2024-10-31 03:18:37 +03:00
${green}4.${plain} Legacy Version
2024-06-24 16:22:05 +03:00
${green}5.${plain} Uninstall
2023-02-09 22:18:06 +03:00
————————————————
2024-06-24 16:22:05 +03:00
${green}6.${plain} Reset Username & Password & Secret Token
${green}7.${plain} Reset Web Base Path
${green}8.${plain} Reset Settings
${green}9.${plain} Change Port
${green}10.${plain} View Current Settings
2023-02-09 22:18:06 +03:00
————————————————
2024-06-24 16:22:05 +03:00
${green}11.${plain} Start
${green}12.${plain} Stop
${green}13.${plain} Restart
${green}14.${plain} Check Status
2024-10-15 22:33:41 +03:00
${green}15.${plain} Logs Management
2023-02-09 22:18:06 +03:00
————————————————
2024-06-24 16:22:05 +03:00
${green}16.${plain} Enable Autostart
${green}17.${plain} Disable Autostart
2023-02-09 22:18:06 +03:00
————————————————
2024-06-24 16:22:05 +03:00
${green}18.${plain} SSL Certificate Management
${green}19.${plain} Cloudflare SSL Certificate
${green}20.${plain} IP Limit Management
2024-09-09 10:48:48 +03:00
${green}21.${plain} Firewall Management
${green}22.${plain} SSH Port Forwarding Management
2023-06-25 00:37:34 +03:00
————————————————
${green}23.${plain} Enable BBR
${green}24.${plain} Update Geo Files
${green}25.${plain} Speedtest by Ookla
"
2023-02-09 22:18:06 +03:00
show_status
echo && read -p "Please enter your selection [0-25]: " num
2023-02-09 22:18:06 +03:00
case "${num}" in
0)
exit 0
;;
1)
check_uninstall && install
;;
2)
check_install && update
;;
3)
2024-06-24 16:22:05 +03:00
check_install && update_menu
2023-02-09 22:18:06 +03:00
;;
4)
2024-10-31 03:18:37 +03:00
check_install && legacy_version
2023-02-09 22:18:06 +03:00
;;
5)
2024-06-24 16:22:05 +03:00
check_install && uninstall
2023-02-09 22:18:06 +03:00
;;
6)
2024-06-24 16:22:05 +03:00
check_install && reset_user
2023-02-09 22:18:06 +03:00
;;
7)
2024-06-24 16:22:05 +03:00
check_install && reset_webbasepath
2023-02-09 22:18:06 +03:00
;;
8)
2024-06-24 16:22:05 +03:00
check_install && reset_config
2023-02-09 22:18:06 +03:00
;;
9)
2024-06-24 16:22:05 +03:00
check_install && set_port
2023-02-09 22:18:06 +03:00
;;
10)
2024-06-24 16:22:05 +03:00
check_install && check_config
2023-02-09 22:18:06 +03:00
;;
11)
2024-06-24 16:22:05 +03:00
check_install && start
2023-02-09 22:18:06 +03:00
;;
12)
2024-06-24 16:22:05 +03:00
check_install && stop
2023-02-09 22:18:06 +03:00
;;
13)
2024-06-24 16:22:05 +03:00
check_install && restart
2023-02-09 22:18:06 +03:00
;;
14)
2024-06-24 16:22:05 +03:00
check_install && status
2023-02-09 22:18:06 +03:00
;;
15)
2024-06-24 16:22:05 +03:00
check_install && show_log
2023-02-09 22:18:06 +03:00
;;
16)
2024-06-24 16:22:05 +03:00
check_install && enable
2023-02-09 22:18:06 +03:00
;;
17)
2024-06-24 16:22:05 +03:00
check_install && disable
;;
18)
2024-06-24 16:22:05 +03:00
ssl_cert_issue_main
;;
19)
2024-06-24 16:22:05 +03:00
ssl_cert_issue_CF
;;
2023-05-13 18:36:16 +03:00
20)
2024-06-24 16:22:05 +03:00
iplimit_main
;;
2024-01-27 12:26:10 +03:00
21)
2024-06-24 16:22:05 +03:00
firewall_menu
2024-01-01 23:09:21 +03:00
;;
2024-09-09 10:48:48 +03:00
22)
SSH_port_forwarding
2024-06-24 15:43:39 +03:00
;;
2024-09-09 10:48:48 +03:00
23)
bbr_menu
2024-06-24 16:22:05 +03:00
;;
2024-09-09 10:48:48 +03:00
24)
update_geo
;;
25)
2023-06-25 00:37:34 +03:00
run_speedtest
2024-01-20 16:58:44 +03:00
;;
2023-02-09 22:18:06 +03:00
*)
LOGE "Please enter the correct number [0-25]"
2023-02-09 22:18:06 +03:00
;;
esac
}
if [[ $# > 0 ]]; then
case $1 in
"start")
check_install 0 && start 0
;;
"stop")
check_install 0 && stop 0
;;
"restart")
check_install 0 && restart 0
;;
"status")
check_install 0 && status 0
;;
2024-06-24 14:47:13 +03:00
"settings")
check_install 0 && check_config 0
;;
2023-02-09 22:18:06 +03:00
"enable")
check_install 0 && enable 0
;;
"disable")
check_install 0 && disable 0
;;
"log")
check_install 0 && show_log 0
;;
"banlog")
check_install 0 && show_banlog 0
;;
2023-02-09 22:18:06 +03:00
"update")
check_install 0 && update 0
;;
2024-10-31 03:18:37 +03:00
"legacy")
check_install 0 && legacy_version 0
2024-06-24 14:47:13 +03:00
;;
2023-02-09 22:18:06 +03:00
"install")
check_uninstall 0 && install 0
;;
"uninstall")
check_install 0 && uninstall 0
;;
*) show_usage ;;
esac
else
show_menu
fi