del: 移除网元软件安装接口
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)? <y/n>") {
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user