diff --git a/src/modules/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index 6ac3da24..df5283d4 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -178,6 +178,59 @@ func (s *NeInfoController) Para5GFileWrite(c *gin.Context) { c.JSON(200, result.Ok(nil)) } +// 网元端OAM配置文件读取 +// +// GET /oamFile +func (s *NeInfoController) OAMFileRead(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + data, err := s.neInfoService.NeConfOAMRead(querys.NeType, querys.NeID) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.OkData(data)) +} + +// 网元端OAM配置文件写入 +// +// PUT /oamFile +func (s *NeInfoController) OAMFileWrite(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body struct { + NeType string `json:"neType" binding:"required"` + NeID string `json:"neId" binding:"required"` + Content map[string]any `json:"content" binding:"required"` // 内容 + Sync bool `json:"sync"` // 同步到网元 + } + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(body.NeType, body.NeID) + if neInfo.NeId != body.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + err := s.neInfoService.NeConfOAMSync(neInfo, body.Content, body.Sync) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + c.JSON(200, result.Ok(nil)) +} + // 网元信息列表 // // GET /list @@ -314,6 +367,13 @@ func (s *NeInfoController) Edit(c *gin.Context) { c.JSON(200, result.ErrMsg(i18n.TKey(language, "neInfo.noData"))) return } + // 赋予主机ID + if neInfo.HostIDs != "" && len(body.Hosts) > 0 { + hostIDs := strings.Split(neInfo.HostIDs, ",") + for index, id := range hostIDs { + body.Hosts[index].HostID = id + } + } // 获取网元状态是否正常 body.ServerState, err = neService.NeState(body) @@ -358,8 +418,8 @@ func (s *NeInfoController) Edit(c *gin.Context) { } if neLicense.ID != "" { if neLicense.NeType != body.NeType || neLicense.NeId != body.NeId { - neVersion.NeType = body.NeType - neVersion.NeId = body.NeId + neLicense.NeType = body.NeType + neLicense.NeId = body.NeId } s.neLicenseService.Update(neLicense) } diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index e9d45cce..e44c612a 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -67,6 +67,15 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewNeInfo.Para5GFileWrite, ) + neInfoGroup.GET("/oamFile", + middleware.PreAuthorize(nil), + controller.NewNeInfo.OAMFileRead, + ) + neInfoGroup.PUT("/oamFile", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neInfo", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewNeInfo.OAMFileWrite, + ) neInfoGroup.GET("/list", middleware.PreAuthorize(nil), controller.NewNeInfo.List, diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 6209a290..5945fb3e 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -53,8 +53,11 @@ type INeInfo interface { // NeRunCMD 向网元发送cmd命令 NeRunCMD(neType, neId, cmd string) (string, error) + // neConfOAMRead 网元OAM配置文件读取 + NeConfOAMRead(neType, neId string) (map[string]any, error) + // NeConfOAMSync 网元OAM配置文件生成并同步 - NeConfOAMSync(neInfo model.NeInfo, sync bool) error + NeConfOAMSync(neInfo model.NeInfo, content map[string]any, sync bool) error // NeConfPara5GRead 网元公共配置文件读取 NeConfPara5GRead() (map[string]any, error) diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go index 883cd17f..9006d95a 100644 --- a/src/modules/network_element/service/ne_info.impl.go +++ b/src/modules/network_element/service/ne_info.impl.go @@ -368,13 +368,11 @@ func (r *NeInfoImpl) neConfOAMData() map[string]any { "oamConfig": map[string]any{ "enable": true, "ipType": "ipv4", - // 必改 - "ipv4": "172.60.5.1", + "ipv4": "172.60.5.1", // 必改 "ipv6": "", "port": 33030, "scheme": "http", - // 必改 - "neConfig": map[string]any{ + "neConfig": map[string]any{ // 必改 "neId": "001", "rmUid": "4400HX1XXX001", "neName": "XXX_001", @@ -387,22 +385,20 @@ func (r *NeInfoImpl) neConfOAMData() map[string]any { "snmpConfig": map[string]any{ "enable": false, "ipType": "ipv4", - // 必改 - "ipv4": "172.60.5.2", - "ipv6": "", - "port": 4957, + "ipv4": "172.60.5.2", // 必改 + "ipv6": "", + "port": 4957, }, "kpiConfig": map[string]any{ "enable": true, - // 必改 - "timer": 60, + "timer": 60, // 必改 }, - "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", + // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", } } // neConfOAMRead 网元OAM配置文件读取 -func (r *NeInfoImpl) neConfOAMRead(neType, neId string) (map[string]any, error) { +func (r *NeInfoImpl) NeConfOAMRead(neType, neId string) (map[string]any, error) { neTypeLower := strings.ToLower(neType) // 网管本地路径 omcPath := "/usr/local/etc/omc/ne_config" @@ -478,25 +474,29 @@ func (r *NeInfoImpl) neConfOAMWirte(neType, neId string, content any, sync bool) } // NeConfOAMSync 网元OAM配置文件生成并同步 -func (r *NeInfoImpl) NeConfOAMSync(neInfo model.NeInfo, sync bool) error { - oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId) +func (r *NeInfoImpl) NeConfOAMSync(neInfo model.NeInfo, content map[string]any, sync bool) error { + oamData, err := r.NeConfOAMRead(neInfo.NeType, neInfo.NeId) if oamData == nil || err != nil { return fmt.Errorf("error read OAM file info") } // 网元HTTP服务 if v, ok := oamData["httpManageCfg"]; ok { item := v.(map[string]any) - item["ipv4"] = neInfo.IP item["port"] = neInfo.Port + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + oamData["httpManageCfg"] = item } // 对网管HTTP配置 if v, ok := oamData["oamConfig"]; ok { item := v.(map[string]any) - item["enable"] = true - if omcIP, ok := r.Para5GData["OMCIP"]; ok && omcIP != "" { - item["ipv4"] = omcIP - } item["neConfig"] = map[string]string{ "neId": neInfo.NeId, "rmUid": neInfo.RmUID, @@ -506,18 +506,59 @@ func (r *NeInfoImpl) NeConfOAMSync(neInfo model.NeInfo, sync bool) error { "province": neInfo.Province, "pvFlag": neInfo.PvFlag, } + + if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" { + if strings.Contains(omcIP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = omcIP + } + if strings.Contains(omcIP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = omcIP + } + } + + if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil { + item["enable"] = parse.Boolean(oamEnable) + } + if oamPort, ok := content["oamPort"]; ok && oamPort != nil { + item["port"] = parse.Number(oamPort) + } oamData["oamConfig"] = item } // 对网管SNMP配置 if v, ok := oamData["snmpConfig"]; ok { item := v.(map[string]any) - item["ipv4"] = neInfo.IP + if strings.Contains(neInfo.IP, ":") { + item["ipType"] = "ipv6" + item["ipv6"] = neInfo.IP + } + if strings.Contains(neInfo.IP, ".") { + item["ipType"] = "ipv4" + item["ipv4"] = neInfo.IP + } + + if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { + item["enable"] = parse.Boolean(snmpEnable) + } + if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil { + item["port"] = parse.Number(snmpPort) + } oamData["snmpConfig"] = item } // 对网管KPI上报配置 if v, ok := oamData["kpiConfig"]; ok { item := v.(map[string]any) - item["enable"] = true + if neInfo.NeType == "UPF" { + item["timer"] = 5 + } + + if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil { + item["enable"] = parse.Boolean(kpiEnable) + } + if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil { + item["timer"] = parse.Number(kpiTimer) + } oamData["kpiConfig"] = item } if err := NewNeInfoImpl.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { @@ -586,7 +627,7 @@ func (r *NeInfoImpl) NeConfPara5GWirte(content map[string]any, syncNE []string) neFilePath := "/usr/local/etc/conf/para5G.yaml" neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod o+w %s && sudo chmod o+w %s", neFileDir, neFileDir, neFilePath)) + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod o+w %s && sudo touch %s && sudo chmod o+w %s", neFileDir, neFileDir, neFilePath, neFilePath)) // 复制到网元进行覆盖 if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) diff --git a/src/modules/network_element/service/ne_version.impl.go b/src/modules/network_element/service/ne_version.impl.go index 4676790f..dad93a81 100644 --- a/src/modules/network_element/service/ne_version.impl.go +++ b/src/modules/network_element/service/ne_version.impl.go @@ -179,8 +179,8 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo /usr/local/etc/ims/default/tools/modintraip.sh %s \n", para5GData["IMS_IP"])) // IWF连接PCF服务 cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.160/%s/g\" /usr/local/etc/iwf/iwf_conf.yaml \n", para5GData["PCF_IP"])) - // 5s后停止服务 - cmdStrArr = append(cmdStrArr, "nohup sh -c \"sleep 5s && sudo ims-stop\" > /dev/null 2>&1 & \n") + // 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") @@ -270,14 +270,16 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/upf/default/upfForwarder_1.yaml /usr/local/etc/upf/upfForwarder_1.yaml \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/172.16.5.190/%s/g\" /usr/local/etc/upf/upfcfg.yaml \n", para5GData["UPF_IP"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/localhost/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UPF_IP"])) + // UE N3 N6 根据版本修改 + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4: 10.2.1.0/s/ueIpv4: 10.2.1.0/ueIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4Mask: 255.255.255.0/s/ueIpv4Mask: 255.255.255.0/ueIpv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_MASK"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.190/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_IP"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/ipv4Mask: 255.255.240.0/s/ipv4Mask: 255.255.240.0/ipv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_MASK"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N3\"/,/gatewayIpv4: 192.168.1.254/s/gatewayIpv4: 192.168.1.254/gatewayIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N3_GW"])) + // 标准版 cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.191/%s/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_IP"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ipv4Mask: 255.255.240.0/s/ipv4Mask: 255.255.240.0/ipv4Mask: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_MASK"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/gatewayIpv4: 192.168.1.254/s/gatewayIpv4: 192.168.1.254/gatewayIpv4: %s/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["N6_GW"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4: 10.2.1.0/s/ueIpv4: 10.2.1.0/ueIpv4: %s'/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_IP"])) - cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i '/- interfaceType: \"N6\"/,/ueIpv4Mask: 255.255.255.0/s/ueIpv4Mask: 255.255.255.0/ueIpv4Mask: %s'/' /usr/local/etc/upf/upfForwarder_1.yaml \n", para5GData["UE_MASK"])) // 轻量版 // cmdStrArr = append(cmdStrArr, "sudo sed -i \"s/192.168.8.191/0.0.0.0/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n") // cmdStrArr = append(cmdStrArr, "sudo sed -i \"s/type: upfd/type: tun/g\" /usr/local/etc/upf/upfForwarder_1.yaml \n") @@ -332,8 +334,8 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp } cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) - // 5s后停止服务 - cmdStrArr = append(cmdStrArr, fmt.Sprintf("nohup sh -c \"sleep 5s && sudo service %s stop\" > /dev/null 2>&1 & \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") @@ -412,7 +414,7 @@ func (r *NeVersionImpl) Operate(action string, neVersion model.NeVersion, preinp if strings.LastIndex(logMsg, okFlagStr) > 5 { if action == "install" { // ========= 网元OAM配置文件 start ========== - if err := NewNeInfoImpl.NeConfOAMSync(neInfo, true); err != nil { + if err := NewNeInfoImpl.NeConfOAMSync(neInfo, nil, true); err != nil { return "", fmt.Errorf("error wirte OAM file info") } // ========= 网元OAM配置文件 end ===========