fix: omc ui self-upgrade issue
This commit is contained in:
@@ -3,6 +3,7 @@ package service
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -177,6 +178,10 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
// commandLine, err = r.operateShellRun(preinput, cmdStrArr, neVersion.NeType, okFlagStr)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
|
||||
// ========= 完成阶段 =========
|
||||
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, " "))
|
||||
fileExt := filepath.Ext(strings.ToLower(neFilePaths[0]))
|
||||
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, " "))
|
||||
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)
|
||||
}
|
||||
@@ -266,7 +271,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string)
|
||||
|
||||
// 2s后执行omc相关命令
|
||||
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))
|
||||
return okFlagStr, cmdStrArr, nil
|
||||
} 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))
|
||||
|
||||
@@ -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 firstRead {
|
||||
firstRead = false
|
||||
@@ -672,6 +677,92 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin
|
||||
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 操作版本-完成阶段
|
||||
func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error {
|
||||
if action == "install" {
|
||||
|
||||
Reference in New Issue
Block a user