From ee2cff720868b91738a164d3a5dde477963e4472 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 20 Sep 2024 14:56:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B7=9F=E8=B8=AA=E4=BB=BB=E5=8A=A1HLR?= =?UTF-8?q?=E5=85=8D=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_element/fetch_link/hlr.go | 9 +-- .../trace/controller/trace_task_hlr.go | 64 +++++++++++++++++++ .../trace/repository/trace_task_hlr.go | 17 ++++- src/modules/trace/service/trace_task_hlr.go | 19 +++--- 4 files changed, 96 insertions(+), 13 deletions(-) diff --git a/src/modules/network_element/fetch_link/hlr.go b/src/modules/network_element/fetch_link/hlr.go index c59a8c7d..8a4c1198 100644 --- a/src/modules/network_element/fetch_link/hlr.go +++ b/src/modules/network_element/fetch_link/hlr.go @@ -10,14 +10,15 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/utils/fetch" + "be.ems/src/modules/network_element/model" ) // HLRTraceStart HLR跟踪任务开始 // // data参数 {traceID:"跟踪任务ID", imsi:"IMSI和MSISDN必填一个,都带的话以IMSI为准", msisdn:""} -func HLRTraceStart(hlrIP string, data map[string]any) (string, error) { +func HLRTraceStart(neInfo model.NeInfo, data map[string]any) (string, error) { // 网元参数配置新增(array) - neUrl := fmt.Sprintf("http://%s:8080/trace-manage/v1/add-task", hlrIP) + neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/add-task", neInfo.IP, neInfo.Port) resBytes, err := fetch.PostJSON(neUrl, data, nil) var resData map[string]string if err != nil { @@ -42,9 +43,9 @@ func HLRTraceStart(hlrIP string, data map[string]any) (string, error) { // HLRTraceStop HLR跟踪任务停止 // // data参数 {traceIDArray: ["跟踪任务ID数组"]} -func HLRTraceStop(hlrIP string, data map[string]any) (string, error) { +func HLRTraceStop(neInfo model.NeInfo, data map[string]any) (string, error) { // 网元参数配置新增(array) - neUrl := fmt.Sprintf("http://%s:8080/trace-manage/v1/delete-task", hlrIP) + neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/delete-task", neInfo.IP, neInfo.Port) resBytes, err := fetch.PostJSON(neUrl, data, nil) var resData map[string]string if err != nil { diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go index 1ff5046f..4b659015 100644 --- a/src/modules/trace/controller/trace_task_hlr.go +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -1,10 +1,15 @@ package controller import ( + "fmt" + "os" + "path/filepath" + "runtime" "strings" "be.ems/src/framework/i18n" "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/generate" "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" neService "be.ems/src/modules/network_element/service" @@ -176,3 +181,62 @@ func (s *TraceTaskHlrController) File(c *gin.Context) { } c.JSON(200, result.OkData(list)) } + +// 跟踪任务文件从网元到本地 +// +// GET /filePull +func (s *TraceTaskHlrController) FilePull(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var querys struct { + NeType string `form:"neType" binding:"required"` + NeID string `form:"neId" binding:"required"` + Path string `form:"path" binding:"required"` + FileName string `form:"fileName" binding:"required"` + DelTemp bool `form:"delTemp"` // 删除本地临时文件 + } + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + if neInfo.NeId != querys.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() + + nePath := filepath.ToSlash(filepath.Join(querys.Path, querys.FileName)) + fileName := generate.Code(6) + "_" + querys.FileName + localFilePath := filepath.Join("/tmp/omc/pull", fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + // 复制到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath, localFilePath); err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + defer func() { + if querys.DelTemp { + _ = os.Remove(localFilePath) + } + }() + c.FileAttachment(localFilePath, fileName) +} diff --git a/src/modules/trace/repository/trace_task_hlr.go b/src/modules/trace/repository/trace_task_hlr.go index 3e102036..15b6cbf5 100644 --- a/src/modules/trace/repository/trace_task_hlr.go +++ b/src/modules/trace/repository/trace_task_hlr.go @@ -33,7 +33,7 @@ var NewTraceTaskHlr = &TraceTaskHlr{ }, } -// CDREventIMSImpl 跟踪_任务给HRL网元 数据层处理 +// TraceTaskHlr 跟踪_任务给HRL网元 数据层处理 type TraceTaskHlr struct { // 查询视图对象SQL selectSql string @@ -299,3 +299,18 @@ func (r *TraceTaskHlr) DeleteByIds(ids []string) int64 { } return results } + +// LastID 最后一条ID +func (r *TraceTaskHlr) LastID() int64 { + // 查询数据 + querySql := "SELECT id as 'str' FROM trace_task_hlr ORDER BY id DESC LIMIT 1" + results, err := datasource.RawDB("", querySql, nil) + if err != nil { + logger.Errorf("query err %v", err) + return 0 + } + if len(results) > 0 { + return parse.Number(results[0]["str"]) + } + return 0 +} diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index d527c91b..2cad7167 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -6,7 +6,6 @@ import ( "path/filepath" "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/generate" "be.ems/src/framework/utils/ssh" neFetchlink "be.ems/src/modules/network_element/fetch_link" neModel "be.ems/src/modules/network_element/model" @@ -65,8 +64,11 @@ func (r *TraceTaskHlr) DeleteByIds(ids []string) (int64, error) { // 停止任务 neInfos := r.neInfoService.SelectList(neModel.NeInfo{NeType: "UDM"}, false, false) for _, r := range rows { + if r.Status == "0" { + continue + } for _, v := range neInfos { - neFetchlink.HLRTraceStop(v.IP, map[string]any{ + neFetchlink.HLRTraceStop(v, map[string]any{ "traceIDArray": []string{r.TraceId}, }) } @@ -81,10 +83,9 @@ func (r *TraceTaskHlr) DeleteByIds(ids []string) (int64, error) { // Start 创建任务 func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { hlrList := []map[string]any{} - task.TraceId = generate.Code(6) - + traceId := r.traceTaskHlrRepository.LastID() + 1 // 生成任务ID < 65535 data := map[string]any{ - "traceID": task.TraceId, + "traceID": traceId, "imsi": task.IMSI, "msisdn": task.MSISDN, } @@ -106,7 +107,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { "neId": neInfo.NeId, "msg": "", } - msg, err := neFetchlink.HLRTraceStart(neInfo.IP, data) + msg, err := neFetchlink.HLRTraceStart(neInfo, data) if err != nil { hlrItem["err"] = err.Error() } else { @@ -118,6 +119,7 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (string, error) { msg, _ := json.Marshal(hlrList) task.Msg = string(msg) task.Status = "1" + task.TraceId = fmt.Sprint(traceId) id := r.traceTaskHlrRepository.Insert(task) if id == "" { return "", fmt.Errorf("start task fail") @@ -136,7 +138,7 @@ func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { "neId": neInfo.NeId, "msg": "", } - msg, err := neFetchlink.HLRTraceStop(neInfo.IP, map[string]any{ + msg, err := neFetchlink.HLRTraceStop(neInfo, map[string]any{ "traceIDArray": []string{task.TraceId}, }) if err != nil { @@ -171,6 +173,7 @@ func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { hlrItem := map[string]any{ "neType": neInfo.NeType, "neId": neInfo.NeId, + "neName": neInfo.NeName, "err": "", } @@ -184,7 +187,7 @@ func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { defer sshClient.Close() // 获取文件列表 - fileName := fmt.Sprintf("%s_%s_%s", neInfo.NeType, neInfo.NeId, traceId) + fileName := fmt.Sprintf("%s_%s", neInfo.NeName, traceId) _, rows, err := ssh.FileList(sshClient, filepath.ToSlash(dirPath), fileName) if err != nil { hlrItem["err"] = "file not found"