提交 b336b2a0 authored 作者: 陈泽健's avatar 陈泽健

docs(prd): 更新远程程序更新脚本需求文档中广核项目特殊路径包代码

- 重构文档结构,增加版本信息和适用范围说明
- 补充双脚本详细功能说明和参数配置
- 完善平台类型、系统类型、更新类型的详细映射关系
- 增加术语说明和功能需求详细描述
- 扩展主流程图解和异常处理机制
- 添加配置与可变项、验收标准等章节
- 补充PowerShell和Shell脚本执行常见问题解决方案
- 优化文档格式和表格展示效果
上级 9d497793
...@@ -13,7 +13,7 @@ usage() { ...@@ -13,7 +13,7 @@ usage() {
program_update.sh (PRD 3.3 Backup) program_update.sh (PRD 3.3 Backup)
Usage: Usage:
./program_update.sh --platform "新统一平台|传统平台" \ ./program_update.sh --platform "新统一平台|传统平台|中广核项目" \
--system "会议预定系统|运维集控系统|讯飞转录系统" \ --system "会议预定系统|运维集控系统|讯飞转录系统" \
--update "前端更新|后端更新|全量更新" \ --update "前端更新|后端更新|全量更新" \
[--workdir /home/Update/] [--workdir /home/Update/]
...@@ -24,6 +24,8 @@ Behavior (3.3): ...@@ -24,6 +24,8 @@ Behavior (3.3):
- backup database by finding mysql container and running mysqldump - backup database by finding mysql container and running mysqldump
- tar backup folder to /home/Backup/Bak<timestamp>.tar.gz - tar backup folder to /home/Backup/Bak<timestamp>.tar.gz
- print BACKUP_TAR path for caller to download - print BACKUP_TAR path for caller to download
Note: 中广核项目作为独立平台类型,--system参数可选(默认为中广核项目)
EOF EOF
} }
...@@ -37,6 +39,9 @@ UPDATE_TYPE="" ...@@ -37,6 +39,9 @@ UPDATE_TYPE=""
WORKDIR="/home/Update" WORKDIR="/home/Update"
RESTART_ONLY=0 RESTART_ONLY=0
# 中广核项目标记(用于特殊部署方式)
IS_CGN_PROJECT=0
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case "$1" in case "$1" in
--platform) PLATFORM="${2:-}"; shift 2;; --platform) PLATFORM="${2:-}"; shift 2;;
...@@ -50,11 +55,25 @@ while [[ $# -gt 0 ]]; do ...@@ -50,11 +55,25 @@ while [[ $# -gt 0 ]]; do
esac esac
done done
if [[ -z "$PLATFORM" || -z "$SYSTEM" || -z "$UPDATE_TYPE" ]]; then if [[ -z "$PLATFORM" || -z "$UPDATE_TYPE" ]]; then
usage usage
exit 2 exit 2
fi fi
# 中广核项目作为独立平台类型时,自动设置系统类型
if [[ "$PLATFORM" == "中广核项目" ]]; then
IS_CGN_PROJECT=1
if [[ -z "$SYSTEM" ]]; then
SYSTEM="中广核项目"
fi
else
# 其他平台类型必须指定系统类型
if [[ -z "$SYSTEM" ]]; then
usage
exit 2
fi
fi
# 启动即记录版本与调用参数(方便截图/回溯) # 启动即记录版本与调用参数(方便截图/回溯)
log "program_update.sh version=$SCRIPT_VERSION" log "program_update.sh version=$SCRIPT_VERSION"
log "Args: platform=$PLATFORM system=$SYSTEM update=$UPDATE_TYPE workdir=$WORKDIR restart_only=$RESTART_ONLY" log "Args: platform=$PLATFORM system=$SYSTEM update=$UPDATE_TYPE workdir=$WORKDIR restart_only=$RESTART_ONLY"
...@@ -151,8 +170,8 @@ case "$PLATFORM" in ...@@ -151,8 +170,8 @@ case "$PLATFORM" in
"讯飞转录系统") "讯飞转录系统")
DB_NAME="devops" DB_NAME="devops"
# 前端:/var/www/html/web-vue-voice static/ index.html # 前端:/var/www/html/web-vue-uvoice static/ index.html
FRONT_1_BASE="/var/www/html/web-vue-voice" FRONT_1_BASE="/var/www/html/web-vue-uvoice"
FRONT_1_GLOBS=("index.html" "static") FRONT_1_GLOBS=("index.html" "static")
# 后端:/var/www/html UbainsDevOps/ # 后端:/var/www/html UbainsDevOps/
...@@ -165,6 +184,18 @@ case "$PLATFORM" in ...@@ -165,6 +184,18 @@ case "$PLATFORM" in
;; ;;
esac esac
;; ;;
"中广核项目")
# 中广核项目独立平台类型
DB_NAME="ubains"
# 前台前端:/var/www/java/cims-web
FRONT_1_BASE="/var/www/java/cims-web"
FRONT_1_GLOBS=("index.html" "static")
# 对内后端:/var/www/java/cims-java
BACK_1_BASE="/var/www/java/cims-java"
BACK_1_GLOBS=("cims-java-4.2.2-dm.jar")
;;
"新统一平台") "新统一平台")
log "ERROR: 新统一平台的路径映射未在 PRD 中提供,暂无法执行备份。请补充 4.2 映射后再启用。" log "ERROR: 新统一平台的路径映射未在 PRD 中提供,暂无法执行备份。请补充 4.2 映射后再启用。"
exit 3 exit 3
...@@ -188,22 +219,26 @@ resolve_workdir() { ...@@ -188,22 +219,26 @@ resolve_workdir() {
"$base/dist" "$base/dist"
) )
# 根据系统类型给出“应该存在的源目录名集合”,用于判定候选目录是否正确 # 根据平台/系统类型给出"应该存在的源目录名集合",用于判定候选目录是否正确
local expected=() local expected=()
case "$SYSTEM" in if [[ "$IS_CGN_PROJECT" -eq 1 ]]; then
"会议预定系统") expected=("cims-web" "cims-java")
expected=("ubains-web-2.0" "ubains-web-admin" "api-java-meeting2.0" "external-meeting-api") else
;; case "$SYSTEM" in
"运维集控系统") "会议预定系统")
expected=("web-vue-rms" "cmdb" "UbainsDevOps") expected=("ubains-web-2.0" "ubains-web-admin" "api-java-meeting2.0" "external-meeting-api")
;; ;;
"讯飞转录系统") "运维集控系统")
expected=("web-vue-voice" "UbainsDevOps") expected=("web-vue-rms" "cmdb" "UbainsDevOps")
;; ;;
*) "讯飞转录系统")
expected=() expected=("web-vue-uvoice" "UbainsDevOps")
;; ;;
esac *)
expected=()
;;
esac
fi
local c hit local c hit
for c in "${candidates[@]}"; do for c in "${candidates[@]}"; do
...@@ -612,18 +647,80 @@ restart_services_traditional() { ...@@ -612,18 +647,80 @@ restart_services_traditional() {
log "WARN: log file not found: /var/www/html/log/uinfo.log" log "WARN: log file not found: /var/www/html/log/uinfo.log"
fi fi
;; ;;
*) *)
log "WARN: 未配置 $SYSTEM 的重启逻辑,跳过重启。" log "WARN: 未配置 $SYSTEM 的重启逻辑,跳过重启。"
;; ;;
esac esac
} }
# 中广核项目独立重启逻辑
restart_services_cgn() {
# PRD 3.5:后端更新需要重启服务;前端更新无需重启
if [[ "$UPDATE_TYPE" == "前端更新" ]]; then
log "Skip restart (frontend update only)."
return 0
fi
log "Restart services: 中广核项目"
# 对内后端:优先进入 java 容器内执行 run.sh
log "PRD 3.5 internal (preferred in java container ujava*):"
log " docker exec -it ujavaX bash"
log " cd /var/www/java/cims-java"
log " bash ./run.sh; tail -f log.out"
local java_container=""
if command -v docker >/dev/null 2>&1; then
java_container="$(docker ps --format '{{.Names}}' | grep -E '^ujava[0-9]*$' | head -n 1 || true)"
if [[ -z "$java_container" ]]; then
java_container="$(docker ps -a --format '{{.Names}}' | grep -E '^ujava[0-9]*$' | head -n 1 || true)"
fi
if [[ -n "$java_container" ]]; then
log "Detected java container: $java_container"
log "Restart (in container $java_container): /var/www/java/cims-java/run.sh (force bash)"
docker exec "$java_container" bash -lc "cd /var/www/java/cims-java && bash ./run.sh" || true
log "Verify process (in container $java_container): ps -ef | grep cims-java"
docker exec "$java_container" bash -lc "ps -ef | grep -E 'cims-java' | grep -v grep | head -n 5" || true
else
log "WARN: java container (ujava*) not found, fallback to host restart"
if [[ -d "/var/www/java/cims-java" && -f "/var/www/java/cims-java/run.sh" ]]; then
log "Restart (host fallback): /var/www/java/cims-java/run.sh (force bash)"
( cd /var/www/java/cims-java && bash ./run.sh ) || true
else
log "WARN: cims-java run.sh not found (host fallback)"
fi
fi
else
log "WARN: docker not found, fallback to host restart"
if [[ -d "/var/www/java/cims-java" && -f "/var/www/java/cims-java/run.sh" ]]; then
log "Restart (host fallback): /var/www/java/cims-java/run.sh (force bash)"
( cd /var/www/java/cims-java && bash ./run.sh ) || true
else
log "WARN: cims-java run.sh not found (host fallback)"
fi
fi
# 验证日志
if [[ -f "/var/www/java/cims-java/log.out" ]]; then
log "Verify log: tail -n 50 /var/www/java/cims-java/log.out"
tail -n 50 /var/www/java/cims-java/log.out || true
else
log "WARN: log file not found: /var/www/java/cims-java/log.out"
fi
}
# 在 update 之后调用 3.5 # 在 update 之后调用 3.5
run_post_update_actions() { run_post_update_actions() {
case "$PLATFORM" in case "$PLATFORM" in
"传统平台") "传统平台")
restart_services_traditional restart_services_traditional
;; ;;
"中广核项目")
restart_services_cgn
;;
*) *)
log "WARN: 平台 $PLATFORM 暂未实现 3.5 重启逻辑" log "WARN: 平台 $PLATFORM 暂未实现 3.5 重启逻辑"
;; ;;
...@@ -712,12 +809,37 @@ do_update_traditional() { ...@@ -712,12 +809,37 @@ do_update_traditional() {
esac esac
} }
# 中广核项目独立更新逻辑
do_update_cgn() {
local src_front="${WORKDIR%/}/cims-web"
local src_back="${WORKDIR%/}/cims-java"
local dst_front="/var/www/java/cims-web"
local dst_back="/var/www/java/cims-java"
if [[ "$UPDATE_TYPE" == "前端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_frontend_preserve "$src_front" "$dst_front" "中广核-前台前端"
fi
if [[ "$UPDATE_TYPE" == "后端更新" || "$UPDATE_TYPE" == "全量更新" ]]; then
sync_overwrite_globs "$src_back" "$dst_back" "中广核-对内后端" "cims-java-4.2.2-dm.jar"
fi
}
case "$PLATFORM" in case "$PLATFORM" in
"传统平台") "传统平台")
log "Start update (传统平台): system=$SYSTEM update=$UPDATE_TYPE workdir=$WORKDIR" log "Start update (传统平台): system=$SYSTEM update=$UPDATE_TYPE workdir=$WORKDIR"
do_update_traditional do_update_traditional
log "Update done (传统平台)." log "Update done (传统平台)."
# 3.5 重启并验证
run_post_update_actions
;;
"中广核项目")
log "Start update (中广核项目): update=$UPDATE_TYPE workdir=$WORKDIR"
do_update_cgn
log "Update done (中广核项目)."
# 3.5 重启并验证 # 3.5 重启并验证
run_post_update_actions run_post_update_actions
;; ;;
......
...@@ -76,8 +76,8 @@ function Invoke-PlinkCommand { ...@@ -76,8 +76,8 @@ function Invoke-PlinkCommand {
[Parameter(Mandatory=$true)][string]$Command [Parameter(Mandatory=$true)][string]$Command
) )
# 不使用 -batch 参数,允许交互式确认主机密钥
$args = @( $args = @(
"-batch",
"-ssh", "-ssh",
"-P", "$Port", "-P", "$Port",
"-l", $User, "-l", $User,
...@@ -88,20 +88,26 @@ function Invoke-PlinkCommand { ...@@ -88,20 +88,26 @@ function Invoke-PlinkCommand {
Write-Info "远端执行: $Command" Write-Info "远端执行: $Command"
# 使用临时文件捕获输出
$tmpOut = Join-Path $env:TEMP ("plink_{0}.out.log" -f ([guid]::NewGuid().ToString("N"))) $tmpOut = Join-Path $env:TEMP ("plink_{0}.out.log" -f ([guid]::NewGuid().ToString("N")))
$tmpErr = Join-Path $env:TEMP ("plink_{0}.err.log" -f ([guid]::NewGuid().ToString("N"))) $tmpErr = Join-Path $env:TEMP ("plink_{0}.err.log" -f ([guid]::NewGuid().ToString("N")))
# 使用交互模式,让用户可以确认主机密钥,同时捕获输出
$p = Start-Process -FilePath $PlinkPath -ArgumentList $args -NoNewWindow -Wait -PassThru ` $p = Start-Process -FilePath $PlinkPath -ArgumentList $args -NoNewWindow -Wait -PassThru `
-RedirectStandardOutput $tmpOut -RedirectStandardError $tmpErr -RedirectStandardOutput $tmpOut -RedirectStandardError $tmpErr
# 读取输出内容
$outText = "" $outText = ""
$errText = "" $errText = ""
if (Test-Path $tmpOut) { $outText = (Get-Content $tmpOut -Raw -Encoding utf8) } if (Test-Path $tmpOut) { $outText = (Get-Content $tmpOut -Raw -Encoding utf8) }
if (Test-Path $tmpErr) { $errText = (Get-Content $tmpErr -Raw -Encoding utf8) } if (Test-Path $tmpErr) { $errText = (Get-Content $tmpErr -Raw -Encoding utf8) }
if (-not [string]::IsNullOrWhiteSpace($outText)) { Write-Host $outText } # 输出错误信息(如果有)
if (-not [string]::IsNullOrWhiteSpace($errText)) { Write-Warn $errText } if (-not [string]::IsNullOrWhiteSpace($errText)) {
Write-Host $errText
}
# 清理临时文件
Remove-Item -ErrorAction SilentlyContinue $tmpOut, $tmpErr Remove-Item -ErrorAction SilentlyContinue $tmpOut, $tmpErr
if ($p.ExitCode -ne 0) { if ($p.ExitCode -ne 0) {
...@@ -134,7 +140,6 @@ function Invoke-PscpUpload { ...@@ -134,7 +140,6 @@ function Invoke-PscpUpload {
foreach ($lf in $LocalFiles) { foreach ($lf in $LocalFiles) {
$args = @( $args = @(
"-batch",
"-P", "$Port", "-P", "$Port",
"-pw", $Password, "-pw", $Password,
$lf, $lf,
...@@ -167,7 +172,6 @@ function Invoke-PscpDownload { ...@@ -167,7 +172,6 @@ function Invoke-PscpDownload {
$remoteSpec = ("{0}@{1}:{2}" -f $User, $HostName, $RemoteFile) $remoteSpec = ("{0}@{1}:{2}" -f $User, $HostName, $RemoteFile)
$args = @( $args = @(
"-batch",
"-P", "$Port", "-P", "$Port",
"-pw", $Password, "-pw", $Password,
$remoteSpec, $remoteSpec,
...@@ -189,20 +193,77 @@ Write-Info ("remote_program_update.ps1 version={0}" -f $SCRIPT_VERSION) ...@@ -189,20 +193,77 @@ Write-Info ("remote_program_update.ps1 version={0}" -f $SCRIPT_VERSION)
Write-Info ("PowerShell={0} Host={1}" -f $PSVersionTable.PSVersion, $env:COMPUTERNAME) Write-Info ("PowerShell={0} Host={1}" -f $PSVersionTable.PSVersion, $env:COMPUTERNAME)
Write-Info ("ScriptPath={0}" -f $PSCommandPath) Write-Info ("ScriptPath={0}" -f $PSCommandPath)
$serverIp = Read-NonEmpty "请输入服务器IP" # 服务器预设选择
$sshPortStr = Read-NonEmpty "请输入SSH端口" "22" $usePreset = Read-Choice "是否使用服务器预设?" @("否(手动输入)", "是(使用预设)")
$sshPort = [int]$sshPortStr $serverIp = ""
$username = Read-NonEmpty "请输入用户名" "root" $sshPortStr = ""
$securePwd = Read-Host "请输入密码" -AsSecureString $sshPort = 0
$plainPwd = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePwd)) $username = ""
$plainPwd = ""
$remoteDir = ""
if ($usePreset -eq "是(使用预设)") {
$preset = Read-Choice "请选择服务器预设:" @("测试环境-前端服务器", "测试环境-后端服务器")
if ($preset -eq "测试环境-前端服务器") {
$serverIp = "10.126.4.79"
$sshPortStr = "1122"
$sshPort = 1122
$username = "root"
$plainPwd = "Admin@123Admin@123"
$remoteDir = "/home/appadmin/"
Write-Info "已选择测试环境-前端服务器预设"
} else {
$serverIp = "10.126.4.81"
$sshPortStr = "1122"
$sshPort = 1122
$username = "appadmin"
$plainPwd = "CGNadm!@345CGNadm!@345"
$remoteDir = "/home/appadmin/"
Write-Info "已选择测试环境-后端服务器预设"
}
Write-Info "参数确认:IP=$serverIp Port=$sshPort User=$username RemoteDir=$remoteDir"
} else {
$serverIp = Read-NonEmpty "请输入服务器IP"
$sshPortStr = Read-NonEmpty "请输入SSH端口" "22"
$sshPort = [int]$sshPortStr
$username = Read-NonEmpty "请输入用户名" "root"
$securePwd = Read-Host "请输入密码" -AsSecureString
$plainPwd = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePwd))
$remoteDir = Read-NonEmpty "请输入远端文件存放路径" "/home/Update/"
}
$remoteDir = Read-NonEmpty "请输入远端文件存放路径" "/home/Update/" # 平台类型选择(增加中广核项目选项)
$platformType = Read-Choice "请选择平台类型:" @("新统一平台", "传统平台", "中广核项目")
# 根据平台类型决定是否需要选择系统类型
if ($platformType -eq "中广核项目") {
$systemType = "中广核项目"
Write-Info "已选择中广核项目,系统类型自动设置为:$systemType"
} else {
$systemType = Read-Choice "请选择更新系统类型:" @("会议预定系统", "运维集控系统", "讯飞转录系统")
}
$platformType = Read-Choice "请选择平台类型:" @("新统一平台", "传统平台")
$systemType = Read-Choice "请选择更新系统类型:" @("会议预定系统", "运维集控系统", "讯飞转录系统")
$updateType = Read-Choice "请选择更新类型:" @("前端更新", "后端更新", "全量更新") $updateType = Read-Choice "请选择更新类型:" @("前端更新", "后端更新", "全量更新")
Write-Info "参数确认:IP=$serverIp Port=$sshPort User=$username RemoteDir=$remoteDir 平台=$platformType 系统=$systemType 更新=$updateType" if ($usePreset -eq "否(手动输入)") {
Write-Info "参数确认:IP=$serverIp Port=$sshPort User=$username RemoteDir=$remoteDir 平台=$platformType 系统=$systemType 更新=$updateType"
}
Write-Info "首次连接时会提示确认主机密钥,请选择 'yes' 确认。"
# 判断是否为中广核项目(需要特殊处理)
$isCgnProject = ($platformType -eq "中广核项目")
$sudoPassword = ""
if ($isCgnProject) {
Write-Info "检测到中广核项目,将使用zip压缩包方式部署"
# 如果使用预设且是后端服务器,则已经有密码了,不需要再输入
if ($usePreset -eq "是(使用预设)" -and $preset -eq "测试环境-后端服务器") {
$sudoPassword = $plainPwd
Write-Info "使用预设的sudo密码"
} else {
$sudoPassword = Read-NonEmpty "请输入sudo密码" "CGNadm!@345CGNadm!@345"
}
}
# -------------------- 工具检测 -------------------- # -------------------- 工具检测 --------------------
$tools = Require-PuttyTools $tools = Require-PuttyTools
...@@ -225,8 +286,7 @@ Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $ ...@@ -225,8 +286,7 @@ Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $
Write-Info "SSH 连接测试成功。" Write-Info "SSH 连接测试成功。"
# 1) 远端创建目录 + 检查 unzip # 1) 远端创建目录 + 检查 unzip
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "mkdir -p '$remoteDir'; command -v unzip >/dev/null 2>&1 || (echo '缺少 unzip,请安装:yum install -y unzip 或 apt-get install -y unzip' && exit 2)" Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "mkdir -p '$remoteDir'; command -v unzip >/dev/null 2>&1 || (echo '缺少 unzip,请安装:yum install -y unzip 或 apt-get install -y unzip' && exit 2)"
# ====== 3.2 本地准备:找到 zip 包 + program_update.sh ====== # ====== 3.2 本地准备:找到 zip 包 + program_update.sh ======
# 约定:zip 压缩包与本 remote_program_update.ps1 同级目录 # 约定:zip 压缩包与本 remote_program_update.ps1 同级目录
$zipFiles = @( $zipFiles = @(
...@@ -247,32 +307,49 @@ if (-not (Test-Path $programUpdateSh)) { ...@@ -247,32 +307,49 @@ if (-not (Test-Path $programUpdateSh)) {
throw "未找到 program_update.sh:$programUpdateSh(请放在脚本同级目录)" throw "未找到 program_update.sh:$programUpdateSh(请放在脚本同级目录)"
} }
# ====== 3.2 本地准备结束 ======
# 所有项目统一使用zip压缩包方式
if ($isCgnProject) {
Write-Info "中广核项目部署模式:使用zip压缩包方式"
}
Write-Info "将上传更新包:$zipPath" Write-Info "将上传更新包:$zipPath"
Write-Info "将上传更新脚本:$programUpdateSh" Write-Info "将上传更新脚本:$programUpdateSh"
# ====== 3.2 本地准备结束 ======
# 2) 上传 zip + program_update.sh # 上传 zip + program_update.sh
Invoke-PscpUpload -PscpPath $pscp -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -LocalFiles @($zipPath, $programUpdateSh) -RemoteDir $remoteDir Invoke-PscpUpload -PscpPath $pscp -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -LocalFiles @($zipPath, $programUpdateSh) -RemoteDir $remoteDir
# 3) 远端解压(解压到 remoteDir) # 远端解压(解压到 remoteDir)
$zipName = Split-Path $zipPath -Leaf $zipName = Split-Path $zipPath -Leaf
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && unzip -o '$zipName' -d '$remoteDir'" Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && unzip -o '$zipName' -d '$remoteDir'"
# ====== 默认执行 program_update.sh(实现 3.3 备份)并下载备份包到本机脚本目录 ====== # ====== 执行 program_update.sh 并下载备份包 ======
# 额外打印远端 program_update.sh 版本,便于回溯 # 额外打印远端 program_update.sh 版本,便于回溯
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && ./program_update.sh --version 2>/dev/null || true" Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && ./program_update.sh --version 2>/dev/null || true"
$execCmd = "cd '$remoteDir' && chmod +x ./program_update.sh && ./program_update.sh --platform '$platformType' --system '$systemType' --update '$updateType' --workdir '$remoteDir'" # 中广核项目需要通过 sudo 切换到 root 用户执行
if ($isCgnProject) {
Write-Info "中广核项目:使用 sudo 执行更新脚本"
$execCmd = "cd '$remoteDir' && echo '$sudoPassword' | sudo -S chmod +x ./program_update.sh && echo '$sudoPassword' | sudo -S env LC_CTYPE=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 ./program_update.sh --platform '$platformType' --system '$systemType' --update '$updateType' --workdir '$remoteDir'"
} else {
$execCmd = "cd '$remoteDir' && chmod +x ./program_update.sh && ./program_update.sh --platform '$platformType' --system '$systemType' --update '$updateType' --workdir '$remoteDir'"
}
$out = Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command $execCmd $out = Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command $execCmd
# 从输出解析 BACKUP_TAR # 从输出解析 BACKUP_TAR
# program_update.sh 输出格式:BACKUP_TAR=/home/Backup/BakYYYYmmdd_HHMMSS.tar.gz # program_update.sh 输出格式:BACKUP_TAR=/home/Backup/BakYYYYmmdd_HHMMSS.tar.gz
$backupTar = $null $backupTar = $null
if ($out -match '(?m)^BACKUP_TAR=(.+)\s*$') {
# 尝试多种匹配模式
if ($out -match 'BACKUP_TAR=([^\s\r\n]+)') {
$backupTar = $Matches[1].Trim() $backupTar = $Matches[1].Trim()
} }
if (-not $backupTar) { if (-not $backupTar) {
# 输出调试信息
Write-Warn "未找到 BACKUP_TAR,输出内容:"
Write-Host $out
throw "未从远端输出中解析到 BACKUP_TAR。请确认 program_update.sh 已实现 3.3 且会 echo BACKUP_TAR=..." throw "未从远端输出中解析到 BACKUP_TAR。请确认 program_update.sh 已实现 3.3 且会 echo BACKUP_TAR=..."
} }
......
此差异已折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论