修正接口参数

This commit is contained in:
dark 2026-05-19 17:11:10 +08:00
parent 30a901b13d
commit baa5613e83
4 changed files with 143 additions and 48 deletions

View File

@ -47,6 +47,7 @@ description: 基于 PAM HOME/NODE 流程执行软件发布、下载、升级、
7. 用户要求“只生成脚本”“先给我文件”“不要执行”时,不要触发真实部署。 7. 用户要求“只生成脚本”“先给我文件”“不要执行”时,不要触发真实部署。
8. Windows 脚本模式默认优先 `deploy.ps1`,不要默认使用 `deploy.bat` 8. Windows 脚本模式默认优先 `deploy.ps1`,不要默认使用 `deploy.bat`
9. 当前目录如果只有文档而没有真实脚本文件,先根据参考实现落地脚本,再决定是否执行。 9. 当前目录如果只有文档而没有真实脚本文件,先根据参考实现落地脚本,再决定是否执行。
10. `download-cloud` 只负责触发云下载任务;后续必须异步调用进度接口并持续展示状态/进度,直到成功、失败或超时。
## 统一部署流程 ## 统一部署流程
@ -59,14 +60,14 @@ description: 基于 PAM HOME/NODE 流程执行软件发布、下载、升级、
| 2.2 | 上传软件包 | `POST {HOME_BASE_URL}/api/version/upgrade/upload` | | 2.2 | 上传软件包 | `POST {HOME_BASE_URL}/api/version/upgrade/upload` |
| 2.3 | 发布版本 | `PUT {HOME_BASE_URL}/api/version/upgrade/profile?...` | | 2.3 | 发布版本 | `PUT {HOME_BASE_URL}/api/version/upgrade/profile?...` |
| 3.1 | 获取 Node 地址 | `GET {HOME_BASE_URL}/api/mcp/airport/target-node?airportCode={airportCode}` | | 3.1 | 获取 Node 地址 | `GET {HOME_BASE_URL}/api/mcp/airport/target-node?airportCode={airportCode}` |
| 3.2 | 获取在线工作站 IP | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/ips?...` | | 3.2 | 获取在线工作站 IP | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/ips?...` |
| 3.3 | 下载软件包到 Node | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/download-cloud?...` | | 3.3 | 下载软件包到 Node | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/download-cloud?...` |
| 3.3b | 轮询下载进度 | `GET .../download-cloud/progress?...` | | 3.3b | 异步轮询并展示下载进度 | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/download-cloud/progress?...&versionNumer={versionNumber}` |
| 4.1 | 对每个 IP 执行升级 | `POST {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade` | | 4.1 | 对每个 IP 执行升级 | `POST {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade` |
| 4.2 | 启动应用 | `POST {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/start-stop` | | 4.2 | 启动应用 | `POST {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/start-stop` |
| 4.3 | 健康检测 | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/verify?...` | | 4.3 | 健康检测 | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/verify?...` |
| 4.4 | 下载日志 | `GET {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/log-download?...` | | 4.4 | 下载日志 | `GET {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/log-download?...` |
| 4.x | 失败回滚 | `POST {HOME_BASE_URL}/node_proxy/{airportCode}/api/mcp/version/upgrade/rollback` | | 4.x | 失败回滚 | `POST {HOME_BASE_URL}/node-proxy/{airportCode}/api/mcp/version/upgrade/rollback` |
调用 NODE 侧接口时,始终携带: 调用 NODE 侧接口时,始终携带:
@ -74,6 +75,14 @@ description: 基于 PAM HOME/NODE 流程执行软件发布、下载、升级、
- `Target-Node: {NODE_URL}` - `Target-Node: {NODE_URL}`
- `airport-code: {airportCode}`,仅在下载到 NODE 等需要时携带 - `airport-code: {airportCode}`,仅在下载到 NODE 等需要时携带
`download-cloud/progress` 响应优先读取以下字段:
- `msg`
- `step`
- `rateOfProgress`
`msg=success``step=DONE``rateOfProgress=100` 时,判定云下载完成;其中 `rateOfProgress` 就是下载进度值,应持续展示。
## MCP 模式 ## MCP 模式
1. 直接调用 PAM MCP 提供的能力完成上述流程,不生成本地脚本文件。 1. 直接调用 PAM MCP 提供的能力完成上述流程,不生成本地脚本文件。

View File

@ -28,6 +28,8 @@
- `config.txt` - `config.txt`
- `deploy.sh``deploy.ps1` - `deploy.sh``deploy.ps1`
- 仅在用户明确要求时再提供 `deploy.bat` - 仅在用户明确要求时再提供 `deploy.bat`
7. NODE 侧接口路径统一使用 `node-proxy``download-cloud/progress` 需额外携带 `versionNumer`,并以异步轮询方式持续展示下载进度。
8. `download-cloud/progress` 的完成判定优先读取 `msg``step``rateOfProgress`;当 `msg=success``step=DONE``rateOfProgress=100` 时代表下载完成,其中 `rateOfProgress` 即下载进度值。
## 0.1 当前实现边界 ## 0.1 当前实现边界
@ -213,23 +215,34 @@ poll_progress() {
local interval=${3:-2} local interval=${3:-2}
local retry=0 local retry=0
log_info "开始轮询进度..." log_info "开始异步轮询下载进度..."
while [ $retry -lt $max_retries ]; do while [ $retry -lt $max_retries ]; do
local response local response
response=$(http_request "GET" "$url") response=$(http_request "GET" "$url")
local step
local msg
local progress
local status local status
# 尝试解析 JSON如果失败则可能是网络错误 local success_flag
status=$(echo $response | jq -r '.status // .success // ""' 2>/dev/null) step=$(echo $response | jq -r '.step // ""' 2>/dev/null)
msg=$(echo $response | jq -r '.msg // .message // ""' 2>/dev/null)
if [ "$status" == "completed" ] || [ "$status" == "true" ]; then progress=$(echo $response | jq -r '.rateOfProgress // .progress // .percent // ""' 2>/dev/null)
status=$(echo $response | jq -r '.status // ""' 2>/dev/null)
success_flag=$(echo $response | jq -r '.success // ""' 2>/dev/null)
if [ -n "$msg" ] || [ -n "$step" ] || [ -n "$progress" ] || [ -n "$status" ] || [ -n "$success_flag" ]; then
log_info "异步下载进度: msg=${msg} step=${step} rateOfProgress=${progress} status=${status} success=${success_flag}"
fi
if [ "$step" == "DONE" ] || [ "$status" == "completed" ] || [ "$success_flag" == "true" ] || { [ "$msg" == "success" ] && [ "$progress" == "100" ]; }; then
log_info "操作完成" log_info "操作完成"
return 0 return 0
fi fi
local error_msg local error_msg
error_msg=$(echo $response | jq -r '.message // ""' 2>/dev/null) error_msg="$msg"
# 如果 jq 解析失败,说明返回的可能不是 JSON而是 HTTP 错误页或 curl 错误 # 如果 jq 解析失败,说明返回的可能不是 JSON而是 HTTP 错误页或 curl 错误
if [ -z "$error_msg" ] && ! echo "$response" | grep -q "success"; then if [ -z "$error_msg" ] && ! echo "$response" | grep -q "success"; then
@ -263,7 +276,7 @@ download_log() {
log_info "正在下载 ${ip} 的日志: ${log_name}..." log_info "正在下载 ${ip} 的日志: ${log_name}..."
# 使用 -o 保存文件,同时保留 stderr 信息以便调试 # 使用 -o 保存文件,同时保留 stderr 信息以便调试
http_request "GET" "${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${log_name}" \ http_request "GET" "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${log_name}" \
"" \ "" \
"Target-Node:${NODE_URL}" > "$log_file" 2>>"${log_dir}/error_${ip}.log" "Target-Node:${NODE_URL}" > "$log_file" 2>>"${log_dir}/error_${ip}.log"
@ -347,7 +360,7 @@ main() {
# Step 3.2: 获取在线工作站 IP (动态获取) # Step 3.2: 获取在线工作站 IP (动态获取)
log_info "Step 3.2: 获取在线工作站列表..." log_info "Step 3.2: 获取在线工作站列表..."
local ips_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" local ips_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}"
local ips_response local ips_response
ips_response=$(http_request "GET" "$ips_url" "" "Target-Node:${NODE_URL}") ips_response=$(http_request "GET" "$ips_url" "" "Target-Node:${NODE_URL}")
@ -368,7 +381,7 @@ main() {
# Step 3.3: 下载软件包到 Node # Step 3.3: 下载软件包到 Node
log_info "Step 3.3: 下载软件包到 Node..." log_info "Step 3.3: 下载软件包到 Node..."
local download_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud" local download_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud"
local download_params="?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" local download_params="?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}"
http_request "GET" "${download_url}${download_params}" \ http_request "GET" "${download_url}${download_params}" \
@ -376,7 +389,7 @@ main() {
"airport-code:${AIRPORT_CODE},Target-Node:${NODE_URL}" > /dev/null "airport-code:${AIRPORT_CODE},Target-Node:${NODE_URL}" > /dev/null
# 轮询下载进度 # 轮询下载进度
local progress_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" local progress_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&versionNumer=${VERSION_NUMBER}"
poll_progress "$progress_url" 60 2 poll_progress "$progress_url" 60 2
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
log_error "软件包下载失败" log_error "软件包下载失败"
@ -394,7 +407,7 @@ main() {
# 4.1: 执行升级 # 4.1: 执行升级
log_info "Step 4.1: 执行升级..." log_info "Step 4.1: 执行升级..."
local upgrade_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" local upgrade_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade"
local upgrade_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&versionNumber=${VERSION_NUMBER}&action=${ACTION_TYPE}&autoStart=false&timeOut=${TIMEOUT}" local upgrade_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&versionNumber=${VERSION_NUMBER}&action=${ACTION_TYPE}&autoStart=false&timeOut=${TIMEOUT}"
local upgrade_response local upgrade_response
@ -410,20 +423,20 @@ main() {
log_warn "尝试回滚..." log_warn "尝试回滚..."
# 回滚逻辑 # 回滚逻辑
local rollback_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" local rollback_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback"
local rollback_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" local rollback_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}"
http_request "POST" "$rollback_url" "$rollback_data" "Target-Node:${NODE_URL}" > /dev/null http_request "POST" "$rollback_url" "$rollback_data" "Target-Node:${NODE_URL}" > /dev/null
log_warn "已触发回滚" log_warn "已触发回滚"
else else
# 4.2: 启动应用 # 4.2: 启动应用
log_info "Step 4.2: 启动应用..." log_info "Step 4.2: 启动应用..."
local start_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" local start_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop"
local start_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=true" local start_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=true"
http_request "POST" "$start_url" "$start_data" "Target-Node:${NODE_URL}" > /dev/null http_request "POST" "$start_url" "$start_data" "Target-Node:${NODE_URL}" > /dev/null
# 4.3: 健康检测 # 4.3: 健康检测
log_info "Step 4.3: 健康检测..." log_info "Step 4.3: 健康检测..."
local verify_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" local verify_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}"
local verify_response local verify_response
verify_response=$(http_request "GET" "$verify_url" "" "Target-Node:${NODE_URL}") verify_response=$(http_request "GET" "$verify_url" "" "Target-Node:${NODE_URL}")
@ -437,7 +450,7 @@ main() {
# 健康检测失败也可触发回滚(可选) # 健康检测失败也可触发回滚(可选)
log_warn "尝试回滚..." log_warn "尝试回滚..."
local rollback_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" local rollback_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback"
local rollback_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" local rollback_data="airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}"
http_request "POST" "$rollback_url" "$rollback_data" "Target-Node:${NODE_URL}" > /dev/null http_request "POST" "$rollback_url" "$rollback_data" "Target-Node:${NODE_URL}" > /dev/null
else else

View File

@ -386,7 +386,7 @@ function Get-OnlineIps {
airportCode = $Config.AIRPORT_CODE airportCode = $Config.AIRPORT_CODE
}) })
$response = Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/ips?$query" -Token $Token -Headers @{ $response = Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/ips?$query" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} }
@ -411,8 +411,9 @@ function Wait-DownloadProgress {
applicationName = $Config.APP_NAME applicationName = $Config.APP_NAME
moduleName = $Config.MODULE_NAME moduleName = $Config.MODULE_NAME
airportCode = $Config.AIRPORT_CODE airportCode = $Config.AIRPORT_CODE
versionNumer = $Config.VERSION_NUMBER
}) })
$progressUrl = "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud/progress?$query" $progressUrl = "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud/progress?$query"
for ($attempt = 0; $attempt -lt 60; $attempt++) { for ($attempt = 0; $attempt -lt 60; $attempt++) {
$response = Invoke-PamWebRequest -Method GET -Url $progressUrl -Token $Token -Headers @{ $response = Invoke-PamWebRequest -Method GET -Url $progressUrl -Token $Token -Headers @{
@ -421,12 +422,33 @@ function Wait-DownloadProgress {
$status = Get-ResponseValue -Response $response -Candidates @('status') $status = Get-ResponseValue -Response $response -Candidates @('status')
$successFlag = Get-ResponseValue -Response $response -Candidates @('success') $successFlag = Get-ResponseValue -Response $response -Candidates @('success')
if ($status -eq 'completed' -or $successFlag -eq 'true') { $step = Get-ResponseValue -Response $response -Candidates @('step')
$msg = Get-ResponseValue -Response $response -Candidates @('msg')
$progressValue = Get-ResponseValue -Response $response -Candidates @('rateOfProgress', 'progress', 'percent', 'data.rateOfProgress', 'data.progress', 'data.percent')
$message = Get-ResponseValue -Response $response -Candidates @('message')
if (-not $message) { $message = $msg }
$progressParts = [System.Collections.Generic.List[string]]::new()
if ($msg) { $progressParts.Add("msg=$msg") }
if ($step) { $progressParts.Add("step=$step") }
if ($progressValue) { $progressParts.Add("rateOfProgress=$progressValue") }
if ($status) { $progressParts.Add("status=$status") }
if ($successFlag) { $progressParts.Add("success=$successFlag") }
if ($message -and $message -ne $msg) { $progressParts.Add("message=$message") }
if ($progressParts.Count -gt 0) {
Write-Info ("Step 3.3b: async download progress -> {0}" -f ($progressParts -join ', '))
} else {
Write-Info ("Step 3.3b: async download progress polling... ({0}/60)" -f ($attempt + 1))
}
if ($step -eq 'DONE' -or $status -eq 'completed' -or $successFlag -eq 'true' -or (($msg -eq 'success') -and ($progressValue -eq '100'))) {
return return
} }
$message = Get-ResponseValue -Response $response -Candidates @('message') if ((@($step, $message, $msg) -join ' ') -match '(?i)fail|error') {
if ($message -and $message -match '(?i)fail|error') { if (-not $message) { $message = $step }
if (-not $message) { $message = $msg }
throw "Node download failed: $message" throw "Node download failed: $message"
} }
@ -447,7 +469,7 @@ function Download-CloudToNode {
timeOut = $Config.TIMEOUT timeOut = $Config.TIMEOUT
}) })
[void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud?$query" -Token $Token -Headers @{ [void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/download-cloud?$query" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
'airport-code' = $Config.AIRPORT_CODE 'airport-code' = $Config.AIRPORT_CODE
}) })
@ -469,7 +491,7 @@ function Invoke-UpgradeRequest {
timeOut = $Config.TIMEOUT timeOut = $Config.TIMEOUT
}) })
Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade" -Token $Token -Headers @{ Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} -Body $body -ContentType 'application/x-www-form-urlencoded' } -Body $body -ContentType 'application/x-www-form-urlencoded'
} }
@ -485,7 +507,7 @@ function Start-Application {
runstart = 'true' runstart = 'true'
}) })
[void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{ [void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} -Body $body -ContentType 'application/x-www-form-urlencoded') } -Body $body -ContentType 'application/x-www-form-urlencoded')
} }
@ -501,7 +523,7 @@ function Stop-Application {
runstart = 'false' runstart = 'false'
}) })
[void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{ [void](Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/start-stop" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} -Body $body -ContentType 'application/x-www-form-urlencoded') } -Body $body -ContentType 'application/x-www-form-urlencoded')
} }
@ -516,7 +538,7 @@ function Verify-Ip {
targetIp = $Ip targetIp = $Ip
}) })
Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/verify?$query" -Token $Token -Headers @{ Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/verify?$query" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} }
} }
@ -540,7 +562,7 @@ function Download-DeployLog {
}) })
try { try {
[void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/log-download?$query" -Token $Token -Headers @{ [void](Invoke-PamWebRequest -Method GET -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/log-download?$query" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} -OutFile $logFile) } -OutFile $logFile)
@ -576,7 +598,7 @@ function Invoke-Rollback {
moduleName = $Config.MODULE_NAME moduleName = $Config.MODULE_NAME
timeOut = $Config.TIMEOUT timeOut = $Config.TIMEOUT
}) })
$response = Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node_proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/rollback" -Token $Token -Headers @{ $response = Invoke-PamWebRequest -Method POST -Url "$($Config.HOME_BASE_URL)/node-proxy/$($Config.AIRPORT_CODE)/api/mcp/version/upgrade/rollback" -Token $Token -Headers @{
'Target-Node' = $NodeUrl 'Target-Node' = $NodeUrl
} -Body $body -ContentType 'application/x-www-form-urlencoded' } -Body $body -ContentType 'application/x-www-form-urlencoded'

View File

@ -305,6 +305,27 @@ json_value() {
'.message') '.message')
json_get_string_by_key "$input" "message" json_get_string_by_key "$input" "message"
;; ;;
'.msg')
json_get_string_by_key "$input" "msg"
;;
'.step')
json_get_string_by_key "$input" "step"
;;
'.rateOfProgress')
json_get_scalar_by_key "$input" "rateOfProgress"
;;
'.progress')
json_get_scalar_by_key "$input" "progress"
;;
'.percent')
json_get_scalar_by_key "$input" "percent"
;;
'.data.progress')
json_get_nested_string_by_key "$input" "data" "progress"
;;
'.data.percent')
json_get_nested_string_by_key "$input" "data" "percent"
;;
'.hashCode // .data.hashCode') '.hashCode // .data.hashCode')
local value local value
value="$(json_get_string_by_key "$input" "hashCode")" value="$(json_get_string_by_key "$input" "hashCode")"
@ -624,7 +645,7 @@ get_online_ips() {
local response local response
local ip_lines local ip_lines
response=$(http_request "GET" \ response=$(http_request "GET" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/ips?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" \
"" \ "" \
"" \ "" \
"Target-Node: ${NODE_URL}") || return 1 "Target-Node: ${NODE_URL}") || return 1
@ -643,7 +664,7 @@ get_online_ips() {
} }
poll_download_progress() { poll_download_progress() {
local progress_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}" local progress_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud/progress?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&versionNumer=${VERSION_NUMBER}"
local attempt=0 local attempt=0
local max_attempts=60 local max_attempts=60
local error_regex='[Ff]ail|[Ee]rror' local error_regex='[Ff]ail|[Ee]rror'
@ -656,14 +677,44 @@ poll_download_progress() {
status="$(json_value "$response" '.status')" status="$(json_value "$response" '.status')"
local success_flag local success_flag
success_flag="$(json_value "$response" '.success')" success_flag="$(json_value "$response" '.success')"
local step_value
step_value="$(json_value "$response" '.step')"
local msg_value
msg_value="$(json_value "$response" '.msg')"
local message
message="$(json_value "$response" '.message')"
local progress_value
progress_value="$(json_value "$response" '.rateOfProgress')"
[[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.progress')"
[[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.percent')"
[[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.data.progress')"
[[ -z "$progress_value" ]] && progress_value="$(json_value "$response" '.data.percent')"
[[ -z "$message" ]] && message="$msg_value"
if [[ "$status" == "completed" || "$success_flag" == "true" ]]; then if [[ -n "$msg_value" || -n "$step_value" || -n "$progress_value" || -n "$status" || -n "$success_flag" || -n "$message" ]]; then
local -a progress_parts=()
[[ -n "$msg_value" ]] && progress_parts+=("msg=${msg_value}")
[[ -n "$step_value" ]] && progress_parts+=("step=${step_value}")
[[ -n "$progress_value" ]] && progress_parts+=("rateOfProgress=${progress_value}")
[[ -n "$status" ]] && progress_parts+=("status=${status}")
[[ -n "$success_flag" ]] && progress_parts+=("success=${success_flag}")
[[ -n "$message" && "$message" != "$msg_value" ]] && progress_parts+=("message=${message}")
log_info "Step 3.3b: 异步下载进度 -> ${progress_parts[*]}"
else
log_info "Step 3.3b: 异步下载进度轮询中... ($((attempt + 1))/${max_attempts})"
fi
if [[ "$step_value" == "DONE" || "$status" == "completed" || "$success_flag" == "true" ]]; then
return 0 return 0
fi fi
local message if [[ "$msg_value" == "success" && "$progress_value" == "100" ]]; then
message="$(json_value "$response" '.message')" return 0
if [[ "$message" =~ $error_regex ]]; then fi
if [[ "${step_value} ${message} ${msg_value}" =~ $error_regex ]]; then
[[ -z "$message" ]] && message="$step_value"
[[ -z "$message" ]] && message="$msg_value"
log_error "Node 下载失败: $message" log_error "Node 下载失败: $message"
return 1 return 1
fi fi
@ -679,7 +730,7 @@ poll_download_progress() {
download_cloud_to_node() { download_cloud_to_node() {
log_info "Step 3.3: 下载软件包到 Node..." log_info "Step 3.3: 下载软件包到 Node..."
http_request "GET" \ http_request "GET" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/download-cloud?versionNumber=${VERSION_NUMBER}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \
"" \ "" \
"" \ "" \
"Target-Node: ${NODE_URL}" \ "Target-Node: ${NODE_URL}" \
@ -691,7 +742,7 @@ download_cloud_to_node() {
upgrade_ip() { upgrade_ip() {
local ip="$1" local ip="$1"
http_request "POST" \ http_request "POST" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade" \
"airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&versionNumber=${VERSION_NUMBER}&action=${ACTION_TYPE}&autoStart=false&timeOut=${TIMEOUT}" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&versionNumber=${VERSION_NUMBER}&action=${ACTION_TYPE}&autoStart=false&timeOut=${TIMEOUT}" \
"application/x-www-form-urlencoded" \ "application/x-www-form-urlencoded" \
"Target-Node: ${NODE_URL}" "Target-Node: ${NODE_URL}"
@ -700,7 +751,7 @@ upgrade_ip() {
start_application() { start_application() {
local ip="$1" local ip="$1"
http_request "POST" \ http_request "POST" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \
"airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=true" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=true" \
"application/x-www-form-urlencoded" \ "application/x-www-form-urlencoded" \
"Target-Node: ${NODE_URL}" >/dev/null "Target-Node: ${NODE_URL}" >/dev/null
@ -709,7 +760,7 @@ start_application() {
stop_application() { stop_application() {
local ip="$1" local ip="$1"
http_request "POST" \ http_request "POST" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/start-stop" \
"airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=false" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&runstart=false" \
"application/x-www-form-urlencoded" \ "application/x-www-form-urlencoded" \
"Target-Node: ${NODE_URL}" >/dev/null "Target-Node: ${NODE_URL}" >/dev/null
@ -718,7 +769,7 @@ stop_application() {
verify_ip() { verify_ip() {
local ip="$1" local ip="$1"
http_request "GET" \ http_request "GET" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/verify?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}" \
"" \ "" \
"" \ "" \
"Target-Node: ${NODE_URL}" "Target-Node: ${NODE_URL}"
@ -730,7 +781,7 @@ download_log() {
local log_file="${logs_dir}/deploy_${ip}.log" local log_file="${logs_dir}/deploy_${ip}.log"
local err_file="${logs_dir}/error_${ip}.log" local err_file="${logs_dir}/error_${ip}.log"
local request_id local request_id
local trace_url="${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${LOG_NAME}" local trace_url="${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/log-download?applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&airportCode=${AIRPORT_CODE}&targetIp=${ip}&logName=${LOG_NAME}"
local curl_exit=0 local curl_exit=0
local http_code="" local http_code=""
local trace_error="" local trace_error=""
@ -786,7 +837,7 @@ rollback_ip() {
local response local response
if ! response=$(http_request "POST" \ if ! response=$(http_request "POST" \
"${HOME_BASE_URL}/node_proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" \ "${HOME_BASE_URL}/node-proxy/${AIRPORT_CODE}/api/mcp/version/upgrade/rollback" \
"airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \ "airportCode=${AIRPORT_CODE}&targetIp=${ip}&applicationName=${APP_NAME}&moduleName=${MODULE_NAME}&timeOut=${TIMEOUT}" \
"application/x-www-form-urlencoded" \ "application/x-www-form-urlencoded" \
"Target-Node: ${NODE_URL}"); then "Target-Node: ${NODE_URL}"); then