diff --git a/src/modules/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go index 1f372bfc..d5658d7c 100644 --- a/src/modules/network_element/controller/ne_software.go +++ b/src/modules/network_element/controller/ne_software.go @@ -191,44 +191,3 @@ func (s *NeSoftwareController) NewNeVersion(c *gin.Context) { } c.JSON(200, result.Err(nil)) } - -// 网元软件包安装 -// -// POST /install -func (s *NeSoftwareController) Install(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var body struct { - Software model.NeSoftware `json:"software" binding:"required"` // 软件包信息 - Preinput map[string]string `json:"preinput" binding:"required"` // 预先输入参数 - } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || body.Software.NeId == "" { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 检查是否存在软件包记录 - neSoftwares := s.neSoftwareService.SelectList(model.NeSoftware{ - NeType: body.Software.NeType, - Name: body.Software.Name, - Version: body.Software.Version, - }) - if len(neSoftwares) <= 0 { - body.Software.CreateBy = ctx.LoginUserToUserName(c) - body.Software.ID = s.neSoftwareService.Insert(body.Software) - } else { - neSoftware := neSoftwares[0] - neSoftware.Path = body.Software.Path - neSoftware.Description = body.Software.Description - neSoftware.UpdateBy = ctx.LoginUserToUserName(c) - s.neSoftwareService.Update(neSoftware) - } - - // 进行安装 - output, err := s.neSoftwareService.InstallToNeHost(body.Software, body.Preinput) - if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - c.JSON(200, result.OkData(output)) -} diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go index 2c18615d..37e9ad4a 100644 --- a/src/modules/network_element/service/ne_software.go +++ b/src/modules/network_element/service/ne_software.go @@ -27,7 +27,4 @@ type INeSoftware interface { // UpdateVersions 更新软件包对应网元的新版本 UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 - - // InstallToNeHost 安装包上传到网元主机执行安装命令 - InstallToNeHost(neSoftware model.NeSoftware, preinput map[string]string) (string, error) } diff --git a/src/modules/network_element/service/ne_software.impl.go b/src/modules/network_element/service/ne_software.impl.go index 3e4b3a40..8ac52094 100644 --- a/src/modules/network_element/service/ne_software.impl.go +++ b/src/modules/network_element/service/ne_software.impl.go @@ -3,9 +3,6 @@ package service import ( "fmt" "os" - "path/filepath" - "strings" - "time" "be.ems/src/framework/utils/file" "be.ems/src/modules/network_element/model" @@ -144,163 +141,3 @@ func (r *NeSoftwareImpl) UpdateVersions(neSoftware model.NeSoftware, neVersion m } return rows } - -// InstallToNeHost 安装包上传到网元主机执行安装命令 -func (r *NeSoftwareImpl) InstallToNeHost(neSoftware model.NeSoftware, preinput map[string]string) (string, error) { - // 检查文件是否存在 - localFilePath := file.ParseUploadFilePath(neSoftware.Path) - if _, err := os.Stat(localFilePath); err != nil { - return "", fmt.Errorf("file read failure") - } - fileName := filepath.Base(neSoftware.Path) - if strings.Contains(fileName, "*") { - fileName = strings.ReplaceAll(fileName, "*", "_") - } - nePath := "/tmp" - neFilePath := fmt.Sprintf("%s/%s", nePath, fileName) - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHclient(neSoftware.NeType, neSoftware.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", err - } - defer sftpClient.Close() - - // 上传软件包到 /tmp - if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - return "", fmt.Errorf("error uploading package") - } - - // ========= 安装命令 start ========= - - // 命令终止结束标记 - okFlagStr := fmt.Sprintf("%s software install successful!", neSoftware.NeType) - // 安装软件包 - pkgCmdStr := fmt.Sprintf("sudo dpkg -i %s \n", neFilePath) - fileExt := filepath.Ext(strings.ToLower(fileName)) - if strings.HasSuffix(fileExt, "rpm") { - pkgCmdStr = fmt.Sprintf("sudo rpm -Uvh %s \n", neFilePath) - } - - // 预先参数 - cmdStrArr := []string{pkgCmdStr} - if neSoftware.NeType == "IMS" { - if !strings.Contains(strings.ToLower(fileName), "ims") { - return "", fmt.Errorf("error file package not ims") - } - // P/I/S-CSCF Config 配置覆盖 - if pisCSCF, ok := preinput["pisCSCF"]; ok && pisCSCF != "" { - cmdStrArr = append(cmdStrArr, fmt.Sprintf("%s \n", pisCSCF)) - } - // 公网 PLMN地址 - pubIP, pubIPOk := preinput["pubIP"] - mcc, mccOk := preinput["mcc"] - mnc, mncOk := preinput["mnc"] - if pubIPOk && pubIP != "" && mccOk && mcc != "" && mncOk && mnc != "" { - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo /usr/local/etc/ims/default/tools/modipplmn.sh %s %s %s \n", pubIP, mcc, mnc)) - } - // 内网 服务地址 - if priIP, ok := preinput["priIP"]; ok && priIP != "" { - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo /usr/local/etc/ims/default/tools/modintraip.sh %s \n", priIP)) - } - cmdStrArr = append(cmdStrArr, "sudo ims-start") - // 10s后停止服务 - cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 15s && sudo ims-stop\" > /dev/null 2>&1 & \n") - } else if neSoftware.NeType == "OMC" { - cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/omcsvc.sh restart \n") - // 10s后停止服务 - cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 15s && sudo /usr/local/omc/bin/omcsvc.sh stop\" > /dev/null 2>&1 & \n") - } else { - neTypeLower := strings.ToLower(neSoftware.NeType) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) - // 10s后停止服务 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 15s && sudo service %s stop\" > /dev/null 2>&1 & \n", neTypeLower)) - } - - // 删除软件包 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo rm %s \n", neFilePath)) - // 结束 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("echo '%s' \n", okFlagStr)) - // ========= 安装命令 end ========= - - // ssh连接会话 - clientSession, err := sshClient.NewClientSession(80, 24) - if err != nil { - return "", fmt.Errorf("neinfo ssh client session new err") - } - defer clientSession.Close() - - firstRead := true // 首次命令进行记录日志信息 - logMsg := "" // 日志信息 - done := make(chan bool) // 完成信号 - // 超时退出 30s - timeoutTicker := time.NewTicker(30 * time.Second) - defer timeoutTicker.Stop() - // 实时读取SSH消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - go func() { - for { - select { - case <-timeoutTicker.C: - done <- true - return - case <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - // 非首次进行记录命令 - if !firstRead { - logMsg += outputStr - } - // IMS预输入 - if neSoftware.NeType == "IMS" && strings.Contains(outputStr, "(P/I/S-CSCF Config)? ") { - shiftElement := cmdStrArr[0] // 获取第一个元素 - cmdStrArr = cmdStrArr[1:] // 将第一个元素从切片中移除 - clientSession.Write(shiftElement) - continue - } - // 命令终止符后继续执行命令 - if len(cmdStrArr) > 0 && strings.LastIndex(outputStr, "~$ ") > 2 { - if firstRead { - firstRead = false - } - shiftElement := cmdStrArr[0] // 获取第一个元素 - cmdStrArr = cmdStrArr[1:] // 将第一个元素从切片中移除 - clientSession.Write(shiftElement) - continue - } - // 最后输出的退出标记 - if strings.LastIndex(outputStr, okFlagStr) > 5 { - done <- true - break - } - } - } - } - }() - // 等待写入协程完成 - <-done - - // 执行到最后语句的更新Version - if strings.LastIndex(logMsg, okFlagStr) > 5 { - verInfo := NewNeVersionImpl.SelectByNeTypeAndNeID(neSoftware.NeType, neSoftware.NeId) - if verInfo.NeId == neSoftware.NeId { - verInfo.Name = neSoftware.Name - verInfo.Version = neSoftware.Version - verInfo.Path = neSoftware.Path - verInfo.NewName = "-" - verInfo.NewVersion = "-" - verInfo.NewPath = "-" - verInfo.Status = "1" - NewNeVersionImpl.Update(verInfo) - } - } - return logMsg, nil -}