diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go index 06e8cbc8..d18a8bb1 100644 --- a/src/modules/network_element/controller/ne_version.go +++ b/src/modules/network_element/controller/ne_version.go @@ -157,10 +157,10 @@ func (s *NeVersionController) Remove(c *gin.Context) { func (s *NeVersionController) Operate(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { - Action string `json:"action" binding:"required,oneof=upgrade rollback"` // 操作行为 - NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 - NeId string `json:"neId" gorm:"ne_id" binding:"required"` // 网元ID - Preinput map[string]string `json:"preinput" ` // 预先输入参数 + Action string `json:"action" binding:"required,oneof=install upgrade rollback"` // 操作行为 + NeType string `json:"neType" gorm:"ne_type" binding:"required"` // 网元类型 + NeId string `json:"neId" gorm:"ne_id" binding:"required"` // 网元ID + Preinput map[string]string `json:"preinput" ` // 预先输入参数 } if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index 09090f9f..ed04f0ed 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -30,6 +30,6 @@ type INeVersion interface { // Operate 操作版本上传到网元主机执行命令 // - // action 安装行为:upgrade rollback + // action 安装行为:install upgrade rollback Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) } diff --git a/src/modules/network_element/service/ne_version.impl.go b/src/modules/network_element/service/ne_version.impl.go index 1b4b105c..38f40bd0 100644 --- a/src/modules/network_element/service/ne_version.impl.go +++ b/src/modules/network_element/service/ne_version.impl.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "runtime" "strings" "time" @@ -97,10 +98,10 @@ func (r *NeVersionImpl) CheckUniqueTypeAndID(neType, neId, id string) bool { // Operate 操作版本上传到网元主机执行命令 // -// action 安装行为:upgrade rollback +// action 安装行为:install upgrade rollback func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { softwarePath := neVersion.Path - if action == "upgrade" { + if action == "install" || action == "upgrade" { softwarePath = neVersion.NewPath } if action == "rollback" { @@ -136,6 +137,25 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp return "", fmt.Errorf("error uploading package") } + if action == "install" { + // ========= para5G公共参数文件 start ========= + // 网管本地路径 + omcPara5GFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcPara5GFilePath = fmt.Sprintf("C:%s", omcPara5GFilePath) + } + // 网元端配置路径 + nePara5GFilePath := "/usr/local/etc/conf/para5G.yaml" + nePara5GFileDir := filepath.Dir(nePara5GFilePath) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod o+w %s && sudo chmod o+w %s", nePara5GFileDir, nePara5GFileDir, nePara5GFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(omcPara5GFilePath, nePara5GFilePath); err != nil { + return "", fmt.Errorf("please check if scp remote copy is allowed") + } + // ========= para5G公共参数文件 end ========= + } + // ========= 安装命令 start ========= // 命令终止结束标记 okFlagStr := fmt.Sprintf("%s version %s successful!", neVersion.NeType, action) @@ -149,27 +169,52 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp // 预先参数 cmdStrArr := []string{} if neVersion.NeType == "OMC" { - cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/omcsvc.sh stop") cmdStrArr = append(cmdStrArr, pkgCmdStr) - cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/setomc.sh -m upgrade") // 升级数据库 + if action == "install" { + cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/setomc.sh -m install") // 初始化数据库 + } else { + cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/omcsvc.sh stop") + cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/setomc.sh -m upgrade") // 升级数据库 + } cmdStrArr = append(cmdStrArr, "sudo /usr/local/omc/bin/omcsvc.sh restart") - return sshClient.RunCMD(fmt.Sprintf("nohup sh -c \"sleep 15s && %s\" > /dev/null 2>&1 & \n", strings.Join(cmdStrArr, " && "))) + return sshClient.RunCMD(fmt.Sprintf("nohup sh -c \"sleep 3s && %s\" > /dev/null 2>&1 & \n", strings.Join(cmdStrArr, " && "))) } else if neVersion.NeType == "IMS" { if !strings.Contains(strings.ToLower(fileName), "ims") { return "", fmt.Errorf("error file package not ims") } - cmdStrArr = append(cmdStrArr, "sudo ims-stop \n") - cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") - // P/I/S-CSCF Config 配置覆盖 - if pisCSCF, ok := preinput["pisCSCF"]; ok && pisCSCF != "" { - cmdStrArr = append(cmdStrArr, fmt.Sprintf("%s \n", pisCSCF)) + if action == "install" { + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + cmdStrArr = append(cmdStrArr, "sudo ims-stop && sudo ims-start") + // 公网 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)) + } + // 30s后停止服务 + cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 30s && sudo ims-stop\" > /dev/null 2>&1 & \n") + } else { + cmdStrArr = append(cmdStrArr, "sudo ims-stop \n") + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + cmdStrArr = append(cmdStrArr, "sudo ims-start \n") } - cmdStrArr = append(cmdStrArr, "sudo ims-start \n") } else { neTypeLower := strings.ToLower(neVersion.NeType) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s stop \n", neTypeLower)) - cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) + if action == "install" { + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) + // 30s后停止服务 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 30s && sudo service %s stop\" > /dev/null 2>&1 & \n", neTypeLower)) + } else { + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s stop \n", neTypeLower)) + cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) + } } // 删除软件包 @@ -208,11 +253,13 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp if !firstRead { logMsg += outputStr } - // IMS预输入 + // IMS预输入 P/I/S-CSCF Config 配置覆盖 if neVersion.NeType == "IMS" && strings.Contains(outputStr, "(P/I/S-CSCF Config)? ") { - shiftElement := cmdStrArr[0] // 获取第一个元素 - cmdStrArr = cmdStrArr[1:] // 将第一个元素从切片中移除 - clientSession.Write(shiftElement) + if pisCSCF, ok := preinput["pisCSCF"]; ok && pisCSCF != "" { + clientSession.Write(fmt.Sprintf("%s \n", pisCSCF)) + } else { + clientSession.Write("y \n") + } continue } // 命令终止符后继续执行命令 @@ -244,6 +291,17 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp curName := verInfo.Name curVersion := verInfo.Version curPath := verInfo.Path + if action == "install" { + verInfo.Name = neVersion.NewName + verInfo.Version = neVersion.NewVersion + verInfo.Path = neVersion.NewPath + verInfo.PreName = "-" + verInfo.PreVersion = "-" + verInfo.PrePath = "-" + verInfo.NewName = "-" + verInfo.NewVersion = "-" + verInfo.NewPath = "-" + } if action == "upgrade" { verInfo.Name = neVersion.NewName verInfo.Version = neVersion.NewVersion