fix: omc ui self-upgrade issue

This commit is contained in:
simon
2025-05-14 18:41:57 +08:00
parent 3a7dd5279c
commit a5e5b3cf6e

View File

@@ -3,6 +3,7 @@ package service
import ( import (
"fmt" "fmt"
"os" "os"
"os/exec"
"path/filepath" "path/filepath"
"strings" "strings"
"time" "time"
@@ -177,6 +178,10 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m
if err != nil { if err != nil {
return "", err return "", err
} }
// commandLine, err = r.operateShellRun(preinput, cmdStrArr, neVersion.NeType, okFlagStr)
// if err != nil {
// return "", err
// }
// ========= 完成阶段 ========= // ========= 完成阶段 =========
if strings.LastIndex(commandLine, okFlagStr) > 5 { if strings.LastIndex(commandLine, okFlagStr) > 5 {
@@ -239,7 +244,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
pkgCmdStr := fmt.Sprintf("sudo dpkg -i %s", strings.Join(neFilePaths, " ")) pkgCmdStr := fmt.Sprintf("sudo dpkg -i %s", strings.Join(neFilePaths, " "))
fileExt := filepath.Ext(strings.ToLower(neFilePaths[0])) fileExt := filepath.Ext(strings.ToLower(neFilePaths[0]))
if strings.HasSuffix(fileExt, "rpm") { if strings.HasSuffix(fileExt, "rpm") {
pkgCmdStr = fmt.Sprintf("sudo rpm -Uvh --reinstall %s", strings.Join(neFilePaths, " ")) pkgCmdStr = fmt.Sprintf("sudo rpm -Uvh --replacepkgs %s", strings.Join(neFilePaths, " "))
} }
// 组合命令输入 // 组合命令输入
@@ -257,7 +262,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
// 升级软件包 // 升级软件包
pkgCmdStr = fmt.Sprintf("sudo M_PARAM=upgrade dpkg -i %s", strings.Join(neFilePaths, " ")) pkgCmdStr = fmt.Sprintf("sudo M_PARAM=upgrade dpkg -i %s", strings.Join(neFilePaths, " "))
if strings.HasSuffix(fileExt, "rpm") { if strings.HasSuffix(fileExt, "rpm") {
pkgCmdStr = fmt.Sprintf("sudo M_PARAM=upgrade rpm -Uvh --reinstall %s", strings.Join(neFilePaths, " ")) pkgCmdStr = fmt.Sprintf("sudo M_PARAM=upgrade rpm -Uvh --replacepkgs %s", strings.Join(neFilePaths, " "))
} }
omcStrArr = append(omcStrArr, pkgCmdStr) omcStrArr = append(omcStrArr, pkgCmdStr)
} }
@@ -266,7 +271,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
// 2s后执行omc相关命令 // 2s后执行omc相关命令
cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm -f /tmp/omc_%s.out \n", action)) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm -f /tmp/omc_%s.out \n", action))
cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 2s && %s\" > /tmp/omc_%s.out 2>&1 & \n", strings.Join(omcStrArr, " && "), action)) cmdStrArr = append(cmdStrArr, fmt.Sprintf("setsid sh -c \"sleep 2s && %s\" > /tmp/omc_%s.out 2>&1 & \n", strings.Join(omcStrArr, " && "), action))
cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr))
return okFlagStr, cmdStrArr, nil return okFlagStr, cmdStrArr, nil
} else if neType == "IMS" { } else if neType == "IMS" {
@@ -575,7 +580,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
} }
// 删除软件包 // 删除软件包
cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm %s \n", strings.Join(neFilePaths, " "))) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm -rf %s \n", strings.Join(neFilePaths, " ")))
// 结束 // 结束
cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr))
@@ -647,7 +652,7 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin
} }
// 命令终止符后继续执行命令 // 命令终止符后继续执行命令
suffix := strings.HasSuffix(outputStr, "~]# ") || strings.HasSuffix(outputStr, "~$ ") suffix := strings.HasSuffix(outputStr, "~]# ") || strings.HasSuffix(outputStr, "~$ ") || strings.HasSuffix(outputStr, "~]$ ")
if len(cmdStrArr) > 0 && suffix { if len(cmdStrArr) > 0 && suffix {
if firstRead { if firstRead {
firstRead = false firstRead = false
@@ -672,6 +677,92 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin
return commandLineText, nil return commandLineText, nil
} }
// operateRun 操作版本-执行阶段
func (r *NeVersion) operateShellRun(preinput map[string]string, cmdStrArr []string, neType string, okFlagStr string) (string, error) {
firstRead := true // 首次命令进行记录日志信息
commandLineText := "" // 日志信息
done := make(chan bool) // 完成信号
// 超时退出 120s
timeoutTicker := time.NewTicker(120 * time.Second)
defer timeoutTicker.Stop()
go func() {
for {
select {
case <-timeoutTicker.C:
done <- true
return
default:
if len(cmdStrArr) > 0 {
if firstRead {
firstRead = false
}
// 获取第一个命令并从队列中移除
shiftElement := cmdStrArr[0]
cmdStrArr = cmdStrArr[1:]
// 执行命令
output, err := executeShellCommand(shiftElement)
if err != nil {
commandLineText += fmt.Sprintf("Error executing command: %s\n", err.Error())
done <- true
return
}
commandLineText += output
// 检查是否需要预输入
if neType == "IMS" {
if strings.Contains(output, "(P/I/S-CSCF Config)? <y/n>") {
if pisCSCF, ok := preinput["pisCSCF"]; ok && pisCSCF != "" {
executeShellCommand(fmt.Sprintf("echo '%s'", pisCSCF))
} else {
executeShellCommand("echo 'y'")
}
continue
}
if strings.Contains(output, "/usr/local/etc/mf directory? (Yes/No, default: No)") {
if pisCSCF, ok := preinput["updateMFetc"]; ok && pisCSCF != "" {
executeShellCommand(fmt.Sprintf("echo '%s'", pisCSCF))
} else {
executeShellCommand("echo 'No'")
}
continue
}
if strings.Contains(output, "/usr/local/share/mf directory? (Yes/No, default: No)") {
if pisCSCF, ok := preinput["updateMFshare"]; ok && pisCSCF != "" {
executeShellCommand(fmt.Sprintf("echo '%s'", pisCSCF))
} else {
executeShellCommand("echo 'No'")
}
continue
}
}
// 检查是否是最后的退出标记
if strings.LastIndex(output, okFlagStr) > 5 {
done <- true
break
}
} else {
done <- true
break
}
}
}
}()
// 等待写入协程完成
<-done
return commandLineText, nil
}
// executeShellCommand 执行本地 Shell 命令
func executeShellCommand(command string) (string, error) {
cmd := exec.Command("sh", "-c", command)
output, err := cmd.CombinedOutput()
return string(output), err
}
// operateDome 操作版本-完成阶段 // operateDome 操作版本-完成阶段
func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error { func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error {
if action == "install" { if action == "install" {