forked from linkong/planet
release: bump version to 0.59.0
This commit is contained in:
133
planet.sh
133
planet.sh
@@ -78,6 +78,7 @@ WAIT_SPINNER_TICKS_PER_SECOND=8
|
||||
WAIT_SPINNER_DETAIL=""
|
||||
WAIT_SPINNER_MESSAGE=""
|
||||
WAIT_SESSION_ACTIVE=0
|
||||
PORT_CHECK_STATUS_ACTIVE=0
|
||||
VERBOSE=0
|
||||
WAIT_VERBOSE_LOG_FILE=""
|
||||
WAIT_VERBOSE_LINE_COUNT="${WAIT_VERBOSE_LINE_COUNT:-5}"
|
||||
@@ -897,9 +898,17 @@ request_windows_port_cleanup() {
|
||||
mkdir -p "$PLANET_STATE_DIR"
|
||||
write_windows_port_cleanup_script "$script_path" "$@"
|
||||
|
||||
log_warn "即将请求管理员 PowerShell 清理 Windows 侧端口 ${ports_label}"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "请求管理员 PowerShell 清理 Windows 侧端口 ${ports_label}"
|
||||
else
|
||||
log_warn "即将请求管理员 PowerShell 清理 Windows 侧端口 ${ports_label}"
|
||||
fi
|
||||
run_windows_admin_powershell_script "$script_path" "清理 Windows 侧端口 ${ports_label}" || {
|
||||
log_warn "管理员 PowerShell 未完成端口清理;端口 ${ports_label} 可能仍无法绑定"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "管理员 PowerShell 未完成端口清理;端口 ${ports_label} 可能仍无法绑定"
|
||||
else
|
||||
log_warn "管理员 PowerShell 未完成端口清理;端口 ${ports_label} 可能仍无法绑定"
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
}
|
||||
@@ -1655,13 +1664,21 @@ retry_wait_for_port_release() {
|
||||
pids="$(collect_port_pids "$port" || true)"
|
||||
elapsed_seconds="$(format_wait_elapsed_seconds "$((attempt - 1))" "$PORT_PRESTART_RETRY_INTERVAL")"
|
||||
if [ -n "$pids" ]; then
|
||||
log_warn "${service_name}端口 ${port} 仍有监听进程,已等待 ${elapsed_seconds} 秒,继续清理"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "${service_name}端口 ${port} 仍有监听进程,已等待 ${elapsed_seconds} 秒,继续清理"
|
||||
else
|
||||
log_warn "${service_name}端口 ${port} 仍有监听进程,已等待 ${elapsed_seconds} 秒,继续清理"
|
||||
fi
|
||||
for pid in $pids; do
|
||||
terminate_process_tree KILL "$pid"
|
||||
done
|
||||
else
|
||||
log_warn "${service_name}端口 ${port} 暂未发现监听进程但仍不可绑定,已等待 ${elapsed_seconds} 秒,继续等待释放"
|
||||
print_port_listener_details "$port"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "${service_name}端口 ${port} 暂未发现监听进程但仍不可绑定,已等待 ${elapsed_seconds} 秒,继续等待释放"
|
||||
else
|
||||
log_warn "${service_name}端口 ${port} 暂未发现监听进程但仍不可绑定,已等待 ${elapsed_seconds} 秒,继续等待释放"
|
||||
print_port_listener_details "$port"
|
||||
fi
|
||||
fi
|
||||
|
||||
sleep "$PORT_PRESTART_RETRY_INTERVAL"
|
||||
@@ -1721,20 +1738,36 @@ force_cleanup_external_port_listener() {
|
||||
is_wsl_environment || return 1
|
||||
command -v powershell.exe >/dev/null 2>&1 || return 1
|
||||
|
||||
log_warn "检查 Windows 侧端口占用: ${port}"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "检查 Windows 侧端口 ${port}"
|
||||
else
|
||||
log_warn "检查 Windows 侧端口占用: ${port}"
|
||||
fi
|
||||
if ! print_windows_port_listener_details "$port"; then
|
||||
log_note "Windows 侧未发现端口 ${port} 监听,继续启动"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "Windows 侧未发现端口 ${port} 监听,继续检查"
|
||||
else
|
||||
log_note "Windows 侧未发现端口 ${port} 监听,继续启动"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_warn "Windows 侧端口 ${port} 存在监听者,准备请求管理员权限清理"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "Windows 侧端口 ${port} 存在监听者,准备请求管理员权限清理"
|
||||
else
|
||||
log_warn "Windows 侧端口 ${port} 存在监听者,准备请求管理员权限清理"
|
||||
fi
|
||||
request_windows_port_cleanup "$port" || return 1
|
||||
|
||||
if wait_for_port_release "$port" 10 0.3; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_warn "Windows 侧端口 ${port} 清理后仍不可绑定"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "Windows 侧端口 ${port} 清理后仍不可绑定"
|
||||
else
|
||||
log_warn "Windows 侧端口 ${port} 清理后仍不可绑定"
|
||||
fi
|
||||
print_windows_cleanup_recovery_steps "$port" "$service_name"
|
||||
return 1
|
||||
}
|
||||
@@ -2134,61 +2167,92 @@ wait_for_port_release() {
|
||||
return 1
|
||||
}
|
||||
|
||||
format_port_check_detail() {
|
||||
local service_name="$1"
|
||||
local port="$2"
|
||||
|
||||
printf "检查 %s 端口 %s" "$service_name" "$port" | sed -E 's/检查 (前端|后端) /检查\1/'
|
||||
}
|
||||
|
||||
kill_port_if_requested() {
|
||||
local port="$1"
|
||||
local service_name="$2"
|
||||
local pids=""
|
||||
local pid=""
|
||||
|
||||
log_warn "检测 ${service_name} 端口 ${port} 占用"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "$(format_port_check_detail "$service_name" "$port")"
|
||||
else
|
||||
log_warn "检测 ${service_name} 端口 ${port} 占用"
|
||||
fi
|
||||
|
||||
pids="$(collect_port_pids "$port" || true)"
|
||||
|
||||
if [ -z "$pids" ] && can_bind_port "$port"; then
|
||||
log_success "端口 ${port} 未被占用"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 0 ]; then
|
||||
log_success "端口 ${port} 未被占用"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -z "$pids" ]; then
|
||||
if force_cleanup_external_port_listener "$port" "$service_name"; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 0 ]; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
fail_unreleased_port "$port"
|
||||
fi
|
||||
|
||||
log_step "发现端口 ${port} 占用,正在终止"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "${service_name}端口 ${port} 被占用,正在释放"
|
||||
else
|
||||
log_step "发现端口 ${port} 占用,正在终止"
|
||||
fi
|
||||
for pid in $pids; do
|
||||
terminate_process_tree TERM "$pid"
|
||||
done
|
||||
|
||||
if retry_wait_for_port_release "$port" "$service_name"; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 0 ]; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -z "$(collect_port_pids "$port" || true)" ]; then
|
||||
if force_cleanup_external_port_listener "$port" "$service_name"; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 0 ]; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
fail_unreleased_port "$port"
|
||||
fi
|
||||
|
||||
log_warn "端口 ${port} 仍被占用,正在强制终止"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "端口 ${port} 仍被占用,正在强制释放"
|
||||
else
|
||||
log_warn "端口 ${port} 仍被占用,正在强制终止"
|
||||
fi
|
||||
pids="$(collect_port_pids "$port" || true)"
|
||||
for pid in $pids; do
|
||||
terminate_process_tree KILL "$pid"
|
||||
done
|
||||
|
||||
if retry_wait_for_port_release "$port" "$service_name"; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 0 ]; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -z "$(collect_port_pids "$port" || true)" ]; then
|
||||
if force_cleanup_external_port_listener "$port" "$service_name"; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 0 ]; then
|
||||
log_success "端口 ${port} 已释放"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
fail_unreleased_port "$port"
|
||||
@@ -2197,6 +2261,27 @@ kill_port_if_requested() {
|
||||
fail_unreleased_port "$port"
|
||||
}
|
||||
|
||||
release_requested_ports() {
|
||||
local service_name=""
|
||||
local port=""
|
||||
|
||||
[ "$#" -gt 0 ] || return 0
|
||||
|
||||
start_wait_session "检测端口占用情况"
|
||||
PORT_CHECK_STATUS_ACTIVE=1
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
service_name="$1"
|
||||
port="$2"
|
||||
kill_port_if_requested "$port" "$service_name"
|
||||
shift 2
|
||||
done
|
||||
|
||||
PORT_CHECK_STATUS_ACTIVE=0
|
||||
stop_wait_session
|
||||
log_success "端口已全部释放"
|
||||
}
|
||||
|
||||
frontend_log_indicates_port_conflict() {
|
||||
local log_file="$1"
|
||||
|
||||
@@ -2232,6 +2317,10 @@ foreach (\$connection in \$connections) {
|
||||
)"
|
||||
|
||||
[ -n "$output" ] || return 1
|
||||
if [ "$PORT_CHECK_STATUS_ACTIVE" -eq 1 ]; then
|
||||
set_wait_detail "$(printf "%s\n" "$output" | head -n 1)"
|
||||
return 0
|
||||
fi
|
||||
while IFS= read -r line; do
|
||||
[ -n "$line" ] || continue
|
||||
printf "${DIM} %s${NC}\n" "$line"
|
||||
@@ -2860,10 +2949,10 @@ PY
|
||||
prepare_allow_lan_public_ports() {
|
||||
[ "$FRONTEND_LAN_ENABLED" -eq 1 ] || return 0
|
||||
|
||||
log_step "检查局域网端口可绑定"
|
||||
kill_port_if_requested "$FRONTEND_PORT" "前端"
|
||||
kill_port_if_requested "$BACKEND_PORT" "后端"
|
||||
kill_port_if_requested "$AI_PROVIDER_PORT" "AI Provider"
|
||||
release_requested_ports \
|
||||
"后端" "$BACKEND_PORT" \
|
||||
"前端" "$FRONTEND_PORT" \
|
||||
"AI Provider" "$AI_PROVIDER_PORT"
|
||||
request_windows_portproxy_cleanup_if_needed "$FRONTEND_PORT" "$BACKEND_PORT" "$AI_PROVIDER_PORT" || true
|
||||
request_windows_firewall_rules_if_needed "$FRONTEND_PORT" "$BACKEND_PORT" "$AI_PROVIDER_PORT" || true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user