release: bump version to 0.59.0

This commit is contained in:
rayd1o
2026-05-16 05:02:05 +08:00
parent 93eb41a9f7
commit 9b913a3b83
86 changed files with 3645 additions and 1198 deletions

133
planet.sh
View File

@@ -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
}