From a5e5b3cf6ebf22a9f1809b072c89a3ec5eae06ac Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 14 May 2025 18:41:57 +0800 Subject: [PATCH] fix: omc ui self-upgrade issue --- .../network_element/service/ne_version.go | 101 +++++++++++++++++- 1 file changed, 96 insertions(+), 5 deletions(-) diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index 97a04f23..d0cc386b 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -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)? ") { + 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" {