Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2026-01-11 17:28:43 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2026-01-11 17:28:43 +0300
commitf8c9aac97cfe4bb38c4dad4b1bc5f9bb18a7ec68 (patch)
treecada649f796f1738f7c4f5a6d0e6064a2b8c53c6 /x-ui.sh
parente42c17f2b272c6236af55b948f37c38a66f82e70 (diff)
Add port selection and checks for ACME HTTP-01 listener
Introduces user prompts to select the port for ACME HTTP-01 certificate validation (default 80), checks if the chosen port is available, and provides guidance for port forwarding. Adds is_port_in_use helper to all scripts and improves messaging for certificate issuance and error handling.
Diffstat (limited to 'x-ui.sh')
-rw-r--r--x-ui.sh58
1 files changed, 54 insertions, 4 deletions
diff --git a/x-ui.sh b/x-ui.sh
index bdb48817..4dda45a0 100644
--- a/x-ui.sh
+++ b/x-ui.sh
@@ -19,6 +19,23 @@ function LOGI() {
echo -e "${green}[INF] $* ${plain}"
}
+# Port helpers: detect listener and owning process (best effort)
+is_port_in_use() {
+ local port="$1"
+ if command -v ss >/dev/null 2>&1; then
+ ss -ltn 2>/dev/null | awk -v p=":${port}$" '$4 ~ p {exit 0} END {exit 1}'
+ return
+ fi
+ if command -v netstat >/dev/null 2>&1; then
+ netstat -lnt 2>/dev/null | awk -v p=":${port} " '$4 ~ p {exit 0} END {exit 1}'
+ return
+ fi
+ if command -v lsof >/dev/null 2>&1; then
+ lsof -nP -iTCP:${port} -sTCP:LISTEN >/dev/null 2>&1 && return 0
+ fi
+ return 1
+}
+
# Simple helpers for domain/IP validation
is_ipv4() {
[[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] && return 0 || return 1
@@ -885,8 +902,10 @@ update_geofiles() {
"RU") dat_files=(geoip_RU geosite_RU); dat_source="runetfreedom/russia-v2ray-rules-dat";;
esac
for dat in "${dat_files[@]}"; do
+ # Remove suffix for remote filename (e.g., geoip_IR -> geoip)
+ remote_file="${dat%%_*}"
curl -fLRo ${xui_folder}/bin/${dat}.dat -z ${xui_folder}/bin/${dat}.dat \
- https://github.com/${dat_source}/releases/latest/download/${dat%%_}.dat
+ https://github.com/${dat_source}/releases/latest/download/${remote_file}.dat
done
}
@@ -1146,10 +1165,41 @@ ssl_cert_issue_for_ip() {
LOGI "Including IPv6 address: ${ipv6_addr}"
fi
- # Use port 80 for certificate issuance
- local WebPort=80
+ # Choose port for HTTP-01 listener (default 80, allow override)
+ local WebPort=""
+ read -rp "Port to use for ACME HTTP-01 listener (default 80): " WebPort
+ WebPort="${WebPort:-80}"
+ if ! [[ "${WebPort}" =~ ^[0-9]+$ ]] || ((WebPort < 1 || WebPort > 65535)); then
+ LOGE "Invalid port provided. Falling back to 80."
+ WebPort=80
+ fi
LOGI "Using port ${WebPort} to issue certificate for IP: ${server_ip}"
- LOGI "Make sure port ${WebPort} is open and not in use..."
+ if [[ "${WebPort}" -ne 80 ]]; then
+ LOGI "Reminder: Let's Encrypt still reaches port 80; forward external port 80 to ${WebPort} for validation."
+ fi
+
+ while true; do
+ if is_port_in_use "${WebPort}"; then
+ LOGI "Port ${WebPort} is currently in use."
+
+ local alt_port=""
+ read -rp "Enter another port for acme.sh standalone listener (leave empty to abort): " alt_port
+ alt_port="${alt_port// /}"
+ if [[ -z "${alt_port}" ]]; then
+ LOGE "Port ${WebPort} is busy; cannot proceed with issuance."
+ return 1
+ fi
+ if ! [[ "${alt_port}" =~ ^[0-9]+$ ]] || ((alt_port < 1 || alt_port > 65535)); then
+ LOGE "Invalid port provided."
+ return 1
+ fi
+ WebPort="${alt_port}"
+ continue
+ else
+ LOGI "Port ${WebPort} is free and ready for standalone validation."
+ break
+ fi
+ done
# Reload command - restarts panel after renewal
local reloadCmd="systemctl restart x-ui 2>/dev/null || rc-service x-ui restart 2>/dev/null"