package controller import ( "fmt" "path/filepath" "strings" "time" "be.ems/src/framework/constants/uploadsubpath" "be.ems/src/framework/i18n" "be.ems/src/framework/telnet" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 UDMSubController 结构体 var NewUDMSub = &UDMSubController{ udmSubService: neDataService.NewUDMSub, neInfoService: neService.NewNeInfo, } // UDM签约用户 // // PATH /udm/sub type UDMSubController struct { udmSubService *neDataService.UDMSubUser // UDM签约信息服务 neInfoService *neService.NeInfo // 网元信息服务 } // UDM签约用户重载数据 // // POST /resetData/:neId func (s *UDMSubController) ResetData(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } neId = "" data := s.udmSubService.ResetData(neId) c.JSON(200, result.OkData(data)) } // UDM签约用户列表 // // GET /list func (s *UDMSubController) List(c *gin.Context) { querys := ctx.QueryMap(c) querys["neId"] = "" data := s.udmSubService.SelectPage(querys) c.JSON(200, result.Ok(data)) } // UDM签约用户信息 // // GET /:neId/:imsi func (s *UDMSubController) Info(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") if neId == "" || imsi == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() // 发送MML cmd := fmt.Sprintf("dsp udmuser:imsi=%s", imsi) data, err := telnet.ConvertToMap(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } if len(data) == 0 { c.JSON(200, result.ErrMsg("No Subs Data")) return } neId = "" // 解析返回的数据 u := s.udmSubService.ParseInfo(imsi, neId, data) s.udmSubService.Insert(neId, u) c.JSON(200, result.OkData(u)) } // UDM签约用户新增 // // POST /:neId func (s *UDMSubController) Add(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMSubUser err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil || len(body.IMSI) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() // 发送MML cmd := fmt.Sprintf("add udmuser:imsi=%s,", body.IMSI) cmd += s.udmSubService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } // 命令ok时 if strings.Contains(data, "ok") { neId = "" body.NeId = neId s.udmSubService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } // UDM签约用户批量新增 // // POST /:neId/:num func (s *UDMSubController) Adds(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") num := c.Param("num") if neId == "" || num == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMSubUser err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil || len(body.IMSI) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() // 发送MML cmd := fmt.Sprintf("baa udmuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,", body.IMSI, body.MSISDN, num) cmd += s.udmSubService.ParseCommandParams(body) // static_ip指给4G UE分配的静态IP,没有可不带此字段名,批量添加IP会自动递增 if body.StaticIp != "" { cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp) } data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } // 命令ok时 if strings.Contains(data, "ok") { neId = "" go s.udmSubService.LoadData(neId, body.IMSI, num, body.Remark) } c.JSON(200, result.OkData(data)) } // UDM签约用户修改 // // PUT /:neId func (s *UDMSubController) Edit(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") if neId == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var body model.UDMSubUser err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil || len(body.IMSI) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() // 发送MML cmd := fmt.Sprintf("mod udmuser:imsi=%s,", body.IMSI) cmd += s.udmSubService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } // 命令ok时 if strings.Contains(data, "ok") { neId = "" body.NeId = neId s.udmSubService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } // UDM签约用户删除 // // DELETE /:neId/:imsi func (s *UDMSubController) Remove(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") if neId == "" || len(imsi) < 15 { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 处理字符转id数组后去重 imsiArr := strings.Split(imsi, ",") uniqueIDs := parse.RemoveDuplicates(imsiArr) if len(uniqueIDs) <= 0 { c.JSON(200, result.Err(nil)) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() resultData := map[string]string{} for _, imsi := range uniqueIDs { // 发送MML cmd := fmt.Sprintf("del udmuser:imsi=%s", imsi) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { resultData[imsi] = err.Error() continue } // 命令ok时 if strings.Contains(data, "ok") { neId = "" s.udmSubService.Delete(neId, imsi) } resultData[imsi] = data } c.JSON(200, result.OkData(resultData)) } // UDM签约用户批量删除 // // DELETE /:neId/:imsi/:num func (s *UDMSubController) Removes(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") if neId == "" || len(imsi) < 15 || num == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", neId) if neInfo.NeId != neId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() // 发送MML cmd := fmt.Sprintf("bde udmuser:start_imsi=%s,sub_num=%s", imsi, num) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } // 命令ok时 if strings.Contains(data, "ok") { neId = "" go s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-") } c.JSON(200, result.OkData(data)) } // UDM签约用户导出 // // POST /export func (s *UDMSubController) Export(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { NeId string `json:"neId" binding:"required"` Type string `json:"type" binding:"required"` } err := c.ShouldBindBodyWith(&body, binding.JSON) if err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } if !(body.Type == "csv" || body.Type == "txt") { c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } neId := "" list := s.udmSubService.SelectList(model.UDMSubUser{NeId: neId}) // 文件名 fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type) filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) if body.Type == "csv" { // 转换数据 data := [][]string{} data = append(data, []string{"IMSI", "MSISDN", "UeAmbrTpl", "NssaiTpl", "AreaForbiddenTpl", "ServiceAreaRestrictionTpl", "RatRestrictions", "CnTypeRestrictions", "SmfSel", "SmData", "EPSDat"}) for _, v := range list { epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp) data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat}) } // 输出到文件 err = file.WriterFileCSV(data, filePath) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } } if body.Type == "txt" { // 转换数据 data := [][]string{} for _, v := range list { epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp) data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat}) } // 输出到文件 err = file.WriterFileTXT(data, ",", filePath) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } } c.FileAttachment(filePath, fileName) } // UDM签约用户导入 // // POST /import func (s *UDMSubController) Import(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { NeId string `json:"neId" binding:"required"` UploadPath string `json:"uploadPath" binding:"required"` } if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } // 判断文件名 if !(strings.HasSuffix(body.UploadPath, ".csv") || strings.HasSuffix(body.UploadPath, ".txt")) { c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("UDM", body.NeId) if neInfo.NeId != body.NeId || neInfo.IP == "" { c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer sftpClient.Close() // 本地文件 localFilePath := file.ParseUploadFilePath(body.UploadPath) neFilePath := fmt.Sprintf("/tmp/%s", filepath.Base(localFilePath)) // 复制到远程 if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { c.JSON(200, result.ErrMsg("error uploading file")) return } // 网元主机的Telnet客户端 telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.NeType, neInfo.NeId, 1) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } defer telnetClient.Close() // 发送MML cmd := fmt.Sprintf("import udmuser:path=%s", neFilePath) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } // 命令ok时 if strings.Contains(data, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) neId := "" go s.udmSubService.InsertData(neId, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXT(",", localFilePath) neId := "" go s.udmSubService.InsertData(neId, "txt", data) } } c.JSON(200, result.OkMsg(data)) }