mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-02-28 21:23:01 +00:00
142 lines
6 KiB
Bash
142 lines
6 KiB
Bash
#!/bin/bash
|
|
# lib/extras.sh - Extra utilities (speedtest, SSH port forwarding)
|
|
|
|
# Include guard
|
|
[[ -n "${__X_UI_EXTRAS_INCLUDED:-}" ]] && return 0
|
|
__X_UI_EXTRAS_INCLUDED=1
|
|
|
|
# Source dependencies
|
|
source "${LIB_DIR}/common.sh"
|
|
source "${LIB_DIR}/service.sh"
|
|
|
|
run_speedtest() {
|
|
# Check if Speedtest is already installed
|
|
if ! command -v speedtest &>/dev/null; then
|
|
# If not installed, determine installation method
|
|
if command -v snap &>/dev/null; then
|
|
# Use snap to install Speedtest
|
|
echo "Installing Speedtest using snap..."
|
|
snap install speedtest
|
|
else
|
|
# Fallback to using package managers
|
|
local pkg_manager=""
|
|
local speedtest_install_script=""
|
|
|
|
if command -v dnf &>/dev/null; then
|
|
pkg_manager="dnf"
|
|
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh"
|
|
elif command -v yum &>/dev/null; then
|
|
pkg_manager="yum"
|
|
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh"
|
|
elif command -v apt-get &>/dev/null; then
|
|
pkg_manager="apt-get"
|
|
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
|
|
elif command -v apt &>/dev/null; then
|
|
pkg_manager="apt"
|
|
speedtest_install_script="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
|
|
fi
|
|
|
|
if [[ -z $pkg_manager ]]; then
|
|
echo "Error: Package manager not found. You may need to install Speedtest manually."
|
|
return 1
|
|
else
|
|
echo "Installing Speedtest using $pkg_manager..."
|
|
curl -s $speedtest_install_script | bash
|
|
$pkg_manager install -y speedtest
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
speedtest
|
|
}
|
|
|
|
SSH_port_forwarding() {
|
|
local URL_lists=(
|
|
"https://api4.ipify.org"
|
|
"https://ipv4.icanhazip.com"
|
|
"https://v4.api.ipinfo.io/ip"
|
|
"https://ipv4.myexternalip.com/raw"
|
|
"https://4.ident.me"
|
|
"https://check-host.net/ip"
|
|
)
|
|
local server_ip=""
|
|
for ip_address in "${URL_lists[@]}"; do
|
|
server_ip=$(curl -s --max-time 3 "${ip_address}" 2>/dev/null | tr -d '[:space:]')
|
|
if [[ -n "${server_ip}" ]]; then
|
|
break
|
|
fi
|
|
done
|
|
local existing_webBasePath=$(${xui_folder}/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}')
|
|
local existing_port=$(${xui_folder}/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}')
|
|
local existing_listenIP=$(${xui_folder}/x-ui setting -getListen true | grep -Eo 'listenIP: .+' | awk '{print $2}')
|
|
local existing_cert=$(${xui_folder}/x-ui setting -getCert true | grep -Eo 'cert: .+' | awk '{print $2}')
|
|
local existing_key=$(${xui_folder}/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}"
|
|
before_show_menu
|
|
fi
|
|
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
|
|
|
|
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
|
|
|
|
echo -e "\nChoose an option:"
|
|
echo -e "${green}1.${plain} Set listen IP"
|
|
echo -e "${green}2.${plain} Clear listen IP"
|
|
echo -e "${green}0.${plain} Back to Main Menu"
|
|
read -rp "Choose an option: " num
|
|
|
|
case "$num" in
|
|
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 -rp "Select an option (1 or 2): " listen_choice
|
|
|
|
config_listenIP="127.0.0.1"
|
|
[[ "$listen_choice" == "2" ]] && read -rp "Enter custom IP to listen on: " config_listenIP
|
|
|
|
${xui_folder}/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
|
|
else
|
|
config_listenIP="${existing_listenIP}"
|
|
echo -e "${green}Current listen IP is already set to ${config_listenIP}.${plain}"
|
|
fi
|
|
;;
|
|
2)
|
|
${xui_folder}/x-ui setting -listenIP 0.0.0.0 >/dev/null 2>&1
|
|
echo -e "${green}Listen IP has been cleared.${plain}"
|
|
restart
|
|
;;
|
|
0)
|
|
show_menu
|
|
;;
|
|
*)
|
|
echo -e "${red}Invalid option. Please select a valid number.${plain}\n"
|
|
SSH_port_forwarding
|
|
;;
|
|
esac
|
|
}
|