fix: omc ui self-upgrade issue
This commit is contained in:
@@ -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" {
|
||||||
|
|||||||
Reference in New Issue
Block a user