From d0f946cc85867f93c76cc574e464739807285487 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 8 Oct 2024 15:00:44 +0800 Subject: [PATCH 01/69] =?UTF-8?q?feat:=20=E6=8A=93=E5=8C=85=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=BE=93=E5=87=BA=E6=88=AA=E5=8F=96=E7=BD=91=E5=85=83?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/trace/service/tcpdump.go | 99 ++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 7 deletions(-) diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index a0ed1621..2511736d 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -12,6 +12,7 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/ssh" neService "be.ems/src/modules/network_element/service" ) @@ -32,7 +33,7 @@ var dumpPIDMap sync.Map // DumpStart 触发tcpdump开始抓包 func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { // 命令检查 - if strings.Contains(cmdStr, "w") { + if strings.Contains(cmdStr, "-w") { return "", fmt.Errorf("command cannot contain -w") } @@ -53,7 +54,7 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { // bash: tcpdump: command not found msg = strings.TrimSpace(msg) logger.Errorf("DumpStart err: %s => %s", msg, err.Error()) - return "", fmt.Errorf(msg) + return "", fmt.Errorf("%s", msg) } taskCode := time.Now().Format("20060102150405") @@ -81,10 +82,18 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { return "", err } + // 日志文件行号 + PIDMap := s.logFileLastLine(neType, sshClient) + PIDMap["neType"] = neInfo.NeType + PIDMap["neId"] = neInfo.NeId + PIDMap["taskCode"] = taskCode + PIDMap["pid"] = outputPID + PIDMap["cmd"] = sendCmd + // 检查进程 ps aux | grep tcpdump // 强杀 sudo pkill tcpdump pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) - dumpPIDMap.Store(pidKey, outputPID) + dumpPIDMap.Store(pidKey, PIDMap) return taskCode, err } @@ -104,12 +113,14 @@ func (s *TCPdump) DumpStop(neType, neId, taskCode string) (string, error) { // 是否存在执行过的进程 pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) - pid, ok := dumpPIDMap.Load(pidKey) + PIDMap, ok := dumpPIDMap.Load(pidKey) + if !ok || PIDMap == nil { + return "", fmt.Errorf("tcpdump is not running") + } + pid, ok := PIDMap.(map[string]string)["pid"] if !ok || pid == "" { return "", fmt.Errorf("tcpdump is not running") } - defer dumpPIDMap.Delete(pidKey) - // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) // 命令拼装 @@ -117,12 +128,86 @@ func (s *TCPdump) DumpStop(neType, neId, taskCode string) (string, error) { // pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s cat tcpdump.log output, err := sshClient.RunCMD(sendCmd) if err != nil || strings.HasPrefix(output, "stderr:") { - logger.Warnf("DumpStop err: %s => %s", strings.TrimSpace(output), err.Error()) + logger.Errorf("DumpStop err: %s => %s", strings.TrimSpace(output), err.Error()) return "", err } + + s.logFileLastLineToFile(PIDMap.(map[string]string), sshClient) + dumpPIDMap.Delete(pidKey) return output, nil } +// logFileLastLine 日志文件最后行号 +func (s *TCPdump) logFileLastLine(neType string, sshClient *ssh.ConnSSH) map[string]string { + logFileArr := make([]string, 0) + mapFile := make(map[string]string, 0) + + // 存放文件目录 /var/log/xxx.log + if neType == "IMS" { + logFileArr = append(logFileArr, + "/var/log/ims/pcscf/pcscf.log", + "/var/log/ims/bgcf/bgcf.log", + "/var/log/ims/bsf/bsf.log", + "/var/log/ims/icscf/icscf.log", + "/var/log/ims/ismc/ismc.log", + "/var/log/ims/mmtel/mmtel.log", + "/var/log/ims/scscf/scscf.log", + "/var/log/ims/iwf/iwf.log", + ) + } else { + neLogFile := fmt.Sprintf("/var/log/%s.log", strings.ToLower(neType)) + logFileArr = append(logFileArr, neLogFile) + } + + for _, v := range logFileArr { + lastLine, err := sshClient.RunCMD(fmt.Sprintf("sed -n '$=' %s", v)) + lastLine = strings.TrimSpace(lastLine) + if err != nil || strings.HasPrefix(lastLine, "sed: can't") { + logger.Errorf("logFileLastLine err: %s => %s", lastLine, err.Error()) + continue + } + mapFile[v] = lastLine + } + return mapFile +} + +// logFileLastLine 日志文件最后行号 +func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string, sshClient *ssh.ConnSSH) error { + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + neType := PIDMap["neType"] + neId := PIDMap["neId"] + taskCode := PIDMap["taskCode"] + // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 + sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") + neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neType), neId, taskCode) + + lastLineMap := s.logFileLastLine(neType, sshClient) + for lastLogFile, lastFileLine := range lastLineMap { + for startLogFile, startFileLine := range PIDMap { + if lastLogFile == startLogFile && lastFileLine != "" { + if startFileLine == "" { + startFileLine = "1" // 起始行号从第一行开始 + } + outputFile := fmt.Sprintf("%s/%s", neDirTemp, filepath.Base(lastLogFile)) + sendCmd := fmt.Sprintf("sed -n \"%s,%sp\" \"%s\" > \"%s\"", startFileLine, lastFileLine, lastLogFile, outputFile) + // sed -n "1,5p" "/var/log/amf.log" > "/tmp/omc/tcpdump/amf/001/20241008141336/amf.log" + output, err := sshClient.RunCMD(sendCmd) + if err != nil || strings.HasPrefix(output, "stderr:") { + logger.Errorf("logFileLastLineToFile err: %s => %s", strings.TrimSpace(output), err.Error()) + continue + } + } + } + } + return nil +} + // DumpDownload 抓包文件网元端复制到本地输出zip文件 func (s *TCPdump) DumpDownload(neType, neId, taskCode string) (string, error) { // 查询网元获取IP From 4267c7df9d009d3d65ed99ab80749eb47d51caa7 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 8 Oct 2024 16:33:43 +0800 Subject: [PATCH 02/69] =?UTF-8?q?fix:=20=E7=BD=91=E5=85=83=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=8E=B7=E5=8F=96=E6=94=B9=E7=94=A8find=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E9=81=BF=E5=85=8DArgument=20list=20too=20long?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/ssh/files.go | 34 +++++++++++-------- .../network_element/controller/action.go | 16 ++++----- src/modules/trace/service/trace_task_hlr.go | 2 +- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/framework/utils/ssh/files.go b/src/framework/utils/ssh/files.go index d9d5f425..187d9c86 100644 --- a/src/framework/utils/ssh/files.go +++ b/src/framework/utils/ssh/files.go @@ -24,9 +24,8 @@ type FileListRow struct { // 文件列表 // search 文件名后模糊* // -// return 目录大小,行记录,异常 -func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, error) { - totalSize := "" +// return 行记录,异常 +func FileList(sshClient *ConnSSH, path, search string) ([]FileListRow, error) { var rows []FileListRow rowStr := "" @@ -35,40 +34,37 @@ func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, e if search != "" { searchStr = search + searchStr } - cmdStr := fmt.Sprintf("cd %s && ls -lthd --time-style=+%%s %s", path, searchStr) + // cd /var/log && find. -maxdepth 1 -name'mme*' -exec ls -lthd --time-style=+%s {} + + cmdStr := fmt.Sprintf("cd %s && find . -maxdepth 1 -name '%s' -exec ls -lthd --time-style=+%%s {} +", path, searchStr) + // cd /var/log && ls -lthd --time-style=+%s mme* + // cmdStr := fmt.Sprintf("cd %s && ls -lthd --time-style=+%%s %s", path, searchStr) // 是否远程客户端读取 if sshClient == nil { resultStr, err := cmd.Execf(cmdStr) if err != nil { logger.Errorf("Ne FileList Path: %s, Search: %s, Error:%s", path, search, err.Error()) - return totalSize, rows, err + return rows, err } rowStr = resultStr } else { resultStr, err := sshClient.RunCMD(cmdStr) if err != nil { logger.Errorf("Ne FileList Path: %s, Search: %s, Error:%s", path, search, err.Error()) - return totalSize, rows, err + return rows, err } rowStr = resultStr } // 遍历组装 rowStrList := strings.Split(rowStr, "\n") - for i, rowStr := range rowStrList { + for _, rowStr := range rowStrList { if rowStr == "" { continue } // 使用空格对字符串进行切割 fields := strings.Fields(rowStr) - // 无查询过滤会有total总计 - if i == 0 && searchStr == "" { - totalSize = fields[1] - continue - } - // 拆分不足7位跳过 if len(fields) != 7 { continue @@ -83,6 +79,14 @@ func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, e fileType = "symlink" } + // 文件名 + fileName := fields[6] + if fileName == "." { + continue + } else if strings.HasPrefix(fileName, "./") { + fileName = strings.TrimPrefix(fileName, "./") + } + // 提取各个字段的值 rows = append(rows, FileListRow{ FileMode: fileMode, @@ -92,8 +96,8 @@ func FileList(sshClient *ConnSSH, path, search string) (string, []FileListRow, e Group: fields[3], Size: fields[4], ModifiedTime: parse.Number(fields[5]), - FileName: fields[6], + FileName: fileName, }) } - return totalSize, rows, nil + return rows, nil } diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 9c44ca9d..0d121b7d 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -181,13 +181,12 @@ func (s *NeActionController) Files(c *gin.Context) { defer sshClient.Close() // 获取文件列表 - totalSize, rows, err := ssh.FileList(sshClient, querys.Path, querys.Search) + rows, err := ssh.FileList(sshClient, querys.Path, querys.Search) if err != nil { c.JSON(200, result.Ok(map[string]any{ - "path": querys.Path, - "totalSize": totalSize, - "total": len(rows), - "rows": []ssh.FileListRow{}, + "path": querys.Path, + "total": len(rows), + "rows": []ssh.FileListRow{}, })) return } @@ -206,10 +205,9 @@ func (s *NeActionController) Files(c *gin.Context) { } c.JSON(200, result.Ok(map[string]any{ - "path": querys.Path, - "totalSize": totalSize, - "total": lenNum, - "rows": splitRows, + "path": querys.Path, + "total": lenNum, + "rows": splitRows, })) } diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index 2cad7167..835f1c11 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -188,7 +188,7 @@ func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { // 获取文件列表 fileName := fmt.Sprintf("%s_%s", neInfo.NeName, traceId) - _, rows, err := ssh.FileList(sshClient, filepath.ToSlash(dirPath), fileName) + rows, err := ssh.FileList(sshClient, filepath.ToSlash(dirPath), fileName) if err != nil { hlrItem["err"] = "file not found" hlrList = append(hlrList, hlrItem) From 1a9cb04e9820b0a7fe3884b273a651d1596bc49b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 10:15:52 +0800 Subject: [PATCH 03/69] =?UTF-8?q?feat:=20=E7=BD=91=E5=85=83=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E6=94=AF=E6=8C=81SMSC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_element/service/ne_info.impl.go | 1 + src/modules/network_element/service/ne_version.go | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go index 0036dd75..9a12e47c 100644 --- a/src/modules/network_element/service/ne_info.impl.go +++ b/src/modules/network_element/service/ne_info.impl.go @@ -911,6 +911,7 @@ func (r *NeInfoImpl) neConfPara5GDataConvert(content map[string]any) map[string] "NEF_IP": sbi["nef_ip"].(string), "MME_IP": sbi["mme_ip"].(string), "N3IWF_IP": sbi["n3iwf_ip"].(string), + "SMSC_IP": sbi["smsc_ip"].(string), "DB_IP": sbi["db_ip"].(string), } diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index 198f3d5a..e064c70c 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -511,6 +511,18 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.160/%s/g\" /usr/local/etc/n3iwf/n3iwfcfg.yaml \n", para5GData["N6_IP"])) cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s n3iwf' /etc/hosts || echo '%s n3iwf' | sudo tee -a /etc/hosts \n", para5GData["N3IWF_IP"], para5GData["N3IWF_IP"])) } + // SMSC配置修改 + if neTypeLower == "smsc" { + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/mcms_conf.txt /usr/local/etc/smsc/mcms_conf.txt \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/sccp.conf /usr/local/etc/smsc/sccp.conf \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/smsc_config.yaml /usr/local/etc/smsc/smsc_config.yaml \n") + cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/smsc/default/wxc2_sys.conf /usr/local/etc/smsc/wxc2_sys.conf \n") + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.240/%s/g\" /usr/local/etc/smsc/mcms_conf.txt \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.240/%s/g\" /usr/local/etc/smsc/sccp.conf \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.1.123/%s/g\" /usr/local/etc/smsc/smsc_config.yaml \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/192.168.8.240/%s/g\" /usr/local/etc/smsc/wxc2_sys.conf \n", para5GData["SMSC_IP"])) + cmdStrArr = append(cmdStrArr, fmt.Sprintf("grep -qxF '%s smsc' /etc/hosts || echo '%s smsc' | sudo tee -a /etc/hosts \n", para5GData["SMSC_IP"], para5GData["SMSC_IP"])) + } cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo service %s restart \n", neTypeLower)) // 30s后停止服务 From 8616620b02c19492496661d75d1b1e4411a3b4d5 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 11:00:12 +0800 Subject: [PATCH 04/69] =?UTF-8?q?feat:=20=E5=9B=BE=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85SMSC=E7=BD=91=E5=85=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/common/chart_graph.sql | 94 +++-- src/modules/chart/chart.go | 6 +- src/modules/chart/controller/chart_graph.go | 6 +- src/modules/chart/model/chart_graph.go | 47 +-- src/modules/chart/repository/chart_graph.go | 203 +++++++++- .../chart/repository/chart_graph.impl.go | 194 ---------- src/modules/chart/service/chart_graph.go | 365 +++++++++++++++++- src/modules/chart/service/chart_graph.impl.go | 359 ----------------- 8 files changed, 617 insertions(+), 657 deletions(-) delete mode 100644 src/modules/chart/repository/chart_graph.impl.go delete mode 100644 src/modules/chart/service/chart_graph.impl.go diff --git a/database/common/chart_graph.sql b/database/common/chart_graph.sql index b0e29b3c..41a7f56c 100644 --- a/database/common/chart_graph.sql +++ b/database/common/chart_graph.sql @@ -1,11 +1,8 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) -- -- Table structure for table `chart_graph` -- DROP TABLE IF EXISTS `chart_graph`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; CREATE TABLE `chart_graph` ( `row_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', `row_type` enum('node','edge','combo') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '记录类型', @@ -31,8 +28,7 @@ CREATE TABLE `chart_graph` ( `label_cfg` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签文本-JSON配置', PRIMARY KEY (`row_id`) USING BTREE, KEY `idx_group` (`row_group`) USING BTREE COMMENT '组' -) ENGINE=InnoDB AUTO_INCREMENT=4321 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='图表-G6关系图数据'; -/*!40101 SET character_set_client = @saved_cs_client */; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='图表-G6关系图数据'; -- -- Dumping data for table `chart_graph` @@ -135,49 +131,51 @@ INSERT INTO `chart_graph` VALUES (2338, 'edge', '5GC System Architecture3', 'N3I INSERT INTO `chart_graph` VALUES (2339, 'edge', '5GC System Architecture3', 'LMF~1706173845506~lan', 'line', 0, 0, 0, '', '', '', '', '', 'LMF', 'lan', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); INSERT INTO `chart_graph` VALUES (2340, 'edge', '5GC System Architecture3', 'Base~1706176128676~MME', 'cubic-animate-circle-move', 0, 0, 0, '', '', '', '', '', 'Base', 'MME', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'S1-MME', '{\"autoRotate\":false,\"position\":\"end\",\"refX\":-15,\"refY\":-35,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); INSERT INTO `chart_graph` VALUES (2341, 'combo', '5GC System Architecture3', '5GC', 'rect', 10, 4.47597, -155.893, '[40,40]', '', '', '', '', '', '', '', '[40,40,40,40]', '', '[{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"IMS\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"NSSF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"UPF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"PCF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"SMF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"AMF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"UDM\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"AUSF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"NRF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"LMF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"NEF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"MME\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"N3IWF\",\"itemType\":\"node\"},{\"comboId\":\"5GC\",\"depth\":12,\"id\":\"lan\",\"itemType\":\"node\"}]', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"grab\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"fill\":\"#318c7d\",\"fillOpacity\":0.1,\"height\":325.169599,\"highlight\":{\"fill\":\"rgb(253, 253, 253)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(253, 253, 253)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"lineWidth\":1,\"r\":203.94142,\"radius\":2,\"selected\":{\"fill\":\"rgb(253, 253, 253)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\",\"width\":407.88284}', 'Core Network', '{\"position\":\"top\",\"refX\":10,\"refY\":10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4278, 'node', '5GC System Architecture', 'Base', 'image-animate-state', 0, -110, -30, '[60,50]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/base.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '(R)AN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4279, 'node', '5GC System Architecture', 'DN', 'image-animate-state', 0, 240, -30, '[60,60]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/earth3d-1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'DN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4280, 'node', '5GC System Architecture', 'OMC', 'image-animate-state', 0, 240, -330, '[60,60]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/omc62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#783636\"}', 'OMC', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4281, 'node', '5GC System Architecture', 'NR', 'image', 0, -153, -27, '[30,30]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lightning1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4282, 'node', '5GC System Architecture', 'IMS', 'image-animate-state', 11, 170, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ims62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f1212c\"}', 'IMS', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4283, 'node', '5GC System Architecture', 'NSSF', 'image-animate-state', 12, -110, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nssf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NSSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4284, 'node', '5GC System Architecture', 'UPF', 'image-animate-state', 13, 30, -30, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/upf6.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UPF', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4285, 'node', '5GC System Architecture', 'PCF', 'image-animate-state', 14, 100, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/pcf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'PCF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4286, 'node', '5GC System Architecture', 'UE', 'image', 14, -201.589, -29.622, '[64,64]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mobile.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'UE', '{\"offset\":-10,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4287, 'node', '5GC System Architecture', 'SMF', 'image-animate-state', 15, 30, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/smf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f0212c\"}', 'SMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4288, 'node', '5GC System Architecture', 'AMF', 'image-animate-state', 16, -110, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/amf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'AMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4289, 'node', '5GC System Architecture', 'AUSF', 'image-animate-state', 16, -180, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ausf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'AUSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4290, 'node', '5GC System Architecture', 'UDM', 'image-animate-state', 17, -40, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/udm62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UDM', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4291, 'node', '5GC System Architecture', 'NRF', 'image-animate-state', 19, 100, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nrf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NRF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4292, 'node', '5GC System Architecture', 'LMF', 'image-animate-state', 20, 170, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lmf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'LMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4293, 'node', '5GC System Architecture', 'NEF', 'image-animate-state', 21, 30, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nef62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NEF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4294, 'node', '5GC System Architecture', 'MME', 'image-animate-state', 22, -180, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mme62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'MME', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4295, 'node', '5GC System Architecture', 'N3IWF', 'image-animate-state', 23, -40, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/n3iwf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'N3IWF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4296, 'node', '5GC System Architecture', 'lan1', 'image', 24, -180, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f6f4f4\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4297, 'node', '5GC System Architecture', 'lan2', 'image', 24, -110, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f8f7f7\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4298, 'node', '5GC System Architecture', 'lan3', 'image', 24, -40, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4299, 'node', '5GC System Architecture', 'lan4', 'image', 24, 30, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4300, 'node', '5GC System Architecture', 'lan5', 'image', 24, 100, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4301, 'node', '5GC System Architecture', 'lan6', 'image', 24, 170, -195, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4302, 'node', '5GC System Architecture', 'lan7', 'image', 24, 240, -195, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4303, 'node', '5GC System Architecture', 'LAN', 'rect', 30, 30, -195, '[500,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '', '', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"#87cefa\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#87cefa\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4304, 'edge', '5GC System Architecture', 'NEF~1706494552592~lan5', 'line', 0, 0, 0, '', '', '', '', '', 'NEF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4305, 'edge', '5GC System Architecture', 'LMF~1706495015507~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'LMF', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4306, 'edge', '5GC System Architecture', 'OMC~1706495150020~lan7', 'polyline', 0, 0, 0, '', '', '', '', '', 'OMC', 'lan7', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4307, 'edge', '5GC System Architecture', 'AUSF~1706495243932~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'AUSF', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4308, 'edge', '5GC System Architecture', 'AMF~1706495271064~lan2', 'polyline', 0, 0, 0, '', '', '', '', '', 'AMF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4309, 'edge', '5GC System Architecture', 'NRF~1706495715971~lan3', 'polyline', 0, 0, 0, '', '', '', '', '', 'NRF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4310, 'edge', '5GC System Architecture', 'SMF~1706495739277~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'SMF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4311, 'edge', '5GC System Architecture', 'IMS~1706496047466~lan5', 'polyline', 0, 0, 0, '', '', '', '', '', 'IMS', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4312, 'edge', '5GC System Architecture', 'N3IWF~1706496082968~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'N3IWF', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4313, 'edge', '5GC System Architecture', 'RAN~1704534829539~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N3', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4314, 'edge', '5GC System Architecture', 'DN~1704534869360~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'UPF', 'DN', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N6', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4315, 'edge', '5GC System Architecture', 'SMF~1704765447548~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'SMF', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N4', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":3,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4316, 'edge', '5GC System Architecture', '5GC~1704764825481~Base', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'AMF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N2', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":-5,\"refY\":-2,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4317, 'edge', '5GC System Architecture', 'MME~1706492758830~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'MME', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4318, 'edge', '5GC System Architecture', 'UDM~1706493787944~lan2', 'line', 0, 0, 0, '', '', '', '', '', 'UDM', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4319, 'edge', '5GC System Architecture', 'PCF~1706494120334~lan3', 'line', 0, 0, 0, '', '', '', '', '', 'PCF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); -INSERT INTO `chart_graph` VALUES (4320, 'edge', '5GC System Architecture', 'NSSF~1706494145341~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'NSSF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4366, 'node', '5GC System Architecture', 'Base', 'image-animate-state', 0, -110, -30, '[60,50]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/base.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '(R)AN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4367, 'node', '5GC System Architecture', 'DN', 'image-animate-state', 0, 240, -30, '[60,60]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/earth3d-1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'DN', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4368, 'node', '5GC System Architecture', 'OMC', 'image-animate-state', 0, 238.846, -329.519, '[60,60]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/omc62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#783636\"}', 'OMC', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4369, 'node', '5GC System Architecture', 'NR', 'image', 0, -153, -27, '[30,30]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lightning1.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4370, 'node', '5GC System Architecture', 'IMS', 'image-animate-state', 11, 170, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ims62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f1212c\"}', 'IMS', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4371, 'node', '5GC System Architecture', 'SMSC', 'image-animate-state', 11, 238.918, -139.149, '[50,40]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/smsc.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'SMSC', '{\"offset\":0,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4372, 'node', '5GC System Architecture', 'NSSF', 'image-animate-state', 12, -110, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nssf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NSSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4373, 'node', '5GC System Architecture', 'UPF', 'image-animate-state', 13, 30, -30, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/upf6.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UPF', '{\"offset\":-5,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4374, 'node', '5GC System Architecture', 'PCF', 'image-animate-state', 14, 100, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/pcf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'PCF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4375, 'node', '5GC System Architecture', 'UE', 'image', 14, -201.589, -29.622, '[64,64]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mobile.svg', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'UE', '{\"offset\":-10,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4376, 'node', '5GC System Architecture', 'SMF', 'image-animate-state', 15, 30, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/smf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f0212c\"}', 'SMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4377, 'node', '5GC System Architecture', 'AMF', 'image-animate-state', 16, -110, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/amf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'AMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4378, 'node', '5GC System Architecture', 'AUSF', 'image-animate-state', 16, -180, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/ausf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'AUSF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4379, 'node', '5GC System Architecture', 'UDM', 'image-animate-state', 17, -40, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/udm62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'UDM', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4380, 'node', '5GC System Architecture', 'NRF', 'image-animate-state', 19, 100, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nrf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NRF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4381, 'node', '5GC System Architecture', 'LMF', 'image-animate-state', 20, 170, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lmf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'LMF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4382, 'node', '5GC System Architecture', 'NEF', 'image-animate-state', 21, 30, -260, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/nef62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'NEF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4383, 'node', '5GC System Architecture', 'MME', 'image-animate-state', 22, -180, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/mme62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'MME', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4384, 'node', '5GC System Architecture', 'N3IWF', 'image-animate-state', 23, -40, -130, '[60,50]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/n3iwf62.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#f5222d\"}', 'N3IWF', '{\"offset\":-15,\"position\":\"bottom\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":14,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4385, 'node', '5GC System Architecture', 'lan7', 'image', 24, 238.892, -195.039, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN7', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4386, 'node', '5GC System Architecture', 'lan1', 'image', 24, -180, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN1', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f6f4f4\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4387, 'node', '5GC System Architecture', 'lan2', 'image', 24, -110, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"transparent\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'LAN2', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#f8f7f7\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4388, 'node', '5GC System Architecture', 'lan3', 'image', 24, -40, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN3', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4389, 'node', '5GC System Architecture', 'lan4', 'image', 24, 30, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN4', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4390, 'node', '5GC System Architecture', 'lan5', 'image', 24, 100, -195, '[70,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN5', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4391, 'node', '5GC System Architecture', 'lan6', 'image', 24, 170, -195, '[70,10]', '{\"height\":25,\"img\":\"\",\"offset\":20,\"show\":false,\"width\":25}', '/svg/lan2.png', '{\"height\":0,\"show\":false,\"type\":\"circle\",\"width\":0}', '', '', '', '', '', '', '', '{\"cursor\":\"pointer\",\"fill\":\"transparent\",\"lineWidth\":1,\"radius\":4,\"stroke\":\"#ffffff\"}', 'LAN6', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#ffffff\",\"fontSize\":10,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4392, 'node', '5GC System Architecture', 'LAN', 'rect', 30, 30.0301, -195.517, '[500,10]', '{\"height\":25,\"img\":\"/svg/service.svg\",\"offset\":20,\"show\":false,\"width\":25}', '', '', '', '', '', '', '', '', '', '{\"active\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"fill\":\"rgb(250, 250, 250)\",\"lineWidth\":1,\"stroke\":\"rgb(224, 224, 224)\"},\"fill\":\"#87cefa\",\"highlight\":{\"fill\":\"rgb(223, 234, 255)\",\"lineWidth\":2,\"stroke\":\"#4572d9\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"fill\":\"rgb(247, 250, 255)\",\"lineWidth\":1,\"stroke\":\"rgb(191, 213, 255)\"},\"lineWidth\":1,\"radius\":4,\"selected\":{\"fill\":\"rgb(255, 255, 255)\",\"lineWidth\":4,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#87cefa\"}', '', '{\"offset\":0,\"position\":\"center\",\"style\":{\"fill\":\"#000000\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4393, 'edge', '5GC System Architecture', 'RAN~1704534829539~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N3', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4394, 'edge', '5GC System Architecture', 'N3IWF~1706496082968~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'N3IWF', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4395, 'edge', '5GC System Architecture', 'NEF~1706494552592~lan5', 'line', 0, 0, 0, '', '', '', '', '', 'NEF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4396, 'edge', '5GC System Architecture', 'LMF~1706495015507~lan6', 'polyline', 0, 0, 0, '', '', '', '', '', 'LMF', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4397, 'edge', '5GC System Architecture', 'OMC~1706495150020~lan7', 'polyline', 0, 0, 0, '', '', '', '', '', 'OMC', 'lan7', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4398, 'edge', '5GC System Architecture', 'AUSF~1706495243932~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'AUSF', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4399, 'edge', '5GC System Architecture', 'AMF~1706495271064~lan2', 'polyline', 0, 0, 0, '', '', '', '', '', 'AMF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4400, 'edge', '5GC System Architecture', 'NRF~1706495715971~lan3', 'polyline', 0, 0, 0, '', '', '', '', '', 'NRF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4401, 'edge', '5GC System Architecture', 'SMF~1706495739277~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'SMF', 'lan4', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4402, 'edge', '5GC System Architecture', 'IMS~1706496047466~lan5', 'polyline', 0, 0, 0, '', '', '', '', '', 'IMS', 'lan6', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4403, 'edge', '5GC System Architecture', 'DN~1704534869360~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'UPF', 'DN', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":5,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#7b68ee\"}', 'N6', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":-10,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4404, 'edge', '5GC System Architecture', 'SMF~1704765447548~UPF', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'SMF', 'UPF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N4', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":3,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4405, 'edge', '5GC System Architecture', '5GC~1704764825481~Base', 'line-animate-state', 0, 0, 0, '', '', '', '', '', 'Base', 'AMF', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', 'N2', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":-5,\"refY\":-2,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4406, 'edge', '5GC System Architecture', 'MME~1706492758830~lan1', 'polyline', 0, 0, 0, '', '', '', '', '', 'MME', 'lan1', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4407, 'edge', '5GC System Architecture', 'UDM~1706493787944~lan2', 'line', 0, 0, 0, '', '', '', '', '', 'UDM', 'lan3', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4408, 'edge', '5GC System Architecture', 'PCF~1706494120334~lan3', 'line', 0, 0, 0, '', '', '', '', '', 'PCF', 'lan5', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4409, 'edge', '5GC System Architecture', 'NSSF~1706494145341~lan4', 'polyline', 0, 0, 0, '', '', '', '', '', 'NSSF', 'lan2', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); +INSERT INTO `chart_graph` VALUES (4410, 'edge', '5GC System Architecture', 'SMSC~1728441658350~LAN', 'polyline', 0, 0, 0, '', '', '', '', '', 'SMSC', 'lan7', '', '', '', '', '{\"active\":{\"lineWidth\":1,\"stroke\":\"rgb(95, 149, 255)\"},\"cursor\":\"pointer\",\"disable\":{\"lineWidth\":1,\"stroke\":\"rgb(245, 245, 245)\"},\"highlight\":{\"lineWidth\":2,\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"inactive\":{\"lineWidth\":1,\"stroke\":\"rgb(234, 234, 234)\"},\"lineWidth\":2,\"offset\":20,\"radius\":2,\"selected\":{\"lineWidth\":2,\"shadowBlur\":10,\"shadowColor\":\"rgb(95, 149, 255)\",\"stroke\":\"rgb(95, 149, 255)\",\"text-shape\":{\"fontWeight\":500}},\"stroke\":\"#ffffff\"}', '', '{\"autoRotate\":false,\"position\":\"middle\",\"refX\":0,\"refY\":0,\"style\":{\"fill\":\"#ffffff\",\"fontSize\":12,\"fontWeight\":500}}'); UNLOCK TABLES; diff --git a/src/modules/chart/chart.go b/src/modules/chart/chart.go index d8079ceb..83455e2b 100644 --- a/src/modules/chart/chart.go +++ b/src/modules/chart/chart.go @@ -13,10 +13,8 @@ import ( func Setup(router *gin.Engine) { logger.Infof("开始加载 ====> chart 模块路由") - chartGroup := router.Group("/chart") - - // 关系图 - chartGraphGroup := chartGroup.Group("/graph") + // G6关系图 + chartGraphGroup := router.Group("/chart/graph") { chartGraphGroup.GET("", middleware.PreAuthorize(nil), diff --git a/src/modules/chart/controller/chart_graph.go b/src/modules/chart/controller/chart_graph.go index 89f6a4be..acad8af3 100644 --- a/src/modules/chart/controller/chart_graph.go +++ b/src/modules/chart/controller/chart_graph.go @@ -4,14 +4,14 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/vo/result" - chartService "be.ems/src/modules/chart/service" + "be.ems/src/modules/chart/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 ChartGraphController 结构体 var NewChartGraph = &ChartGraphController{ - chartGraphService: chartService.NewChartGraphImpl, + chartGraphService: service.NewChartGraph, } // G6关系图 @@ -19,7 +19,7 @@ var NewChartGraph = &ChartGraphController{ // PATH /graph type ChartGraphController struct { // G6关系图数据表服务 - chartGraphService chartService.IChartGraph + chartGraphService *service.ChartGraph } // 获取关系图组名 diff --git a/src/modules/chart/model/chart_graph.go b/src/modules/chart/model/chart_graph.go index 26dd8231..c087d3e2 100644 --- a/src/modules/chart/model/chart_graph.go +++ b/src/modules/chart/model/chart_graph.go @@ -1,31 +1,32 @@ package model -// ChartGraph G6关系图数据对象 chart_graph +// ChartGraph 图表-G6关系图数据对象 chart_graph type ChartGraph struct { RowID int64 `json:"rowId,omitempty" gorm:"column:row_id;primaryKey;autoIncrement"` // 记录ID - RowType string `json:"rowType,omitempty" gorm:"column:row_type"` // 记录类型(node/edge/combo) - RowGroup string `json:"rowGroup,omitempty" gorm:"column:row_group"` // 记录组名 - ID string `json:"id,omitempty" gorm:"column:id"` // 元素ID - Type string `json:"type,omitempty" gorm:"column:type"` // node/combo 类型 - Depth int `json:"depth,omitempty" gorm:"column:depth"` // node/combo 深度 - X float64 `json:"x,omitempty" gorm:"column:x"` // node/combo 横向坐标 - Y float64 `json:"y,omitempty" gorm:"column:y"` // node/combo 纵向坐标 - Size string `json:"size,omitempty" gorm:"column:size"` // node/combo 大小-JSON数组 - Icon string `json:"icon,omitempty" gorm:"column:icon"` // node-部分类型支持图标JSON配置 - Img string `json:"img,omitempty" gorm:"column:img"` // node-img 图片 - ClipCfg string `json:"clipCfg,omitempty" gorm:"column:clip_cfg"` // node-img 图片裁剪JSON配置 - Direction string `json:"direction,omitempty" gorm:"column:direction"` // node-triangle 三角形的方向(up/down/left/right) - Source string `json:"source,omitempty" gorm:"column:source"` // edge-边起始 - Target string `json:"target,omitempty" gorm:"column:target"` // edge-边目标 - ComboID string `json:"combo_id,omitempty" gorm:"column:combo_id"` // combo-分组 - Padding string `json:"padding,omitempty" gorm:"column:padding"` // combo-JSON分组内边距 - ParentID string `json:"parentId,omitempty" gorm:"column:parent_id"` // combo-父级分组 - Children string `json:"children,omitempty" gorm:"column:children"` // combo-JSON分组内含元素 - Style string `json:"style,omitempty" gorm:"column:style"` // 元素样式-JONS配置 - Label string `json:"label,omitempty" gorm:"column:label"` // 标签文本 - LabelCfg string `json:"labelCfg,omitempty" gorm:"column:label_cfg"` // 标签文本-JSON配置 + RowType string `json:"rowType" gorm:"row_type"` // 记录类型 + RowGroup string `json:"rowGroup" gorm:"row_group"` // 记录组名 + ID string `json:"id" gorm:"id"` // 元素ID + Type string `json:"type" gorm:"type"` // node/combo 类型 + Depth int64 `json:"depth" gorm:"depth"` // node/combo 深度 + X float64 `json:"x" gorm:"x"` // node/combo 横向坐标 + Y float64 `json:"y" gorm:"y"` // node/combo 纵向坐标 + Size string `json:"size" gorm:"size"` // node/combo 大小-JSON数组 + Icon string `json:"icon" gorm:"icon"` // node-部分类型支持图标JSON配置 + Img string `json:"img" gorm:"img"` // node-img 图片 + ClipCfg string `json:"clipCfg" gorm:"clip_cfg"` // node-img 图片裁剪JSON配置 + Direction string `json:"direction" gorm:"direction"` // node-triangle 三角形的方向 + Source string `json:"source" gorm:"source"` // edge-边起始 + Target string `json:"target" gorm:"target"` // edge-边目标 + ComboId string `json:"comboId" gorm:"combo_id"` // combo-分组 + Padding string `json:"padding" gorm:"padding"` // combo-JSON分组内边距 + ParentId string `json:"parentId" gorm:"parent_id"` // combo-父级分组 + Children string `json:"children" gorm:"children"` // combo-JSON分组内含元素 + Style string `json:"style" gorm:"style"` // 元素样式-JONS配置 + Label string `json:"label" gorm:"label"` // 标签文本 + LabelCfg string `json:"labelCfg" gorm:"label_cfg"` // 标签文本-JSON配置 } -func (ChartGraph) TableName() string { +// TableName 表名称 +func (*ChartGraph) TableName() string { return "chart_graph" } diff --git a/src/modules/chart/repository/chart_graph.go b/src/modules/chart/repository/chart_graph.go index 9d42eaa8..4d917e3c 100644 --- a/src/modules/chart/repository/chart_graph.go +++ b/src/modules/chart/repository/chart_graph.go @@ -1,21 +1,194 @@ package repository -import "be.ems/src/modules/chart/model" +import ( + "strings" -// G6关系图数据 数据层接口 -type IChartGraph interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/chart/model" +) - // SelectList 根据实体查询 - SelectList(graph model.ChartGraph) []model.ChartGraph +// 实例化数据层 ChartGraph 结构体 +var NewChartGraph = &ChartGraph{ + selectSql: `select + row_id, row_type, row_group, + id, type, depth, x, y, size, icon, img, + clip_cfg, direction, + source, target, combo_id, + padding, parent_id, children, + style, label, label_cfg + from chart_graph`, - // SelectGroup 查询组名 - SelectGroup() []string - - // Insert 批量添加 - Inserts(graphs []model.ChartGraph) int64 - - // Delete 删除组数据 - DeleteGroup(rowGroup string) int64 + resultMap: map[string]string{ + "row_id": "RowID", + "row_type": "RowType", + "row_group": "RowGroup", + "id": "ID", + "type": "Type", + "depth": "Depth", + "x": "X", + "y": "Y", + "size": "Size", + "icon": "Icon", + "img": "Img", + "clip_cfg": "ClipCfg", + "direction": "Direction", + "source": "Source", + "target": "Target", + "combo_id": "ComboID", + "padding": "Padding", + "parent_id": "ParentID", + "children": "Children", + "style": "Style", + "label": "Label", + "label_cfg": "LabelCfg", + }, +} + +// ChartGraph G6关系图数据表 数据层处理 +type ChartGraph struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *ChartGraph) convertResultRows(rows []map[string]any) []model.ChartGraph { + arr := make([]model.ChartGraph, 0) + for _, row := range rows { + item := model.ChartGraph{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *ChartGraph) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["rowType"]; ok && v != "" { + conditions = append(conditions, "row_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["rowGroup"]; ok && v != "" { + conditions = append(conditions, "row_group = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.ChartGraph{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from chart_graph" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *ChartGraph) SelectList(graph model.ChartGraph) []model.ChartGraph { + // 查询条件拼接 + var conditions []string + var params []any + if graph.RowType != "" { + conditions = append(conditions, "row_type = ?") + params = append(params, graph.RowType) + } + if graph.RowGroup != "" { + conditions = append(conditions, "row_group = ?") + params = append(params, graph.RowGroup) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by depth asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectGroup 查询组名 +func (r *ChartGraph) SelectGroup() []string { + rows := []string{} + // 查询数量 长度为0直接返回 + querySql := "select row_group as 'str' from chart_graph GROUP BY row_group" + strRows, err := datasource.RawDB("", querySql, nil) + if err != nil { + logger.Errorf("Query err => %v", err) + return rows + } + for _, v := range strRows { + rows = append(rows, v["str"].(string)) + } + return rows +} + +// Insert 批量添加 +func (r *ChartGraph) Inserts(graphs []model.ChartGraph) int64 { + tx := datasource.DefaultDB().CreateInBatches(graphs, 2000) + if err := tx.Error; err != nil { + logger.Errorf("CreateInBatches err => %v", err) + } + return tx.RowsAffected +} + +// Delete 删除组数据 +func (r *ChartGraph) DeleteGroup(rowGroup string) int64 { + tx := datasource.DefaultDB().Where("row_group = ?", rowGroup).Delete(&model.ChartGraph{}) + if err := tx.Error; err != nil { + logger.Errorf("Delete err => %v", err) + } + return tx.RowsAffected } diff --git a/src/modules/chart/repository/chart_graph.impl.go b/src/modules/chart/repository/chart_graph.impl.go deleted file mode 100644 index c3a26d5c..00000000 --- a/src/modules/chart/repository/chart_graph.impl.go +++ /dev/null @@ -1,194 +0,0 @@ -package repository - -import ( - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/chart/model" -) - -// 实例化数据层 NewChartGraphImpl 结构体 -var NewChartGraphImpl = &ChartGraphImpl{ - selectSql: `select - row_id, row_type, row_group, - id, type, depth, x, y, size, icon, img, - clip_cfg, direction, - source, target, combo_id, - padding, parent_id, children, - style, label, label_cfg - from chart_graph`, - - resultMap: map[string]string{ - "row_id": "RowID", - "row_type": "RowType", - "row_group": "RowGroup", - "id": "ID", - "type": "Type", - "depth": "Depth", - "x": "X", - "y": "Y", - "size": "Size", - "icon": "Icon", - "img": "Img", - "clip_cfg": "ClipCfg", - "direction": "Direction", - "source": "Source", - "target": "Target", - "combo_id": "ComboID", - "padding": "Padding", - "parent_id": "ParentID", - "children": "Children", - "style": "Style", - "label": "Label", - "label_cfg": "LabelCfg", - }, -} - -// ChartGraphImpl G6关系图数据表 数据层处理 -type ChartGraphImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *ChartGraphImpl) convertResultRows(rows []map[string]any) []model.ChartGraph { - arr := make([]model.ChartGraph, 0) - for _, row := range rows { - item := model.ChartGraph{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *ChartGraphImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["rowType"]; ok && v != "" { - conditions = append(conditions, "row_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["rowGroup"]; ok && v != "" { - conditions = append(conditions, "row_group = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.ChartGraph{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from chart_graph" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *ChartGraphImpl) SelectList(graph model.ChartGraph) []model.ChartGraph { - // 查询条件拼接 - var conditions []string - var params []any - if graph.RowType != "" { - conditions = append(conditions, "row_type = ?") - params = append(params, graph.RowType) - } - if graph.RowGroup != "" { - conditions = append(conditions, "row_group = ?") - params = append(params, graph.RowGroup) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by depth asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectGroup 查询组名 -func (r *ChartGraphImpl) SelectGroup() []string { - rows := []string{} - // 查询数量 长度为0直接返回 - querySql := "select row_group as 'str' from chart_graph GROUP BY row_group" - strRows, err := datasource.RawDB("", querySql, nil) - if err != nil { - logger.Errorf("Query err => %v", err) - return rows - } - for _, v := range strRows { - rows = append(rows, v["str"].(string)) - } - return rows -} - -// Insert 批量添加 -func (r *ChartGraphImpl) Inserts(graphs []model.ChartGraph) int64 { - tx := datasource.DefaultDB().CreateInBatches(graphs, 2000) - if err := tx.Error; err != nil { - logger.Errorf("CreateInBatches err => %v", err) - } - return tx.RowsAffected -} - -// Delete 删除组数据 -func (r *ChartGraphImpl) DeleteGroup(rowGroup string) int64 { - tx := datasource.DefaultDB().Where("row_group = ?", rowGroup).Delete(&model.ChartGraph{}) - if err := tx.Error; err != nil { - logger.Errorf("Delete err => %v", err) - } - return tx.RowsAffected -} diff --git a/src/modules/chart/service/chart_graph.go b/src/modules/chart/service/chart_graph.go index 470183d3..6eaf3cbd 100644 --- a/src/modules/chart/service/chart_graph.go +++ b/src/modules/chart/service/chart_graph.go @@ -1,16 +1,359 @@ package service -// G6关系图数据 服务层接口 -type IChartGraph interface { - // SelectGroup 查询组名 - SelectGroup() []string +import ( + "encoding/json" + "strings" - // LoadData 查询所组图数据 - LoadData(rowGroup, rowType string) map[string]any + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/chart/model" + "be.ems/src/modules/chart/repository" +) - // SaveData 添加组图数据 - SaveData(rowGroup string, data map[string]any) int64 - - // DeleteGroup 删除所组图数据 - DeleteGroup(rowGroup string) int64 +// 实例化服务层 ChartGraph 结构体 +var NewChartGraph = &ChartGraph{ + graphRepository: repository.NewChartGraph, +} + +// ChartGraph G6关系图数据表 服务层处理 +type ChartGraph struct { + // G6关系图数据服务 + graphRepository *repository.ChartGraph +} + +// SelectGroup 查询组名 +func (s *ChartGraph) SelectGroup() []string { + return s.graphRepository.SelectGroup() +} + +// LoadData 查询所组图数据 +func (s *ChartGraph) LoadData(rowGroup, rowType string) map[string]any { + // 查询数据 + graph := model.ChartGraph{ + RowGroup: rowGroup, + } + if rowType != "" { + graph.RowType = rowType + } + data := s.graphRepository.SelectList(graph) + + // 数据项 + nodes := []map[string]any{} + edges := []map[string]any{} + combos := []map[string]any{} + + for _, v := range data { + if v.RowType == "node" { + nodes = append(nodes, s.loadNode(v)) + } + if v.RowType == "edge" { + edges = append(edges, s.loadEdge(v)) + } + if v.RowType == "combo" { + combos = append(combos, s.loadCombo(v)) + } + } + + return map[string]any{ + "nodes": nodes, + "edges": edges, + "combos": combos, + } +} + +// loadNode 图数据Node +func (s *ChartGraph) loadNode(v model.ChartGraph) map[string]any { + node := map[string]any{ + "id": v.ID, + "comboId": v.ComboId, + "x": v.X, + "y": v.Y, + "type": v.Type, + "depth": v.Depth, + } + + // 元素样式 + style := map[string]any{} + if len(v.Style) > 7 { + json.Unmarshal([]byte(v.Style), &style) + } + node["style"] = style + + // 元素大小 + if strings.Contains(v.Size, "[") { + sizeArr := []int64{} + json.Unmarshal([]byte(v.Size), &sizeArr) + node["size"] = sizeArr + } else { + node["size"] = parse.Number(v.Size) + } + + // 标签文本 + node["label"] = v.Label + labelCfg := map[string]any{} + if len(v.LabelCfg) > 7 { + json.Unmarshal([]byte(v.LabelCfg), &labelCfg) + } + node["labelCfg"] = labelCfg + + // 三角形属性 + if v.Type == "triangle" { + node["direction"] = v.Direction + } + + // 图片属性 + if strings.Index(v.Type, "image") == 0 { + node["img"] = v.Img + clipCfg := map[string]any{} + if len(v.ClipCfg) > 7 { + json.Unmarshal([]byte(v.ClipCfg), &clipCfg) + } + node["clipCfg"] = clipCfg + } + + // 图标属性 + if v.Icon != "" { + icon := map[string]any{} + if len(v.Icon) > 7 { + json.Unmarshal([]byte(v.Icon), &icon) + } + node["icon"] = icon + } + + return node +} + +// loadEdge 图数据Edge +func (s *ChartGraph) loadEdge(v model.ChartGraph) map[string]any { + edge := map[string]any{ + "id": v.ID, + "source": v.Source, + "target": v.Target, + "type": v.Type, + } + + // 元素样式 + style := map[string]any{} + if len(v.Style) > 7 { + json.Unmarshal([]byte(v.Style), &style) + } + edge["style"] = style + + // 标签文本 + edge["label"] = v.Label + labelCfg := map[string]any{} + if len(v.LabelCfg) > 7 { + json.Unmarshal([]byte(v.LabelCfg), &labelCfg) + } + edge["labelCfg"] = labelCfg + + return edge +} + +// loadCombo 图数据Combo +func (s *ChartGraph) loadCombo(v model.ChartGraph) map[string]any { + combo := map[string]any{ + "id": v.ID, + "x": v.X, + "y": v.Y, + "type": v.Type, + "depth": v.Depth, + } + + // 元素样式 + style := map[string]any{} + if len(v.Style) > 7 { + json.Unmarshal([]byte(v.Style), &style) + } + combo["style"] = style + + // 元素大小 + if strings.Contains(v.Size, "[") { + sizeArr := []int64{} + json.Unmarshal([]byte(v.Size), &sizeArr) + combo["size"] = sizeArr + } else { + combo["size"] = parse.Number(v.Size) + } + + // 元素内边距 + if strings.Contains(v.Padding, "[") { + paddingArr := []int64{} + json.Unmarshal([]byte(v.Padding), &paddingArr) + combo["padding"] = paddingArr + } else { + combo["padding"] = parse.Number(v.Padding) + } + + // 标签文本 + combo["label"] = v.Label + labelCfg := map[string]any{} + if len(v.LabelCfg) > 7 { + json.Unmarshal([]byte(v.LabelCfg), &labelCfg) + } + combo["labelCfg"] = labelCfg + + // 分组内元素 + if v.Children != "" { + children := []map[string]any{} + if len(v.Children) > 7 { + json.Unmarshal([]byte(v.Children), &children) + } + combo["children"] = children + } + + return combo +} + +// SaveData 添加组图数据 +func (s *ChartGraph) SaveData(rowGroup string, data map[string]any) int64 { + graphs := []model.ChartGraph{} + nodes := data["nodes"].([]map[string]any) + graphNodes := s.saveNode(rowGroup, nodes) + graphs = append(graphs, graphNodes...) + edges := data["edges"].([]map[string]any) + graphEdges := s.saveEdge(rowGroup, edges) + graphs = append(graphs, graphEdges...) + combos := data["combos"].([]map[string]any) + graphCombos := s.saveCombo(rowGroup, combos) + graphs = append(graphs, graphCombos...) + // 删除组数据后插入 + if len(graphs) > 0 { + s.graphRepository.DeleteGroup(rowGroup) + } + return s.graphRepository.Inserts(graphs) +} + +// saveNode 图数据Node +func (s *ChartGraph) saveNode(rowGroup string, nodes []map[string]any) []model.ChartGraph { + var graphs []model.ChartGraph + for _, v := range nodes { + node := model.ChartGraph{ + RowType: "node", + RowGroup: rowGroup, + ID: v["id"].(string), + X: v["x"].(float64), + Y: v["y"].(float64), + Type: v["type"].(string), + } + if comboId, ok := v["comboId"]; ok && comboId != nil { + node.ComboId = comboId.(string) + } + if depth, ok := v["depth"]; ok && depth != nil { + node.Depth = int64(depth.(float64)) + } + if styleByte, err := json.Marshal(v["style"]); err == nil { + node.Style = string(styleByte) + } + + // 元素大小 + if sizeByte, err := json.Marshal(v["size"]); err == nil { + node.Size = string(sizeByte) + } + + // 标签文本 + if label, ok := v["label"]; ok && label != nil { + node.Label = label.(string) + } + if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { + node.LabelCfg = string(labelCfgByte) + } + // 三角形属性 + if direction, ok := v["direction"]; ok && direction != nil && node.Type == "triangle" { + node.Direction = direction.(string) + } + // 图片属性 + if img, ok := v["img"]; ok && img != nil { + node.Img = img.(string) + if clipCfgByte, err := json.Marshal(v["clipCfg"]); err == nil { + node.ClipCfg = string(clipCfgByte) + } + } + // 图标属性 + if icon, ok := v["icon"]; ok && icon != nil { + if iconByte, err := json.Marshal(icon); err == nil { + node.Icon = string(iconByte) + } + } + + graphs = append(graphs, node) + } + return graphs +} + +// saveEdge 图数据Edge +func (s *ChartGraph) saveEdge(rowGroup string, edges []map[string]any) []model.ChartGraph { + var graphs []model.ChartGraph + for _, v := range edges { + edge := model.ChartGraph{ + RowType: "edge", + RowGroup: rowGroup, + ID: v["id"].(string), + Source: v["source"].(string), + Target: v["target"].(string), + Type: v["type"].(string), + } + + if styleByte, err := json.Marshal(v["style"]); err == nil { + edge.Style = string(styleByte) + } + + // 标签文本 + if label, ok := v["label"]; ok && label != nil { + edge.Label = label.(string) + } + if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { + edge.LabelCfg = string(labelCfgByte) + } + + graphs = append(graphs, edge) + } + return graphs +} + +// saveCombo 图数据Combo +func (s *ChartGraph) saveCombo(rowGroup string, combos []map[string]any) []model.ChartGraph { + var graphs []model.ChartGraph + for _, v := range combos { + combo := model.ChartGraph{ + RowType: "combo", + RowGroup: rowGroup, + ID: v["id"].(string), + X: v["x"].(float64), + Y: v["y"].(float64), + Type: v["type"].(string), + } + if depth, ok := v["depth"]; ok && depth != nil { + combo.Depth = int64(depth.(float64)) + } + if styleByte, err := json.Marshal(v["style"]); err == nil { + combo.Style = string(styleByte) + } + if paddingByte, err := json.Marshal(v["padding"]); err == nil { + combo.Padding = string(paddingByte) + } + if childrenByte, err := json.Marshal(v["children"]); err == nil { + combo.Children = string(childrenByte) + } + + // 元素大小 + if sizeByte, err := json.Marshal(v["size"]); err == nil { + combo.Size = string(sizeByte) + } + + // 标签文本 + if label, ok := v["label"]; ok && label != nil { + combo.Label = label.(string) + } + if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { + combo.LabelCfg = string(labelCfgByte) + } + + graphs = append(graphs, combo) + } + return graphs +} + +// Delete 删除所组图数据 +func (s *ChartGraph) DeleteGroup(rowGroup string) int64 { + return s.graphRepository.DeleteGroup(rowGroup) } diff --git a/src/modules/chart/service/chart_graph.impl.go b/src/modules/chart/service/chart_graph.impl.go deleted file mode 100644 index 8244f752..00000000 --- a/src/modules/chart/service/chart_graph.impl.go +++ /dev/null @@ -1,359 +0,0 @@ -package service - -import ( - "strings" - - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/chart/model" - chartRepository "be.ems/src/modules/chart/repository" - "github.com/goccy/go-json" -) - -// 实例化服务层 ChartGraphImpl 结构体 -var NewChartGraphImpl = &ChartGraphImpl{ - graphRepository: chartRepository.NewChartGraphImpl, -} - -// ChartGraphImpl G6关系图数据表 服务层处理 -type ChartGraphImpl struct { - // G6关系图数据服务 - graphRepository chartRepository.IChartGraph -} - -// SelectGroup 查询组名 -func (s *ChartGraphImpl) SelectGroup() []string { - return s.graphRepository.SelectGroup() -} - -// LoadData 查询所组图数据 -func (s *ChartGraphImpl) LoadData(rowGroup, rowType string) map[string]any { - // 查询数据 - graph := model.ChartGraph{ - RowGroup: rowGroup, - } - if rowType != "" { - graph.RowType = rowType - } - data := s.graphRepository.SelectList(graph) - - // 数据项 - nodes := []map[string]any{} - edges := []map[string]any{} - combos := []map[string]any{} - - for _, v := range data { - if v.RowType == "node" { - nodes = append(nodes, s.loadNode(v)) - } - if v.RowType == "edge" { - edges = append(edges, s.loadEdge(v)) - } - if v.RowType == "combo" { - combos = append(combos, s.loadCombo(v)) - } - } - - return map[string]any{ - "nodes": nodes, - "edges": edges, - "combos": combos, - } -} - -// loadNode 图数据Node -func (s *ChartGraphImpl) loadNode(v model.ChartGraph) map[string]any { - node := map[string]any{ - "id": v.ID, - "comboId": v.ComboID, - "x": v.X, - "y": v.Y, - "type": v.Type, - "depth": v.Depth, - } - - // 元素样式 - style := map[string]any{} - if len(v.Style) > 7 { - json.Unmarshal([]byte(v.Style), &style) - } - node["style"] = style - - // 元素大小 - if strings.Contains(v.Size, "[") { - sizeArr := []int64{} - json.Unmarshal([]byte(v.Size), &sizeArr) - node["size"] = sizeArr - } else { - node["size"] = parse.Number(v.Size) - } - - // 标签文本 - node["label"] = v.Label - labelCfg := map[string]any{} - if len(v.LabelCfg) > 7 { - json.Unmarshal([]byte(v.LabelCfg), &labelCfg) - } - node["labelCfg"] = labelCfg - - // 三角形属性 - if v.Type == "triangle" { - node["direction"] = v.Direction - } - - // 图片属性 - if strings.Index(v.Type, "image") == 0 { - node["img"] = v.Img - clipCfg := map[string]any{} - if len(v.ClipCfg) > 7 { - json.Unmarshal([]byte(v.ClipCfg), &clipCfg) - } - node["clipCfg"] = clipCfg - } - - // 图标属性 - if v.Icon != "" { - icon := map[string]any{} - if len(v.Icon) > 7 { - json.Unmarshal([]byte(v.Icon), &icon) - } - node["icon"] = icon - } - - return node -} - -// loadEdge 图数据Edge -func (s *ChartGraphImpl) loadEdge(v model.ChartGraph) map[string]any { - edge := map[string]any{ - "id": v.ID, - "source": v.Source, - "target": v.Target, - "type": v.Type, - } - - // 元素样式 - style := map[string]any{} - if len(v.Style) > 7 { - json.Unmarshal([]byte(v.Style), &style) - } - edge["style"] = style - - // 标签文本 - edge["label"] = v.Label - labelCfg := map[string]any{} - if len(v.LabelCfg) > 7 { - json.Unmarshal([]byte(v.LabelCfg), &labelCfg) - } - edge["labelCfg"] = labelCfg - - return edge -} - -// loadCombo 图数据Combo -func (s *ChartGraphImpl) loadCombo(v model.ChartGraph) map[string]any { - combo := map[string]any{ - "id": v.ID, - "x": v.X, - "y": v.Y, - "type": v.Type, - "depth": v.Depth, - } - - // 元素样式 - style := map[string]any{} - if len(v.Style) > 7 { - json.Unmarshal([]byte(v.Style), &style) - } - combo["style"] = style - - // 元素大小 - if strings.Contains(v.Size, "[") { - sizeArr := []int64{} - json.Unmarshal([]byte(v.Size), &sizeArr) - combo["size"] = sizeArr - } else { - combo["size"] = parse.Number(v.Size) - } - - // 元素内边距 - if strings.Contains(v.Padding, "[") { - paddingArr := []int64{} - json.Unmarshal([]byte(v.Padding), &paddingArr) - combo["padding"] = paddingArr - } else { - combo["padding"] = parse.Number(v.Padding) - } - - // 标签文本 - combo["label"] = v.Label - labelCfg := map[string]any{} - if len(v.LabelCfg) > 7 { - json.Unmarshal([]byte(v.LabelCfg), &labelCfg) - } - combo["labelCfg"] = labelCfg - - // 分组内元素 - if v.Children != "" { - children := []map[string]any{} - if len(v.Children) > 7 { - json.Unmarshal([]byte(v.Children), &children) - } - combo["children"] = children - } - - return combo -} - -// SaveData 添加组图数据 -func (s *ChartGraphImpl) SaveData(rowGroup string, data map[string]any) int64 { - graphs := []model.ChartGraph{} - nodes := data["nodes"].([]map[string]any) - graphNodes := s.saveNode(rowGroup, nodes) - graphs = append(graphs, graphNodes...) - edges := data["edges"].([]map[string]any) - graphEdges := s.saveEdge(rowGroup, edges) - graphs = append(graphs, graphEdges...) - combos := data["combos"].([]map[string]any) - graphCombos := s.saveCombo(rowGroup, combos) - graphs = append(graphs, graphCombos...) - // 删除组数据后插入 - if len(graphs) > 0 { - s.graphRepository.DeleteGroup(rowGroup) - } - return s.graphRepository.Inserts(graphs) -} - -// saveNode 图数据Node -func (s *ChartGraphImpl) saveNode(rowGroup string, nodes []map[string]any) []model.ChartGraph { - var graphs []model.ChartGraph - for _, v := range nodes { - node := model.ChartGraph{ - RowType: "node", - RowGroup: rowGroup, - ID: v["id"].(string), - X: v["x"].(float64), - Y: v["y"].(float64), - Type: v["type"].(string), - } - if comboId, ok := v["comboId"]; ok && comboId != nil { - node.ComboID = comboId.(string) - } - if depth, ok := v["depth"]; ok && depth != nil { - node.Depth = int(depth.(float64)) - } - if styleByte, err := json.Marshal(v["style"]); err == nil { - node.Style = string(styleByte) - } - - // 元素大小 - if sizeByte, err := json.Marshal(v["size"]); err == nil { - node.Size = string(sizeByte) - } - - // 标签文本 - if label, ok := v["label"]; ok && label != nil { - node.Label = label.(string) - } - if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { - node.LabelCfg = string(labelCfgByte) - } - // 三角形属性 - if direction, ok := v["direction"]; ok && direction != nil && node.Type == "triangle" { - node.Direction = direction.(string) - } - // 图片属性 - if img, ok := v["img"]; ok && img != nil { - node.Img = img.(string) - if clipCfgByte, err := json.Marshal(v["clipCfg"]); err == nil { - node.ClipCfg = string(clipCfgByte) - } - } - // 图标属性 - if icon, ok := v["icon"]; ok && icon != nil { - if iconByte, err := json.Marshal(icon); err == nil { - node.Icon = string(iconByte) - } - } - - graphs = append(graphs, node) - } - return graphs -} - -// saveEdge 图数据Edge -func (s *ChartGraphImpl) saveEdge(rowGroup string, edges []map[string]any) []model.ChartGraph { - var graphs []model.ChartGraph - for _, v := range edges { - edge := model.ChartGraph{ - RowType: "edge", - RowGroup: rowGroup, - ID: v["id"].(string), - Source: v["source"].(string), - Target: v["target"].(string), - Type: v["type"].(string), - } - - if styleByte, err := json.Marshal(v["style"]); err == nil { - edge.Style = string(styleByte) - } - - // 标签文本 - if label, ok := v["label"]; ok && label != nil { - edge.Label = label.(string) - } - if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { - edge.LabelCfg = string(labelCfgByte) - } - - graphs = append(graphs, edge) - } - return graphs -} - -// saveCombo 图数据Combo -func (s *ChartGraphImpl) saveCombo(rowGroup string, combos []map[string]any) []model.ChartGraph { - var graphs []model.ChartGraph - for _, v := range combos { - combo := model.ChartGraph{ - RowType: "combo", - RowGroup: rowGroup, - ID: v["id"].(string), - X: v["x"].(float64), - Y: v["y"].(float64), - Type: v["type"].(string), - } - if depth, ok := v["depth"]; ok && depth != nil { - combo.Depth = int(depth.(float64)) - } - if styleByte, err := json.Marshal(v["style"]); err == nil { - combo.Style = string(styleByte) - } - if paddingByte, err := json.Marshal(v["padding"]); err == nil { - combo.Padding = string(paddingByte) - } - if childrenByte, err := json.Marshal(v["children"]); err == nil { - combo.Children = string(childrenByte) - } - - // 元素大小 - if sizeByte, err := json.Marshal(v["size"]); err == nil { - combo.Size = string(sizeByte) - } - - // 标签文本 - if label, ok := v["label"]; ok && label != nil { - combo.Label = label.(string) - } - if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil { - combo.LabelCfg = string(labelCfgByte) - } - - graphs = append(graphs, combo) - } - return graphs -} - -// Delete 删除所组图数据 -func (s *ChartGraphImpl) DeleteGroup(rowGroup string) int64 { - return s.graphRepository.DeleteGroup(rowGroup) -} From 7aae060f2e732901ac12becce3a64fce59576379 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 17:36:58 +0800 Subject: [PATCH 05/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0AMF=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/param/amf_param_config.yaml | 145 ++++++++++++++++++++++ database/common/ne_config.sql | 185 +++++++++++++++-------------- 2 files changed, 242 insertions(+), 88 deletions(-) diff --git a/config/param/amf_param_config.yaml b/config/param/amf_param_config.yaml index 011fad79..76d5751f 100644 --- a/config/param/amf_param_config.yaml +++ b/config/param/amf_param_config.yaml @@ -327,3 +327,148 @@ amf: filter: "^[A-Fa-f0-9]{6}" display: "SD" comment: "" + systemFeatOpt: + display: "System FeatOpt" + sort: 11 + list: + - name: "dnnCorrectionEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "dnnCorrectionEnabled" + comment: "" + - name: "gutiReallocationInPRUEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "gutiReallocationInPRUEnabled" + comment: "" + - name: "ueRadioCapabilityMatchEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "ueRadioCapabilityMatchEnabled" + comment: "" + - name: "supportFollowOnRequestIndication" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "supportFollowOnRequestIndication" + comment: "" + - name: "triggerInitCtxSetupForAllNASProc" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "triggerInitCtxSetupForAllNASProc" + comment: "" + - name: "supportAllAllowedNssai" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "supportAllAllowedNssai" + comment: "" + - name: "implicitUnsubscribeEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "implicitUnsubscribeEnabled" + comment: "" + - name: "supportRRCInactiveReport" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "supportRRCInactiveReport" + comment: "" + - name: "supportMappedSecurityContext" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "supportMappedSecurityContext" + comment: "" + - name: "optimizeSignalingProcedure" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "optimizeSignalingProcedure" + comment: "" + - name: "reAuthInServiceRequestProc" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "reAuthInServiceRequestProc" + comment: "" + - name: "skipGetSubscribedNssai" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "skipGetSubscribedNssai" + comment: "" + - name: "forceIdentityRequest" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "forceIdentityRequest" + comment: "" + - name: "cagEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "cagEnabled" + comment: "" + - name: "imeiRestrictionEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "imeiRestrictionEnabled" + comment: "" + - name: "checkSliceInTaEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "checkSliceInTaEnabled" + comment: "" + - name: "uePolicyEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "uePolicyEnabled" + comment: "" + - name: "smsOverNasEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "smsOverNasEnabled" + comment: "" + - name: "statusReportToOmc" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "statusReportToOmc" + comment: "" + - name: "statusReportEnabled" + type: "bool" + value: "0" + access: "read-write" + filter: '{"0":"false","1":"true"}' + display: "statusReportEnabled" + comment: "" + diff --git a/database/common/ne_config.sql b/database/common/ne_config.sql index de0d585e..a879fa84 100644 --- a/database/common/ne_config.sql +++ b/database/common/ne_config.sql @@ -5,9 +5,7 @@ SET FOREIGN_KEY_CHECKS = 0; -- Table structure for table `ne_config` -- - DROP TABLE IF EXISTS `ne_config`; - CREATE TABLE `ne_config` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', @@ -23,102 +21,113 @@ CREATE TABLE `ne_config` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_参数配置可用属性值'; -- 初始数据对应网元 -INSERT INTO `ne_config` VALUES (1, 'AMF', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]', 1, '', 1721705806656); -INSERT INTO `ne_config` VALUES (2, 'AMF', 'association', 'TNL Association List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]', 3, '', 1721705807645); -INSERT INTO `ne_config` VALUES (3, 'AMF', 'guami', 'GUAMI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1721705807721); -INSERT INTO `ne_config` VALUES (4, 'AMF', 'tai', 'TAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1721705807738); -INSERT INTO `ne_config` VALUES (5, 'AMF', 'slice', 'Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]', 9, '', 1721705807763); -INSERT INTO `ne_config` VALUES (6, 'AUSF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]', 1, '', 1719831209173); + +-- 更新 AMF 配置 202401009 +INSERT INTO `ne_config` VALUES (1, 'AMF', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]', 1, '', 1728460426869); +INSERT INTO `ne_config` VALUES (2, 'AMF', 'association', 'TNL Association List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]', 3, '', 1728460426881); +INSERT INTO `ne_config` VALUES (3, 'AMF', 'guami', 'GUAMI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1728460427137); +INSERT INTO `ne_config` VALUES (4, 'AMF', 'tai', 'TAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1728460427210); +INSERT INTO `ne_config` VALUES (5, 'AMF', 'slice', 'Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]', 9, '', 1728460427216); +INSERT INTO `ne_config` VALUES (6, 'AMF', 'systemFeatOpt', 'System FeatOpt', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dnnCorrectionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"gutiReallocationInPRUEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"gutiReallocationInPRUEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ueRadioCapabilityMatchEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"ueRadioCapabilityMatchEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportFollowOnRequestIndication\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportFollowOnRequestIndication\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"triggerInitCtxSetupForAllNASProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"triggerInitCtxSetupForAllNASProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportAllAllowedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportAllAllowedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"implicitUnsubscribeEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"implicitUnsubscribeEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportRRCInactiveReport\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportRRCInactiveReport\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportMappedSecurityContext\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportMappedSecurityContext\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"optimizeSignalingProcedure\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"optimizeSignalingProcedure\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"reAuthInServiceRequestProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"reAuthInServiceRequestProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"skipGetSubscribedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"skipGetSubscribedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"forceIdentityRequest\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"forceIdentityRequest\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"cagEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cagEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"imeiRestrictionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"checkSliceInTaEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"checkSliceInTaEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"uePolicyEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"uePolicyEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"smsOverNasEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"smsOverNasEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportToOmc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportToOmc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportEnabled\",\"type\":\"bool\",\"value\":\"0\"}]', 11, '', 1728460427221); + +INSERT INTO `ne_config` VALUES (20, 'AUSF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]', 1, '', 1719831209173); -- 更新 IMS 配置 20240815 -INSERT INTO `ne_config` VALUES (7, 'IMS', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]', 1, '', 1723716862092); -INSERT INTO `ne_config` VALUES (8, 'IMS', 'plmn', 'PLMN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~3\",\"display\":\"Index\",\"filter\":\"0~3\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 3, '', 1723716862107); -INSERT INTO `ne_config` VALUES (9, 'IMS', 'mmtel_dialplan', 'MMTEL Dialplan', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]', 5, '', 1723716862110); -INSERT INTO `ne_config` VALUES (10, 'IMS', 'ds_system', 'DS System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]', 7, '', 1723716862113); +INSERT INTO `ne_config` VALUES (40, 'IMS', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]', 1, '', 1723716862092); +INSERT INTO `ne_config` VALUES (41, 'IMS', 'plmn', 'PLMN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~3\",\"display\":\"Index\",\"filter\":\"0~3\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 3, '', 1723716862107); +INSERT INTO `ne_config` VALUES (42, 'IMS', 'mmtel_dialplan', 'MMTEL Dialplan', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]', 5, '', 1723716862110); +INSERT INTO `ne_config` VALUES (43, 'IMS', 'ds_system', 'DS System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]', 7, '', 1723716862113); -- 更新 MME 配置 20240906 -INSERT INTO `ne_config` VALUES (11, 'MME', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]', 1, '', 1725610815287); -INSERT INTO `ne_config` VALUES (12, 'MME', 'gummei', 'Gummei List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1725610815301); -INSERT INTO `ne_config` VALUES (13, 'MME', 'tai', 'TAI List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1725610815306); -INSERT INTO `ne_config` VALUES (14, 'MME', 'hss', 'HSS List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Realm\",\"filter\":\"0~128\",\"name\":\"hssRealm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]', 7, '', 1725610815311); -INSERT INTO `ne_config` VALUES (15, 'MME', 'sgw', 'SGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]', 9, '', 1725610815316); -INSERT INTO `ne_config` VALUES (16, 'MME', 'pgw', 'PGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]', 11, '', 1725610815320); -INSERT INTO `ne_config` VALUES (17, 'MME', 'amf', 'AMF List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]', 13, '', 1725610815323); +INSERT INTO `ne_config` VALUES (60, 'MME', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]', 1, '', 1725610815287); +INSERT INTO `ne_config` VALUES (61, 'MME', 'gummei', 'Gummei List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1725610815301); +INSERT INTO `ne_config` VALUES (62, 'MME', 'tai', 'TAI List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1725610815306); +INSERT INTO `ne_config` VALUES (63, 'MME', 'hss', 'HSS List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Realm\",\"filter\":\"0~128\",\"name\":\"hssRealm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]', 7, '', 1725610815311); +INSERT INTO `ne_config` VALUES (64, 'MME', 'sgw', 'SGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]', 9, '', 1725610815316); +INSERT INTO `ne_config` VALUES (65, 'MME', 'pgw', 'PGW List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]', 11, '', 1725610815320); +INSERT INTO `ne_config` VALUES (66, 'MME', 'amf', 'AMF List', 'array', '[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]', 13, '', 1725610815323); -INSERT INTO `ne_config` VALUES (18, 'MOCNGW', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]', 1, '', 1719831210071); -INSERT INTO `ne_config` VALUES (19, 'MOCNGW', 'mme', 'MME List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]', 3, '', 1719831210273); -INSERT INTO `ne_config` VALUES (20, 'MOCNGW', 'upgw', 'UPGW Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]', 5, '', 1719831210320); -INSERT INTO `ne_config` VALUES (21, 'N3IWF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]', 1, '', 1719831210358); -INSERT INTO `ne_config` VALUES (22, 'NRF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, 'put', 1719831210397); -INSERT INTO `ne_config` VALUES (23, 'NRF', 'registeredNFs', 'Registered NFs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]', 3, 'get', 1719831210443); -INSERT INTO `ne_config` VALUES (24, 'NSSF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]', 1, '', 1719831210478); -INSERT INTO `ne_config` VALUES (25, 'NSSF', 'sbi', 'SBI', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]', 3, '', 1719831210567); -INSERT INTO `ne_config` VALUES (26, 'NSSF', 'supportedNetworkSliceList', 'Supported Network Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210617); -INSERT INTO `ne_config` VALUES (27, 'NSSF', 'plmnMappingList', 'PLMN Mapping List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1719831210699); -INSERT INTO `ne_config` VALUES (28, 'PCF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]', 1, '', 1719831210756); -INSERT INTO `ne_config` VALUES (29, 'PCF', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1719831210789); -INSERT INTO `ne_config` VALUES (30, 'PCF', 'pccRules', 'PCC Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210834); -INSERT INTO `ne_config` VALUES (31, 'PCF', 'sessionRules', 'Session Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831210893); -INSERT INTO `ne_config` VALUES (32, 'PCF', 'gxServer', 'Gx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 9, '', 1719831210965); -INSERT INTO `ne_config` VALUES (33, 'PCF', 'rxServer', 'Rx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 11, '', 1719831211004); -INSERT INTO `ne_config` VALUES (34, 'PCF', 'flowTemplate', 'Flow Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831211185); -INSERT INTO `ne_config` VALUES (35, 'PCF', 'qosTemplate', 'QoS Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]', 15, '', 1719831211267); -INSERT INTO `ne_config` VALUES (36, 'PCF', 'usageMonitoringTemplate', 'Usage Monitoring Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1719831211321); -INSERT INTO `ne_config` VALUES (37, 'PCF', 'trafficControlTemplate', 'Traffic Control Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1719831211361); -INSERT INTO `ne_config` VALUES (38, 'PCF', 'headerEnrichTemplate', 'Header Enrich Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]', 21, '', 1719831211407); -INSERT INTO `ne_config` VALUES (39, 'SMF', 'smfSystem', 'SMF System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]', 1, '', 1719831211449); -INSERT INTO `ne_config` VALUES (40, 'SMF', 'spgwSystem', 'SPGW Sytem Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]', 3, '', 1719831211498); -INSERT INTO `ne_config` VALUES (41, 'SMF', 'upfConfig', 'UPF Config', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]', 5, '', 1719831211547); -INSERT INTO `ne_config` VALUES (42, 'SMF', 'dnnSelectUpf', 'DNN Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831211647); -INSERT INTO `ne_config` VALUES (43, 'SMF', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]', 9, '', 1719831211733); -INSERT INTO `ne_config` VALUES (44, 'SMF', 'snssaiSelectUpf', 'SNSSAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]', 11, '', 1719831211854); -INSERT INTO `ne_config` VALUES (45, 'SMF', 'offlineChargingConfig', 'Offline Charging Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"1~64\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"1~256\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]', 13, '', 1719831211901); -INSERT INTO `ne_config` VALUES (49, 'UDM', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]', 1, '', 1719831212399); -INSERT INTO `ne_config` VALUES (50, 'UDM', 'subsUEAmbr', 'Subs UE AMBR', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]', 3, '', 1719831212494); -INSERT INTO `ne_config` VALUES (51, 'UDM', 'subsNssais', 'Subs NSSAIs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]', 5, '', 1719831212590); -INSERT INTO `ne_config` VALUES (52, 'UDM', 'forbiddenAreas', 'Forbidden Areas', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]', 7, '', 1719831212718); -INSERT INTO `ne_config` VALUES (53, 'UDM', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 9, '', 1719831212824); -INSERT INTO `ne_config` VALUES (54, 'UDM', 'smfSelection', 'Subs SMF Selection', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]', 11, '', 1719831212979); -INSERT INTO `ne_config` VALUES (55, 'UDM', 'dnn', 'DNN Conf', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831213074); -INSERT INTO `ne_config` VALUES (56, 'UDM', 'epsTemplate', 'EPS User Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 15, '', 1719831213203); -INSERT INTO `ne_config` VALUES (57, 'UDM', 'epsApn', 'EPS APN', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 17, '', 1719831213410); -INSERT INTO `ne_config` VALUES (58, 'UDM', 'applicationServer', 'Application Server', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]', 19, '', 1719831213536); -INSERT INTO `ne_config` VALUES (59, 'UDM', 'scscfSet', 'SCSCF Set', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]', 21, '', 1719831213732); -INSERT INTO `ne_config` VALUES (60, 'UDM', 'triggerPoint', 'Trigger Point', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]', 23, '', 1719831213924); -INSERT INTO `ne_config` VALUES (61, 'UDM', 's6aServer', 'S6a Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 25, '', 1719831214313); -INSERT INTO `ne_config` VALUES (62, 'UDM', 'cxServer', 'Cx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 27, '', 1719831214393); -INSERT INTO `ne_config` VALUES (63, 'UPF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]', 1, '', 1721705770725); -INSERT INTO `ne_config` VALUES (64, 'UPF', 'logger', 'Logger', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]', 3, '', 1721705772689); -INSERT INTO `ne_config` VALUES (65, 'UPF', 'pfcp', 'PFCP', 'list', '[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]', 5, '', 1721705772791); -INSERT INTO `ne_config` VALUES (66, 'UPF', 'telnet', 'Telnet', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]', 7, '', 1721705772939); -INSERT INTO `ne_config` VALUES (67, 'UPF', 'redisDb', 'Redis DB', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]', 9, '', 1721705773069); -INSERT INTO `ne_config` VALUES (68, 'UPF', 'dataForwarderCommon', 'Data Forwarder Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]', 11, '', 1721705773160); -INSERT INTO `ne_config` VALUES (69, 'UPF', 'dataForwarderUpfd', 'Data Forwarder Upfd', 'list', '[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]', 13, '', 1721705774027); -INSERT INTO `ne_config` VALUES (70, 'UPF', 'dataInterfaceList', 'Data Interface List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]', 15, '', 1721705774222); -INSERT INTO `ne_config` VALUES (71, 'UPF', 'networkControlCommon', 'Network Control Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1721705774271); -INSERT INTO `ne_config` VALUES (72, 'UPF', 'networkControlDnnList', 'Network Control DNN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1721705774430); -INSERT INTO `ne_config` VALUES (73, 'UPF', 'networkControlSnssaiList', 'Network Control SNSSAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]', 21, '', 1721705774453); -INSERT INTO `ne_config` VALUES (74, 'UPF', 'networkControlAclWhiteList', 'Network Control ACL White List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 23, '', 1721705774471); -INSERT INTO `ne_config` VALUES (75, 'UPF', 'networkControlAclBlackList', 'Network Control ACL Black List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 25, '', 1721705774488); -INSERT INTO `ne_config` VALUES (76, 'UPF', 'networkControlDnsServerList', 'Network Control DNS Server List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]', 27, '', 1721705774492); -INSERT INTO `ne_config` VALUES (77, 'UPF', 'dpiCommon', 'DPI Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]', 29, '', 1721705774496); -INSERT INTO `ne_config` VALUES (78, 'UPF', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]', 31, '', 1721705774501); -INSERT INTO `ne_config` VALUES (79, 'UPF', 'dpiAppList', 'DPI APP List', 'array', '[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]', 33, '', 1721705774505); +INSERT INTO `ne_config` VALUES (80, 'MOCNGW', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]', 1, '', 1719831210071); +INSERT INTO `ne_config` VALUES (81, 'MOCNGW', 'mme', 'MME List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]', 3, '', 1719831210273); +INSERT INTO `ne_config` VALUES (82, 'MOCNGW', 'upgw', 'UPGW Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]', 5, '', 1719831210320); + +INSERT INTO `ne_config` VALUES (100, 'N3IWF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]', 1, '', 1719831210358); + +INSERT INTO `ne_config` VALUES (120, 'NRF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, 'put', 1719831210397); +INSERT INTO `ne_config` VALUES (121, 'NRF', 'registeredNFs', 'Registered NFs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]', 3, 'get', 1719831210443); + +INSERT INTO `ne_config` VALUES (140, 'NSSF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]', 1, '', 1719831210478); +INSERT INTO `ne_config` VALUES (141, 'NSSF', 'sbi', 'SBI', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]', 3, '', 1719831210567); +INSERT INTO `ne_config` VALUES (142, 'NSSF', 'supportedNetworkSliceList', 'Supported Network Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210617); +INSERT INTO `ne_config` VALUES (143, 'NSSF', 'plmnMappingList', 'PLMN Mapping List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1719831210699); + +INSERT INTO `ne_config` VALUES (160, 'PCF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]', 1, '', 1719831210756); +INSERT INTO `ne_config` VALUES (161, 'PCF', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 3, '', 1719831210789); +INSERT INTO `ne_config` VALUES (162, 'PCF', 'pccRules', 'PCC Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]', 5, '', 1719831210834); +INSERT INTO `ne_config` VALUES (163, 'PCF', 'sessionRules', 'Session Rules', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831210893); +INSERT INTO `ne_config` VALUES (164, 'PCF', 'gxServer', 'Gx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 9, '', 1719831210965); +INSERT INTO `ne_config` VALUES (165, 'PCF', 'rxServer', 'Rx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 11, '', 1719831211004); +INSERT INTO `ne_config` VALUES (166, 'PCF', 'flowTemplate', 'Flow Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831211185); +INSERT INTO `ne_config` VALUES (167, 'PCF', 'qosTemplate', 'QoS Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]', 15, '', 1719831211267); +INSERT INTO `ne_config` VALUES (168, 'PCF', 'usageMonitoringTemplate', 'Usage Monitoring Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1719831211321); +INSERT INTO `ne_config` VALUES (169, 'PCF', 'trafficControlTemplate', 'Traffic Control Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1719831211361); +INSERT INTO `ne_config` VALUES (170, 'PCF', 'headerEnrichTemplate', 'Header Enrich Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]', 21, '', 1719831211407); + +INSERT INTO `ne_config` VALUES (180, 'SMF', 'smfSystem', 'SMF System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]', 1, '', 1719831211449); +INSERT INTO `ne_config` VALUES (181, 'SMF', 'spgwSystem', 'SPGW Sytem Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]', 3, '', 1719831211498); +INSERT INTO `ne_config` VALUES (182, 'SMF', 'upfConfig', 'UPF Config', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]', 5, '', 1719831211547); +INSERT INTO `ne_config` VALUES (183, 'SMF', 'dnnSelectUpf', 'DNN Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]', 7, '', 1719831211647); +INSERT INTO `ne_config` VALUES (184, 'SMF', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]', 9, '', 1719831211733); +INSERT INTO `ne_config` VALUES (185, 'SMF', 'snssaiSelectUpf', 'SNSSAI Select UPF', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]', 11, '', 1719831211854); +INSERT INTO `ne_config` VALUES (186, 'SMF', 'offlineChargingConfig', 'Offline Charging Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"1~64\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"1~256\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]', 13, '', 1719831211901); + +INSERT INTO `ne_config` VALUES (200, 'UDM', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]', 1, '', 1719831212399); +INSERT INTO `ne_config` VALUES (201, 'UDM', 'subsUEAmbr', 'Subs UE AMBR', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]', 3, '', 1719831212494); +INSERT INTO `ne_config` VALUES (202, 'UDM', 'subsNssais', 'Subs NSSAIs', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]', 5, '', 1719831212590); +INSERT INTO `ne_config` VALUES (203, 'UDM', 'forbiddenAreas', 'Forbidden Areas', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]', 7, '', 1719831212718); +INSERT INTO `ne_config` VALUES (204, 'UDM', 'serviceAreaRestriction', 'Service Area Restriction', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]', 9, '', 1719831212824); +INSERT INTO `ne_config` VALUES (205, 'UDM', 'smfSelection', 'Subs SMF Selection', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]', 11, '', 1719831212979); +INSERT INTO `ne_config` VALUES (206, 'UDM', 'dnn', 'DNN Conf', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]', 13, '', 1719831213074); +INSERT INTO `ne_config` VALUES (207, 'UDM', 'epsTemplate', 'EPS User Template', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 15, '', 1719831213203); +INSERT INTO `ne_config` VALUES (208, 'UDM', 'epsApn', 'EPS APN', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]', 17, '', 1719831213410); +INSERT INTO `ne_config` VALUES (209, 'UDM', 'applicationServer', 'Application Server', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]', 19, '', 1719831213536); +INSERT INTO `ne_config` VALUES (210, 'UDM', 'scscfSet', 'SCSCF Set', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]', 21, '', 1719831213732); +INSERT INTO `ne_config` VALUES (211, 'UDM', 'triggerPoint', 'Trigger Point', 'array', '[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]', 23, '', 1719831213924); +INSERT INTO `ne_config` VALUES (212, 'UDM', 's6aServer', 'S6a Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 25, '', 1719831214313); +INSERT INTO `ne_config` VALUES (213, 'UDM', 'cxServer', 'Cx Server', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]', 27, '', 1719831214393); + +INSERT INTO `ne_config` VALUES (220, 'UPF', 'general', 'General', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]', 1, '', 1721705770725); +INSERT INTO `ne_config` VALUES (221, 'UPF', 'logger', 'Logger', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]', 3, '', 1721705772689); +INSERT INTO `ne_config` VALUES (222, 'UPF', 'pfcp', 'PFCP', 'list', '[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]', 5, '', 1721705772791); +INSERT INTO `ne_config` VALUES (223, 'UPF', 'telnet', 'Telnet', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]', 7, '', 1721705772939); +INSERT INTO `ne_config` VALUES (224, 'UPF', 'redisDb', 'Redis DB', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]', 9, '', 1721705773069); +INSERT INTO `ne_config` VALUES (225, 'UPF', 'dataForwarderCommon', 'Data Forwarder Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]', 11, '', 1721705773160); +INSERT INTO `ne_config` VALUES (226, 'UPF', 'dataForwarderUpfd', 'Data Forwarder Upfd', 'list', '[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]', 13, '', 1721705774027); +INSERT INTO `ne_config` VALUES (227, 'UPF', 'dataInterfaceList', 'Data Interface List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]', 15, '', 1721705774222); +INSERT INTO `ne_config` VALUES (228, 'UPF', 'networkControlCommon', 'Network Control Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]', 17, '', 1721705774271); +INSERT INTO `ne_config` VALUES (229, 'UPF', 'networkControlDnnList', 'Network Control DNN List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]', 19, '', 1721705774430); +INSERT INTO `ne_config` VALUES (230, 'UPF', 'networkControlSnssaiList', 'Network Control SNSSAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]', 21, '', 1721705774453); +INSERT INTO `ne_config` VALUES (231, 'UPF', 'networkControlAclWhiteList', 'Network Control ACL White List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 23, '', 1721705774471); +INSERT INTO `ne_config` VALUES (232, 'UPF', 'networkControlAclBlackList', 'Network Control ACL Black List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]', 25, '', 1721705774488); +INSERT INTO `ne_config` VALUES (233, 'UPF', 'networkControlDnsServerList', 'Network Control DNS Server List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]', 27, '', 1721705774492); +INSERT INTO `ne_config` VALUES (234, 'UPF', 'dpiCommon', 'DPI Common', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]', 29, '', 1721705774496); +INSERT INTO `ne_config` VALUES (235, 'UPF', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', 'array', '[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]', 31, '', 1721705774501); +INSERT INTO `ne_config` VALUES (236, 'UPF', 'dpiAppList', 'DPI APP List', 'array', '[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]', 33, '', 1721705774505); -- 更新 CBC 配置 20240823 -INSERT INTO `ne_config` VALUES (80, 'CBC', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CBC Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"CBC\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Instance\",\"filter\":\"0~64\",\"name\":\"instance\",\"type\":\"string\",\"value\":\"CBC-001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiIp\",\"type\":\"string\",\"value\":\"127.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"9090\"},{\"access\":\"read-write\",\"comment\":\"http or https\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, '', 1724327154483); -INSERT INTO `ne_config` VALUES (81, 'CBC', 'amfProfile', 'AMF Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 3, '', 1724327154499); -INSERT INTO `ne_config` VALUES (82, 'CBC', 'mmeProfile', 'MME Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 5, '', 1724327154504); +INSERT INTO `ne_config` VALUES (240, 'CBC', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CBC Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"CBC\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Instance\",\"filter\":\"0~64\",\"name\":\"instance\",\"type\":\"string\",\"value\":\"CBC-001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiIp\",\"type\":\"string\",\"value\":\"127.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"9090\"},{\"access\":\"read-write\",\"comment\":\"http or https\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"}]', 1, '', 1724327154483); +INSERT INTO `ne_config` VALUES (241, 'CBC', 'amfProfile', 'AMF Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 3, '', 1724327154499); +INSERT INTO `ne_config` VALUES (242, 'CBC', 'mmeProfile', 'MME Profile', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"MME\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MME URI\",\"filter\":\"0~64\",\"name\":\"uri\",\"type\":\"string\",\"value\":\"sctp://192.168.1.1:9090\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 5, '', 1724327154504); -- OMC parameter config -INSERT INTO `ne_config` VALUES (83, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1725505025649); -INSERT INTO `ne_config` VALUES (84, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1727664057261); +INSERT INTO `ne_config` VALUES (260, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1725505025649); +INSERT INTO `ne_config` VALUES (261, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1727664057261); -- 更新 SMSC 配置 20240920 -INSERT INTO `ne_config` VALUES (90, 'SMSC', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"If add plus then set false\",\"display\":\"MT Id Format Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mtIdFormatFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"enable mcast sms\",\"display\":\"Mcast Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mcastFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"{\\\"0\\\":\\\"none\\\",\\\"1\\\":\\\"error\\\",\\\"2\\\":\\\"debug\\\"}\",\"name\":\"logLevel\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The MB sizeof log file\",\"display\":\"Log Size\",\"filter\":\"1-1000\",\"name\":\"logSize\",\"type\":\"int\",\"value\":\"200\"},{\"access\":\"read-write\",\"comment\":\"The number of log file\",\"display\":\"Log Number\",\"filter\":\"1-20\",\"name\":\"logNum\",\"type\":\"int\",\"value\":\"10\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Directory\",\"filter\":\"0~128\",\"name\":\"logDir\",\"type\":\"string\",\"value\":\"/var/log/\"}]', 1, '', 1726802301029); -INSERT INTO `ne_config` VALUES (91, 'SMSC', 'msisdnsegment', 'MSISDN Segment List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]', 3, 'put', 1726802301041); -INSERT INTO `ne_config` VALUES (92, 'SMSC', 'smpplink', 'SMPP Link List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]', 5, 'post,delete', 1726802301049); -INSERT INTO `ne_config` VALUES (93, 'SMSC', 'convprefix', 'Conv Prefix List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~127\",\"display\":\"Index\",\"filter\":\"0~127\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~16\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Delete Length\",\"filter\":\"0-16\",\"name\":\"deleteLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Length\",\"filter\":\"0-16\",\"name\":\"addLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Digits\",\"filter\":\"0~16\",\"name\":\"addDigits\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Length\",\"filter\":\"0-32\",\"name\":\"numberLength\",\"type\":\"int\",\"value\":\"0\"}]', 7, 'post,delete', 1726802301054); -INSERT INTO `ne_config` VALUES (94, 'SMSC', 'smppparam', 'SMPP Param List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~31\",\"display\":\"Index\",\"filter\":\"0~31\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0-8\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"udp\\\",\\\"1\\\":\\\"tcp\\\"}\",\"name\":\"linkType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Type\",\"filter\":\"{\\\"0\\\":\\\"client\\\",\\\"1\\\":\\\"server\\\"}\",\"name\":\"serverType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"0-16\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"0-8\",\"name\":\"password\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"0-12\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local GTT\",\"filter\":\"0-16\",\"name\":\"localGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote GTT\",\"filter\":\"0-16\",\"name\":\"remoteGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IP\",\"filter\":\"0-32\",\"name\":\"localIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote IP\",\"filter\":\"0-32\",\"name\":\"remoteIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Init Timer\",\"filter\":\"0-65535\",\"name\":\"sessionInitTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enquire Link Timer\",\"filter\":\"0-65535\",\"name\":\"enquireLinkTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Timer\",\"filter\":\"0-65535\",\"name\":\"inactivityTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Response Timer\",\"filter\":\"0-65535\",\"name\":\"responseTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local SSN\",\"filter\":\"0-255\",\"name\":\"localSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote SSN\",\"filter\":\"0-255\",\"name\":\"remoteSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"1\"}]', 9, 'put', 1726802301058); +INSERT INTO `ne_config` VALUES (280, 'SMSC', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"If add plus then set false\",\"display\":\"MT Id Format Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mtIdFormatFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"enable mcast sms\",\"display\":\"Mcast Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mcastFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"{\\\"0\\\":\\\"none\\\",\\\"1\\\":\\\"error\\\",\\\"2\\\":\\\"debug\\\"}\",\"name\":\"logLevel\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The MB sizeof log file\",\"display\":\"Log Size\",\"filter\":\"1-1000\",\"name\":\"logSize\",\"type\":\"int\",\"value\":\"200\"},{\"access\":\"read-write\",\"comment\":\"The number of log file\",\"display\":\"Log Number\",\"filter\":\"1-20\",\"name\":\"logNum\",\"type\":\"int\",\"value\":\"10\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Directory\",\"filter\":\"0~128\",\"name\":\"logDir\",\"type\":\"string\",\"value\":\"/var/log/\"}]', 1, '', 1726802301029); +INSERT INTO `ne_config` VALUES (281, 'SMSC', 'msisdnsegment', 'MSISDN Segment List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]', 3, 'put', 1726802301041); +INSERT INTO `ne_config` VALUES (282, 'SMSC', 'smpplink', 'SMPP Link List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]', 5, 'post,delete', 1726802301049); +INSERT INTO `ne_config` VALUES (283, 'SMSC', 'convprefix', 'Conv Prefix List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~127\",\"display\":\"Index\",\"filter\":\"0~127\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~16\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Delete Length\",\"filter\":\"0-16\",\"name\":\"deleteLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Length\",\"filter\":\"0-16\",\"name\":\"addLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Digits\",\"filter\":\"0~16\",\"name\":\"addDigits\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Length\",\"filter\":\"0-32\",\"name\":\"numberLength\",\"type\":\"int\",\"value\":\"0\"}]', 7, 'post,delete', 1726802301054); +INSERT INTO `ne_config` VALUES (284, 'SMSC', 'smppparam', 'SMPP Param List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~31\",\"display\":\"Index\",\"filter\":\"0~31\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0-8\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"udp\\\",\\\"1\\\":\\\"tcp\\\"}\",\"name\":\"linkType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Type\",\"filter\":\"{\\\"0\\\":\\\"client\\\",\\\"1\\\":\\\"server\\\"}\",\"name\":\"serverType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"0-16\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"0-8\",\"name\":\"password\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"0-12\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local GTT\",\"filter\":\"0-16\",\"name\":\"localGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote GTT\",\"filter\":\"0-16\",\"name\":\"remoteGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IP\",\"filter\":\"0-32\",\"name\":\"localIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote IP\",\"filter\":\"0-32\",\"name\":\"remoteIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Init Timer\",\"filter\":\"0-65535\",\"name\":\"sessionInitTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enquire Link Timer\",\"filter\":\"0-65535\",\"name\":\"enquireLinkTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Timer\",\"filter\":\"0-65535\",\"name\":\"inactivityTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Response Timer\",\"filter\":\"0-65535\",\"name\":\"responseTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local SSN\",\"filter\":\"0-255\",\"name\":\"localSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote SSN\",\"filter\":\"0-255\",\"name\":\"remoteSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"1\"}]', 9, 'put', 1726802301058); SET FOREIGN_KEY_CHECKS=1; From e3b55c38e508e707756205cde4c770bf98b52e92 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 17:38:32 +0800 Subject: [PATCH 06/69] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=A8=A1=E5=9D=97=20iperf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.go | 3 + .../iperf3/deb/iperf3_3.1.3-1_amd64.deb | Bin 0 -> 8802 bytes .../iperf3/deb/libiperf0_3.1.3-1_amd64.deb | Bin 0 -> 55184 bytes .../libsctp1_1.0.19+dfsg-1build1_amd64.deb | Bin 0 -> 9370 bytes .../iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm | Bin 0 -> 76348 bytes .../rpm/iperf3-help-3.6-6.ky10.noarch.rpm | Bin 0 -> 14436 bytes src/modules/tool/controller/iperf.go | 71 +++++++++++ src/modules/tool/model/iperf.go | 8 ++ src/modules/tool/service/iperf.go | 110 ++++++++++++++++++ src/modules/tool/tool.go | 29 +++++ 10 files changed, 221 insertions(+) create mode 100644 src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb create mode 100644 src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb create mode 100644 src/assets/dependency/iperf3/deb/libsctp1_1.0.19+dfsg-1build1_amd64.deb create mode 100644 src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm create mode 100644 src/assets/dependency/iperf3/rpm/iperf3-help-3.6-6.ky10.noarch.rpm create mode 100644 src/modules/tool/controller/iperf.go create mode 100644 src/modules/tool/model/iperf.go create mode 100644 src/modules/tool/service/iperf.go create mode 100644 src/modules/tool/tool.go diff --git a/src/app.go b/src/app.go index 731e823d..743f79fd 100644 --- a/src/app.go +++ b/src/app.go @@ -16,6 +16,7 @@ import ( networkdata "be.ems/src/modules/network_data" networkelement "be.ems/src/modules/network_element" "be.ems/src/modules/system" + "be.ems/src/modules/tool" "be.ems/src/modules/trace" "be.ems/src/modules/ws" @@ -143,6 +144,8 @@ func initModulesRoute(app *gin.Engine) { trace.Setup(app) // 图表模块 chart.Setup(app) + // 工具模块 + tool.Setup(app) // ws 模块 ws.Setup(app) // 调度任务模块--暂无接口 diff --git a/src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb b/src/assets/dependency/iperf3/deb/iperf3_3.1.3-1_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..0c687e31e162ad0e55fc9cbc93e13ca2f8e7df97 GIT binary patch literal 8802 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 aOC%Hm4W;SGW!f}i^9u9d9Tc3N{{H}V)9`)( literal 0 HcmV?d00001 diff --git a/src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb b/src/assets/dependency/iperf3/deb/libiperf0_3.1.3-1_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..c81f6622c6958e7b4806b5bc292dbce9446afbe3 GIT binary patch literal 55184 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�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 literal 0 HcmV?d00001 diff --git a/src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm b/src/assets/dependency/iperf3/rpm/iperf3-3.6-6.ky10.aarch64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..b5d5a4a558a3a6685b6678a3f171ab2589710be2 GIT binary patch literal 76348 zcmeFWcQl>N*FSvp7LjN{l!Itd4+n?nooG>_m*bS^MDM+m=q+jxEkub<1kp>>AfgjN zh%TbUd%5F&zTfZjJnOgCZ@uqY??3mPHP@cco;@>r_LO~H`)t4d@dXP6Br+>UloMKj zTYyK1TZqTT6T)}J{l7~XAe{f+;CcBv#x;)s1iF<3lqG zkcoi;?w>LUXp3?C8k=1SfIwL50L2E1xz~6Tpg?~Z1waPcV{QGxm@@zc`p4PbH?3Yub~!khD9i~ch>+mc z-yDs0d{9l&p~Epne**(+|3xguyA9Wg%lD7;i+)`)=>-op2|sk|%Pd+lwtu1g=68(S zi{m~G@$ZITu$Gja66SbLS-of720DErZu3u-Cu;lNJm7kjSNh!SR4U0*%ZWm;8uGG> zYNWO5M<~VehlWjBA&&!0_oP8Z3X`S%go|f1&rwFA^%w7JBd zh9J6Pm}{@muv&YEUNVP0JcVgWjsDpe$d=Zr?n!b9o1OeEapG7g*4Kp<8B|TrF^;ot zVeZCQNjdc=&njMGEyR~H4@*psQN6a(mv#9*RIvB558g0J9ZjoP=WtW7VMjl$L-s)* z_Re8j@$vH^1qIMB2pTOSf)IuygoFh6MflK2xCH`<78JJNgY!cyU{DZ}PXs9<022@p zu;7CVh(Lspf@mQD2vP_wA|N1$Mxs#yP?(SaiVrP}=0gftK;a_7!Z1O!02<0?Ap}JM zD@IlDf4@fM_whmH0?*?^Ioo%kdQl&z&u~-QFAmkLwc)r6Zwb`yG+yWx7;UJfnB2;q zT>Aa9fj%_9Fa&pju)+P;rjHGcUwS9?*n8Ot!)ZNH4uRrQF;?rOp1VZhc1XVsNEJP)>|^&%G}Z4DH&3Y;XKY@)s!|*6-<^# z%SXYg^||;>e8>uIPvk`EVisc^*-No6g!H$^)t>8!Vka10hHnmAYG%2~f9|-`oP9K! ze-_tusLI<{>qFK(R4E%juDc%d9^DMZL8xrpu5d(pUfcOPS639TDgYXcbS29Q- z;{*9B{T℘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 GWkh z`D2CrNXabz?z<4b)FmF4HhMc9BE|mJaH^Z*TS}Z+ynywPbaW7>mn9l|4hpc}b>b7= z*YdoX!6{@{oTl|XoB!HmBOzg7*H}V=M$pq)!nPQYFP^yP?keCbssql%3qpN|^5X#F-j*gp^NEjOOk8Y@4bJ)7V zRn;S)5f@_?Nv}u6jNO@rS-{bYd-#^j_=v;+9Z9=n2${S6dza>l?hXu_mtfNcXw2e)4#Iu{q4SB~b&uQ*`B^W%a%$sKh)0{o7_L zsnL5raA0cQ*HZy|G!jRZj4q=}P^Wvyl|JB+quc<2_b2$C;zNxc2xO$^C-x~gr(Z22 z(CA-Y*+V<2_{^oJs)BaVre_gnr9|qsaqzb85;(zfsT0dpoM%E2cRIprq$J`RNa>c zJjZMKG8$l(U#L7!Sy8oaXSBR(r3Irf*f^pA_(FtmMt3ZeEFtH{x%mm2eRP>vkvI!p zDZhBmc8-#jscgCXY~H9}Bz%35`36pvdvvI2oPjymJyJu@|MO(6^?(=XG5y;FW&-&Z z?-C@@fM{mFeMdVY*oZw!G|ILm^2c=h4z@Iur3k#LNw5&m_>N4-fT=!3?wlKR4Q0jY z-dx`(yo^8!4Kss|Kpaq`&B z?hJ@O1eN14!gGLI9Nx-FbN6B>$L5EUwZb5|y|e~g{X9u@(VU&T zfvs^Cj+0eY*Ulq3dj(UDEtKFwfihGw@8D9|v4V_*1I6l?8b~Xe=B44SP97Pi-#1J8 z^5n>t-F-Lm#~v9GU`J(BqxS33mm`}5PZtT;nNB>$4-L|XYMLmBGGJ&X2s}CeJML52 z8NJLo(H!m>JWojT?AxWow=b7BONQk5qF_rOXAko$rOZI~j4oO)E|mdR0Q$}G={96q zsFNu^FRaKWlY)X~0Uts`4DYG$|JPlux;PIl|46-M zx35s!L~)<6%!AjB5=zehl`+Ib+3P#>`D}|o5Rj#+PTfqX%#4Mf4Y|r%3$Jm*&}xry z$b>Lr$Ttdw^bWnZTfjX)>`<5?hafb5`y6-0O6G2QC>71_3Q16dpRG#75FEFgla_-H z_sKkBGN~f8KjYJPRtBEEOGZVpDjkOFlKfXX~Fs~T2;ge_Bta4{N_fWbRti4z#9(gN1g zFB~U^-42O*Cu`iBR{%jlivbiu8;qAZjL@3Hfl@N_rl(YjTGzpL&g|UIaTMQZ zYc=?Lvt{^i8T-SZlqitMM_E4Vr?&_O&|^BjWa9X}EHLH9cYm}Ga@x`9an32dN83sn zlg8AnE1wj~$@Caa9Yaj;%6gpUJ6|R$ZE`pba+8?YFc=<1fiT%pf<<~1dVM3`Lmk{* zBVK@m`L1ndx*$l4xGnyCCH=qyRueO)gpkPFdorn6prb%%RdNB@BztIkSTdD#U2Zq! z_&32^=5Z2MVOxgVp2Q-#Rgl*_cSteGb|cr}Ht)$5C%0z+hlzW_xHkmf;*%?j8y`v= zw8fPl03aZ$(`6O<_1^xw5YP<#Wmu3WVQxGP+XIDwJ_JZLZLSsdYT~nlA%vq$Ws!7v zvOHl{OzP@S#LpgLz16F8{ z%;0R)jvJjGo<z z{g)f!4Q5Jve?yd~8nfAfoxsAQ>(GaM4#V2iDs(Gt@{`O9 z`=G$rg>m_Rx^uU)evh|ET;ax1Dci;=QqhhAn3))22Lfc7Zh3wMYVqMS$c_8fb%eVq&DaAYYI;~RX&l`Q}a>{=f7^qqforc zG+(2bP6g(-=TYmp+Q_^qGmf_PM*Q;90_}?cFKXwIfH-`Pdou2OgXsil!#4{HmxP#} z!~PZv3PFK;^B7S9?(7bLlGui}umsy?{OUznUPvBkge(=Ao%JXa$e*+w;73S>qvZR! z=}=sO?x+XU9O7UQmT4%gAh(4o1cJ_9-;t3H84oNA>#Znhl(TizYXND2^)1LS6F+Hb zck!#*Zk+VF)ENZhq_OJ|;&}W(*x&ObCoz3*~}%#W*wTZ zQ4St)FTr+HPZ4Z*6zMwVCJSAHGin2VG*@iT8C_80xKI7ELSVAATWE?L2bSpP#5Hkt zWH6Q^zd&BQ5)_(NxE#tNk^!92|LRkOHT082R<77Gcv5phSOrVfHP-{zhVymYvsTv? z6Avl)VksC9p&IqDjgr1Uxw&atH%A+y^>HFC0=Kr!WIwCBTVy4uwNXK;l#6&vSjmGS8$~O{)ZGePB0()!D(elDP^U%2j7;x z6>)Jc^mPY^)lwwdV*;nEebT^kfM@4tNpZu$QZPRL&^Z8u9Nge0aM@O0RNHH9xQDQ{ z2nj6>ov~fDt9>hvuPYaUSl|o0pY$ZFJYS?GPL7`rWR^I0{L(n?yIR8l7zX~nE4My3 zvTmmFVs{R?YZ(7+-u3zTktc5jhZ$Apuv2f*zID)l-yQ5_8Og+U+lsMJ+96p9eE;p8O2Yk<{sPc9i#`FomfsqSwearaf%W)#dR57;;sK&u4bdABpf0!I@ z$rAIX@45wkuC0nc^T_N{;Z$Mwm&>uEBzUp+5ZHCi3;LkYl>b;m0mm0WztM3k;nRh{ zJ1vU<&UCx0>BME)ZT>H2Oa6!>jG9zICg`I7JrnXbRyuIlZy5^V7QmX3;Z24T=&xrg zynbuZo_=qU0FdW7CLZ0uB?r5rESz=i4TeJ-Ujod_Tr+CPXa!0Gf@aGD)&`A1a!pHn z++06f*xkG6^wSY~bz2+gEVv}p7errB)+bzWL@n9!B;V7sTW68)&&5I=BEO)jt@e8v zuH%;&Wbo;GenRJl6$`?~F)~+KFUz6q4Zsq5e#>G*%$(-%4HqPo5M|}?Qt_*9=i-d! z_QH-^ncpH)E4Ki{+nu&F4@WsD#bp{6bgS}v5~$l6reLvXNc(UHpRpr==Kn5iLcG!u z%R3!~>KMHe?FWzax1OP6gi(Z##G9XUjGN|A|0Q5%M#*5*!o;AvV?&8Typ}- zYGa{L^_t@U(&lirdzVJuz(a0Pki~L{fW!qW0ne22sjN4>!WPgz?eqkqS%QXlU+4{D zG^3Z4>X!p&ph`H7Ds;YF zQH^OKg>J&+4-L+fl25)b9HqW)c?#!Qt!5|m;|rvq-e-=gwQ^vIdmMgK?C`;e3GilJ z_;}=mL&jcygu(1R?Zs>(;x=BdCI*5c%yNSa=tisNh58TMPf+JL*|^sUR+^~>A-z?| ztkvQeA=@)Cl*AV+IuCO+*8pbdSKXJ+dsdHmAPIb8K`$HDDmquXXT_-5{GQN{MaKj+WmweO#p>;qKvQMDCoM(9heEZq z)@7LpF31+i;{-CEP5g$6-_Vg(h*$uEnb2Y=;t-m z0k{KQ-cU+(r{roW3%xFujGbMyukUbn+Dap&-_L9c*o_YKg(`$Zz;vYg{I|9`aU!SgR`6lT5p0GT&W2p2QvE< zk3M#Ot5(5u)QoIR0-3sEcql}8FJxF}Qu;v9Um(Ctb@ZlJyYO^MEUX|^*VIcLjOv){ z<{QBvBO*B00#<|WE-MNN&B4~|(1ib-X};s^pim}u%dqCjI%$(W+lUu$0@qX0H*)Ed zej1Vu-C+YFQqN`5G|whA6UPSLDT6?xWyB}8T01?Ef8i8#!y-%Mkm=f2=F9IJVov)q z-`*R7>=uueKQgC7MDI=gIy)1X;&N|M1nBCpwkzy(-emj+$N}`9j`E&-en9}aP23(} zUBbar!p?onfA0&1ZuR_|@M^GHw1< zx{iO%KS%YI(eUKkq?Wwd2kO0yNx)EV8H@c3XZrur4j(^4@uaKG0$T>ged^d0rP^Z7 zpym0gjzKLp?82(La`ZIhY7`=;0QWRcV`>Zm#dRaN$g}%HeeB zan7aoo;E*O64=QN6#@4S9aV=bl#pZ9wLiZd^^+P45qguxZ|CKMTr-EaR4`;6oNW=( z{zOED>jyB^ejm3=*qD6+L?3p`qG|KdYn&s@OIb^SpTSUO6l)!37{l_}ay~5bt!tpS z(~l*oe{B>Dwhrsl^)IP{iRs^27I6Re&LyoERoa#~{--P2d63>#Kaq63JB zGUD;_T6_@^HS=22Vjf@=f=j~dvV*OkMl-`G-j3&!AENDi@`jlXisiY$4i~q(K+lSA z)fQV{=s{6Q@~p>oa=&3i0ICxwB9Rmn8{Xrp+dEh%d!a)fWe^jF(3f!rc1-VZBPS}9 zLA!(l^oQ2OD=+6~TD0rGL^6yNWe{SsjkUq+6tRjoNDtY%Z zq!J|b#GBzmsQVK8-~ms{VAnrH!J(0~(N0tJruFcM`hQ2?s!WZc*>S=?!#81r8W?MX z{FhXf20AJ&Y`1A{Mv{GZfB&&NuA!&1KW&+T#cH6%frb<|X6?@1b!F{~%9oK3A;*{s zh|$>clvMiC3X2!w<3%k-6f2MsCh2TKl{HGu)iUvW`UoEP2#nx=3CB7{ItMSl7N+OI zco(l~v_qitMTI{K$ak_=jWgAi&qnrITWr@!=6+mo0!*PjDVkAP2-MUMGYH26kOpVq z+(I>)Q5h8Gb-K3y_oJn5`l(yNlRp zVdeL_UVBe?U>e9`@8c1`@F^{U=m2vzy_-!Rg%pVc0iDedgIeOGQ9rZqW*G?8I!#_W ztxauUW1V4)9PM!XzHY74=Slqv;24Flu3SZE%MRYNml4?oH5OxC3NC+%>pPi5qzlx*ie=A9@4A)2*dyiNKKDt>)=y z{+z|%(?~*&DUige&>O39Pu^otwCzW$!69Lj8L0L!2Xl1|y_$z;6#N9xa=G(|mHQ3(F zY;0vAx0d2y;!(Py)h)U8afU-C$%7Xq1zhzNNFHf1*S<<%12&6%ny?_CG16QXC{n2e zsSjkx`;B~Fts(2YM!|9(fY~QWhCEZ`^EcB*S;D(x&Q(a&nC=tOP+A-s}_}&vE zP*|As>v+)Z$up0FcJ8G*UhOv6~^WOR(Cm@Bl!-TNX+auyJ-QEV>)DRM$zE<7?v zn1v|OIe}xc6_Fzr7!lZ-P)T@Dhm~BL6bm*I6zB_gEI>%HjoIn~ z{b~vOihrM^Bu#rXMz4ShMRwor^nB~9H(>ybJiF?I=#LTyd0^yfqGYDAKw!%|T(*e@ zvc*bk$IdB0O60pk;?p>g4cMnz_2*yH}jGWo?#PL+K|?s!LojXe{>>B9MTL z@8%&MxZYV_Hhq{TRHH^LrXgj|H8fFVZzY0K}Dn%?NU~fRM))TpELmkzjFDx&O7!kMELCV4P~gSctZ) zhF+L`S|^R-7a_|dhNfD8dl$*2jNSI)1%nCK``20kx(>}LzxPuaJ}m{`)4_Dtx8-I1cOF0MyS9Ty z`o6ew3|}aytMYm2Jjt-Sgxgdq<;^P2u8vo1ocq;pP}RzG2;q7^3yj7QMSZhwfOUpz zyR4@ReUUX1ynd(`H)(_mHYpRAb|vjKK5R)G&B0QHQFm@~W#m99-jpPn74|+Lt+fLx zBAup_6%uaHAORDCji0m{!2d=QCk? zg>*-3MJx-h=SiI#rU8J%)FWX0hJZt*$L>vDqyy`?IFOfF)Nmp*P?M`43?Lx zVrWxrr7cpf@OG(HyKEe*i#yjyIG&5KPg%STL}jmE}&oGKlw z_oI)VcrD6l_{;h;nUH#u@&sEiBudB?m0=wlanr%H`m_`=)j=#GLjwG%^)r*Or&NJV z7a}FoyIoVv26x(O;;H?#q?Z&q@joXf!^CFWm$?rfV>Srm+S`0LrV8XgE(KP}Vj3l( za~mL63)UVV{IJF8?azIJb+t%9M@I@ow(iXa(Kfk4rTM#?E0TJXpQZzRiv=ldD3^?* z7dEkD1Rt7$W1b`GA`>5?^2Y3+x*KQvUTq`_WI%85n(m$uN!aU^b0I4-Ekfk+@2Szm zD83c6MC~kY4lfnLRz2jOJU7TSG#3qdDKaX`O32+3gr%GU$>3q^w%i1;Mac&&O#?zq zx(zN97(=1MfuzAJE5Y~tonTB?yV%HCxOQt*kHqcY3*2-V8hrI(1ihx9$iv8rQVxyN z6W_EweDp4=CV?92pg0?-?WZy1S-C;&e1)j6(k(?Modcxi_!M!!#E@ryD)ShDFcM3xD;?k zV777tHWg&cr%*NWoI3<5`YX#0rg*4H3n!3a7P^N@3uP$~?#feTo*CjH7w^+~s8OZJ zuh`yklI{k+d%0Ad-?@u&dHT9mW9jWml|@SJ8loSbp%gaZxPHb`>vHk~@|jOn<@zvb zU}K~dINYlA<<^lVI-A~=m;$kCVOpp8Oz)x$XwVsuEQ5NeoOxG(lzn^&X^A0eOB^S! zaZCtz{$_<^Lfb;?d&E#=!c-$p3u46I4q!q+;O|0w@ksZ)KY&l8f-!p0It|ZsD?9j5$jY;2Wm|G!$bewysV|7xXyqIHAh)pE z*NCg5pg4yNr%RP93trs9-O~;CU8$f@Jwbxzc2>d*X{Bl1b~>~nLMPi-4R;_taRl30 zq>IfvJuq#8uml$v5I)m_I=_am*aRp|1q>IDJ{&Rec=Zn-sK2f72aBAh>nB`mcK94& zaxqYAg;>~3J1nJ&?DzwlqG+@L5tAV`&z$}P6d^Z4Q(S+dxD7!`z`Yk_N6_V;3C1%8 z7_J*&Ksyca07Oy4{f05BwFge=|8LJnzzHf!PD9p~aI}Sy<#P~?crTN2KUVc=&Ck*` zxsT|R0?%NckF;AIIqsyCUnU}DSRuJ{Qa>bD-ln+9BEZwTWS?P|HUD|@Pe#bemG+{E zFkGGU$juwon&Vcs;3<>_~2v0f)8_ncRqmRJhVJ@=9`HOhzr;z|J^h<-* z(Ro%=*PXDn*Z`|u;-YAY(2uRK*64;gNv3QqC9=NtwD@A^^2+~Io{s|dGT)5P`{>i- zRb&m@VVddLp_3*Us(kzMKi{J9j-mhI(_T8R$we#8d1h1m&5R@S*L=YtDRQfR**-#a z_W%k1|J9|u|C^4K()N4s*raF&w>*rx@7up#8S4CMsgHEQ~w8-yY&x?gC_M( zlZ^RtQzc#!W~^xAzz|Q=OmMhQj?J~^%SLoR=1qlqmXkFimN{Fq{*(ZlN6X@V=M*rB zM&H6ZNgsRRINjwbH1?-T#1J2sHO|zxc2Nh@d%mh-GIy^vmh2(`Mw}Cm<89K@ZC;@l z8zkJ!nM2VAYJMR&BZjEa7C~DKJPG%NW7}XGcBQ z_4_h_3WSHPrKW><1ax-LvFaMZult0*`-0dlB<^9D3Q*cY((Sg%HQrBJR7Vf?$CeY+J+|BV4s%>=8{me5KL@ zg3sHvlFMlhI5L1$sGEn9k2ty{**3DXNRk)=YKKp$eFyE)3W5oyKtL?dl?~8MJS=7> zT+-1ZZPwDOaL5YBT+X+m_in25_9xocXg+{1K9x)$EE7+yRjq|#zSAYo)LT}nfCp@P z5Vc+(up4I4^*2xMQ(qx?>cFtkDVVR9hF5<w~J? zrN?BoAK>i=1p~Iw)xR(4L0EDZ$Z(-pIbC?j<0bzL&9%90>G^1gP!M(Kx+I*1gFFa9hZKdo z0}tFGzig;OJir7fXxAw%f2zClO^?s@PHiD(?`%QH>YcVxyCE>as%iajMIXGu452-iqOj#C5fLG)*9)9H>|WLr4Ddj!4Er4m4(pfp{BwC9F2Tjta4z_}-hh5KGZ z$5R6*q)S+j{Ak(o>%!0O2Yu)l8POW^)*ZZ&3%cjEv*fnUa$hv+s*XX5g1T+J$96Qn z{wgA6_SDK007LwIA8&VXnT;Y#^`g*%;at4kxEuWiV-jn|#Ofy$6g4#A&K&yjJOvZY z;SEWddMzL29`W2gycHe!>XlJsS|urp?VPQmHFTwBzWTD4@HBkOu`n&WwL9pjzS1U) zDvMHvGcNGLEOUbe63%0ax%3H7=#~kZ#J2+Mw75 z|Au^WeihFUDU&&pmkRJL3-`L?m+L<59c`hLTLZCV>FNe%9E$)W6x7$a+X@9nSvF-q zu6sfb20?a8Yk5|^}^AA`E}NE0BN>? z?&$8u+uS#h+2qsj+DpChS~knt%}lwJPINhz|1}Th@)j6b(gc1Gm!IYWDT9NVmzwDX zjVA}@iYnBM9v}BA=73Nl0H&+jdEu!1TgPCHN6Gtk2XvY!B`YU!xT=h}EG=QFNHtm< zfXw2x3l9a62BMh2)1DnOFq3{tHEWn*!6tUi9zLiAScxGXZLvJ*U3LvIq+r*1Y?PZ#NtAss(V&-{>?bHu-^ z0g1v41EXX#1o=EfAE;N4sU{+aL8KbzgNtXtP=DBZ>${(1W^&hGPuHx z%~W7^*J@MOs{vXA0}>B#8XtsC)gD?_EYU1&(30@y2n+5x1^9UiJ(wIlTGaPF!>-KC zs{SdW{sPpb5|O#dt@HH`(mGh9cmK_(?H{bzR)W3va48y}QSy$$yti+n`-|TTSTSTG zC`p|e%h8s~MZw(?Mr0j_4JCIWn?rSP419K-cB+&t~mAjRf}sM^B^HM159;! zt{wlVBQCZkvC7HqQwaX`G^JsR>qQ#v;!76ufYNDqsH~U8rX@I9%fkc7lfrbM@u+MN z5W(^%x_Cli#Ar#%@i9;gr;G(_0H+-EGrGv3AEf!>rh0W<$!uYE>}8`(kaxKyqW6kS zH+uAKdcrpZEMnsaL!5tI0(n4JxHoodjg1C#Re>R&c;Nf2!$QU!peL0cL&1$iUbL<+ zQ1?Kh3AS?fYg0iZk6q9_b^Tp{b9D$8rKm&VD2RXq=bl=ElLtMHw(sINckej%0Dm+V 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 tool 模块路由") + + // iperf 网络性能测试工具 + iperfGroup := router.Group("/tool/iperf") + { + iperfGroup.GET("/v", + middleware.PreAuthorize(nil), + controller.NewIPerf.Version, + ) + iperfGroup.POST("/i", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.iperf", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewIPerf.Install, + ) + } +} From d1020bd255f40a0d12d3af169d93fd8c9abfd05a Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 17:39:22 +0800 Subject: [PATCH 07/69] =?UTF-8?q?style:=20gin=E5=86=85=E7=BD=AE=E5=87=BD?= =?UTF-8?q?=E6=95=B0ShouldBindBodyWithJSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/ctx/ctx.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/framework/utils/ctx/ctx.go b/src/framework/utils/ctx/ctx.go index cc17a092..b9f2f1e6 100644 --- a/src/framework/utils/ctx/ctx.go +++ b/src/framework/utils/ctx/ctx.go @@ -14,7 +14,6 @@ import ( "golang.org/x/text/language" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // QueryMap 查询参数转换Map @@ -30,7 +29,7 @@ func QueryMap(c *gin.Context) map[string]any { // BodyJSONMap JSON参数转换Map func BodyJSONMap(c *gin.Context) map[string]any { params := make(map[string]any) - c.ShouldBindBodyWith(¶ms, binding.JSON) + c.ShouldBindBodyWithJSON(¶ms) return params } @@ -39,7 +38,7 @@ func RequestParamsMap(c *gin.Context) map[string]any { params := make(map[string]any) // json if strings.HasPrefix(c.ContentType(), "application/json") { - c.ShouldBindBodyWith(¶ms, binding.JSON) + c.ShouldBindBodyWithJSON(¶ms) } // 表单 From d157ed8e3c89b058bc213f182be54aa74a7e7cf7 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 17:40:00 +0800 Subject: [PATCH 08/69] =?UTF-8?q?style:=20=E5=87=BD=E6=95=B0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/ssh/sftp.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/framework/utils/ssh/sftp.go b/src/framework/utils/ssh/sftp.go index f5c103f7..45ef9af6 100644 --- a/src/framework/utils/ssh/sftp.go +++ b/src/framework/utils/ssh/sftp.go @@ -60,7 +60,7 @@ func (s *SSHClientSFTP) CopyDirRemoteToLocal(remoteDir, localDir string) error { return nil } -// CopyDirRemoteToLocal 复制目录-本地到远程 +// CopyDirLocalToRemote 复制目录-本地到远程 func (s *SSHClientSFTP) CopyDirLocalToRemote(localDir, remoteDir string) error { // 遍历本地目录中的文件和子目录并复制到远程 err := filepath.Walk(localDir, func(localPath string, info os.FileInfo, err error) error { @@ -94,7 +94,7 @@ func (s *SSHClientSFTP) CopyDirLocalToRemote(localDir, remoteDir string) error { return nil } -// CopyDirRemoteToLocal 复制文件-远程到本地 +// CopyFileRemoteToLocal 复制文件-远程到本地 func (s *SSHClientSFTP) CopyFileRemoteToLocal(remotePath, localPath string) error { if err := os.MkdirAll(filepath.Dir(localPath), 0775); err != nil { return err @@ -124,7 +124,7 @@ func (s *SSHClientSFTP) CopyFileRemoteToLocal(remotePath, localPath string) erro return nil } -// CopyDirRemoteToLocal 复制文件-本地到远程 +// CopyFileLocalToRemote 复制文件-本地到远程 func (s *SSHClientSFTP) CopyFileLocalToRemote(localPath, remotePath string) error { // 打开本地文件 localFile, err := os.Open(localPath) From 27517a352d217d9431b58f75045a5c4f5ec4369d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 9 Oct 2024 17:40:37 +0800 Subject: [PATCH 09/69] =?UTF-8?q?chore:=20=E4=BE=9D=E8=B5=96tidy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 83 ---------------------------------------------------------- 2 files changed, 1 insertion(+), 84 deletions(-) diff --git a/go.mod b/go.mod index 1d55f945..9d223347 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.22.0 // indirect - github.com/goccy/go-json v0.10.3 + github.com/goccy/go-json v0.10.3 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.6.0 // indirect diff --git a/go.sum b/go.sum index 714cab42..4e2e53ee 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,8 @@ -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= -gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/allegro/bigcache/v3 v3.1.0/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= @@ -34,8 +22,6 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -49,8 +35,6 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -65,10 +49,6 @@ github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-forks/fsnotify v1.4.7 h1:lyiU2Wqd4fNGCQDn9dZ4UxSiSFgeU1rM6yIfahk8haY= github.com/go-forks/fsnotify v1.4.7/go.mod h1:AU8mot+GznW5+B4jRJHxKg/2EeO+jMORGRkKSxs0biw= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -89,14 +69,10 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -105,7 +81,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -118,12 +93,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopacket/gopacket v1.2.0 h1:eXbzFad7f73P1n2EJHQlsKuvIMJjVXK5tXoSca78I3A= github.com/gopacket/gopacket v1.2.0/go.mod h1:BrAKEy5EOGQ76LSqh7DMAr7z0NNPdczWm2GxCG7+I8M= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -133,26 +104,9 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gosnmp/gosnmp v1.36.2-0.20231009064202-d306ed5aa998/go.mod h1:O938QjIS4vpSag1UTcnnBq9MfNmimuOGtvQsT1NbErc= github.com/gosnmp/gosnmp v1.38.0 h1:I5ZOMR8kb0DXAFg/88ACurnuwGwYkXWq3eLpJPHMEYc= github.com/gosnmp/gosnmp v1.38.0/go.mod h1:FE+PEZvKrFz9afP9ii1W3cprXuVZ17ypCcyyfYuu5LY= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.18.0/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= github.com/jasonlvhit/gocron v0.0.1 h1:qTt5qF3b3srDjeOIR4Le1LfeyvoYzJlYpqvG7tJX5YU= github.com/jasonlvhit/gocron v0.0.1/go.mod h1:k9a3TV8VcU73XZxfVHCHWMWF9SOqgoku0/QlY2yvlA4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= @@ -163,10 +117,8 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= @@ -193,7 +145,6 @@ github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f h1:sgU github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 h1:Bvq8AziQ5jFF4BHGAEDSqwPW1NJS3XshxbRCxtjFAZc= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linxGnu/gosmpp v0.3.0 h1:LL+eY+zc9Ei/YY0po9A6L6SHf8nPyGvqsLddttr/y/4= github.com/linxGnu/gosmpp v0.3.0/go.mod h1:Ba6SULQql3IbF2A5Mtj3DqMKoFbx1pEz/8xyiOh8ZOs= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= @@ -203,7 +154,6 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU669bE= github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= @@ -212,8 +162,6 @@ github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73 h1:4vKVhAdype/dej github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73/go.mod h1:l71/5fppWP5A6nqhcxz6wQAYok6pr/vM2+KHIy50/LY= github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f h1:eeJGcYszuvOpmuJxeq57LaOO8mJurfjpOHJJMfQSD0s= github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f/go.mod h1:WK3zEKtwVd/v+NM3lh1ZE6MdDfHsdOFFOD5Ezi4Hutg= -github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -229,10 +177,6 @@ github.com/mssola/useragent v1.0.0 h1:WRlDpXyxHDNfvZaPEut5Biveq86Ze4o4EMffyMxmH5 github.com/mssola/useragent v1.0.0/go.mod h1:hz9Cqz4RXusgg1EdI4Al0INR62kP7aPSRNHnpU+b85Y= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -242,7 +186,6 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -290,7 +233,6 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -303,7 +245,6 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -356,7 +297,6 @@ github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY= github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ= @@ -371,21 +311,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= -go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= -go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= -go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -434,7 +361,6 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -521,13 +447,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -552,7 +471,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -583,7 +501,6 @@ modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= xorm.io/builder v0.3.13 h1:a3jmiVVL19psGeXx8GIurTp7p0IIgqeDmwhcR6BAOAo= xorm.io/builder v0.3.13/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= xorm.io/xorm v1.3.9 h1:TUovzS0ko+IQ1XnNLfs5dqK1cJl1H5uHpWbWqAQ04nU= From 4f9f91ea5a015b3805b55d6aa6a356b1bd41b81e Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 10 Oct 2024 10:58:57 +0800 Subject: [PATCH 10/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0SMSC=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/param/smsc_param_config.yaml | 4 ++-- database/common/ne_config.sql | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config/param/smsc_param_config.yaml b/config/param/smsc_param_config.yaml index a3e2d3c1..600b0b80 100644 --- a/config/param/smsc_param_config.yaml +++ b/config/param/smsc_param_config.yaml @@ -172,7 +172,7 @@ smsc: smpplink: display: "SMPP Link List" sort: 5 - perms: "post,delete" + perms: "post,put,delete" array: - name: "index" type: "int" @@ -254,7 +254,7 @@ smsc: convprefix: display: "Conv Prefix List" sort: 7 - perms: "post,delete" + perms: "post,put,delete" array: - name: "index" type: "int" diff --git a/database/common/ne_config.sql b/database/common/ne_config.sql index a879fa84..8cc3fd54 100644 --- a/database/common/ne_config.sql +++ b/database/common/ne_config.sql @@ -123,11 +123,11 @@ INSERT INTO `ne_config` VALUES (242, 'CBC', 'mmeProfile', 'MME Profile', 'array' INSERT INTO `ne_config` VALUES (260, 'OMC', 'alarmEmailForward', 'Alarm Email Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with Email interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Email List\",\"filter\":\"\",\"name\":\"emailList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Email SMTP server\",\"display\":\"SMTP Server\",\"filter\":\"\",\"name\":\"smtp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"0~65535\",\"name\":\"port\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"User\",\"filter\":\"\",\"name\":\"user\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"If skip TLS verify (true/false)\",\"display\":\"TLS Skip Verify\",\"filter\":\"true;false\",\"name\":\"tlsSkipVerify\",\"type\":\"bool\",\"value\":\"true\"}]', 3, '', 1725505025649); INSERT INTO `ne_config` VALUES (261, 'OMC', 'alarmSMSForward', 'Alarm SMS Forward Interface', 'list', '[{\"access\":\"rw\",\"comment\":\"Is it enabled forward alarm with SMS interface\",\"display\":\"Enable\",\"filter\":\"true;false\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"rw\",\"comment\":\"Multiple mobile separated by commas\",\"display\":\"Mobile List\",\"filter\":\"\",\"name\":\"mobileList\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"The SMSC SMPP Address\",\"display\":\"SMSC Address\",\"filter\":\"\",\"name\":\"smscAddr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"\",\"name\":\"password\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"rw\",\"comment\":\"Short message coding type\",\"display\":\"Data Coding\",\"filter\":\"{\\\"0\\\":\\\"GSM7BIT\\\",\\\"1\\\":\\\"ASCII\\\",\\\"2\\\":\\\"BINARY8BIT1\\\",\\\"3\\\":\\\"LATIN1\\\",\\\"4\\\":\\\"BINARY8BIT2\\\",\\\"6\\\":\\\"CYRILLIC\\\",\\\"7\\\":\\\"HEBREW\\\",\\\"8\\\":\\\"UCS2\\\"}\",\"name\":\"dataCoding\",\"type\":\"enum\",\"value\":\"GSM7BIT\"},{\"access\":\"rw\",\"comment\":\"It is the source address, the length is between 3 and 20\",\"display\":\"Service Number\",\"filter\":\"3~20\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"OMC\"}]', 4, '', 1727664057261); --- 更新 SMSC 配置 20240920 -INSERT INTO `ne_config` VALUES (280, 'SMSC', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"If add plus then set false\",\"display\":\"MT Id Format Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mtIdFormatFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"enable mcast sms\",\"display\":\"Mcast Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mcastFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"{\\\"0\\\":\\\"none\\\",\\\"1\\\":\\\"error\\\",\\\"2\\\":\\\"debug\\\"}\",\"name\":\"logLevel\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The MB sizeof log file\",\"display\":\"Log Size\",\"filter\":\"1-1000\",\"name\":\"logSize\",\"type\":\"int\",\"value\":\"200\"},{\"access\":\"read-write\",\"comment\":\"The number of log file\",\"display\":\"Log Number\",\"filter\":\"1-20\",\"name\":\"logNum\",\"type\":\"int\",\"value\":\"10\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Directory\",\"filter\":\"0~128\",\"name\":\"logDir\",\"type\":\"string\",\"value\":\"/var/log/\"}]', 1, '', 1726802301029); -INSERT INTO `ne_config` VALUES (281, 'SMSC', 'msisdnsegment', 'MSISDN Segment List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]', 3, 'put', 1726802301041); -INSERT INTO `ne_config` VALUES (282, 'SMSC', 'smpplink', 'SMPP Link List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]', 5, 'post,delete', 1726802301049); -INSERT INTO `ne_config` VALUES (283, 'SMSC', 'convprefix', 'Conv Prefix List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~127\",\"display\":\"Index\",\"filter\":\"0~127\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~16\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Delete Length\",\"filter\":\"0-16\",\"name\":\"deleteLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Length\",\"filter\":\"0-16\",\"name\":\"addLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Digits\",\"filter\":\"0~16\",\"name\":\"addDigits\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Length\",\"filter\":\"0-32\",\"name\":\"numberLength\",\"type\":\"int\",\"value\":\"0\"}]', 7, 'post,delete', 1726802301054); -INSERT INTO `ne_config` VALUES (284, 'SMSC', 'smppparam', 'SMPP Param List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~31\",\"display\":\"Index\",\"filter\":\"0~31\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0-8\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"udp\\\",\\\"1\\\":\\\"tcp\\\"}\",\"name\":\"linkType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Type\",\"filter\":\"{\\\"0\\\":\\\"client\\\",\\\"1\\\":\\\"server\\\"}\",\"name\":\"serverType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"0-16\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"0-8\",\"name\":\"password\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"0-12\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local GTT\",\"filter\":\"0-16\",\"name\":\"localGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote GTT\",\"filter\":\"0-16\",\"name\":\"remoteGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IP\",\"filter\":\"0-32\",\"name\":\"localIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote IP\",\"filter\":\"0-32\",\"name\":\"remoteIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Init Timer\",\"filter\":\"0-65535\",\"name\":\"sessionInitTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enquire Link Timer\",\"filter\":\"0-65535\",\"name\":\"enquireLinkTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Timer\",\"filter\":\"0-65535\",\"name\":\"inactivityTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Response Timer\",\"filter\":\"0-65535\",\"name\":\"responseTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local SSN\",\"filter\":\"0-255\",\"name\":\"localSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote SSN\",\"filter\":\"0-255\",\"name\":\"remoteSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"1\"}]', 9, 'put', 1726802301058); +-- 更新 SMSC 配置 20241010 +INSERT INTO `ne_config` VALUES (280, 'SMSC', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"If add plus then set false\",\"display\":\"MT Id Format Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mtIdFormatFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"enable mcast sms\",\"display\":\"Mcast Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"mcastFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"{\\\"0\\\":\\\"none\\\",\\\"1\\\":\\\"error\\\",\\\"2\\\":\\\"debug\\\"}\",\"name\":\"logLevel\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The MB sizeof log file\",\"display\":\"Log Size\",\"filter\":\"1-1000\",\"name\":\"logSize\",\"type\":\"int\",\"value\":\"200\"},{\"access\":\"read-write\",\"comment\":\"The number of log file\",\"display\":\"Log Number\",\"filter\":\"1-20\",\"name\":\"logNum\",\"type\":\"int\",\"value\":\"10\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Directory\",\"filter\":\"0~128\",\"name\":\"logDir\",\"type\":\"string\",\"value\":\"/var/log/\"}]', 1, '', 1728528805723); +INSERT INTO `ne_config` VALUES (281, 'SMSC', 'msisdnsegment', 'MSISDN Segment List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]', 3, 'put', 1728528805736); +INSERT INTO `ne_config` VALUES (282, 'SMSC', 'smpplink', 'SMPP Link List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]', 5, 'post,put,delete', 1728528805740); +INSERT INTO `ne_config` VALUES (283, 'SMSC', 'convprefix', 'Conv Prefix List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~127\",\"display\":\"Index\",\"filter\":\"0~127\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~16\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Delete Length\",\"filter\":\"0-16\",\"name\":\"deleteLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Length\",\"filter\":\"0-16\",\"name\":\"addLength\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Add Digits\",\"filter\":\"0~16\",\"name\":\"addDigits\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Length\",\"filter\":\"0-32\",\"name\":\"numberLength\",\"type\":\"int\",\"value\":\"0\"}]', 7, 'post,put,delete', 1728528805745); +INSERT INTO `ne_config` VALUES (284, 'SMSC', 'smppparam', 'SMPP Param List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~31\",\"display\":\"Index\",\"filter\":\"0~31\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0-8\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"udp\\\",\\\"1\\\":\\\"tcp\\\"}\",\"name\":\"linkType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Type\",\"filter\":\"{\\\"0\\\":\\\"client\\\",\\\"1\\\":\\\"server\\\"}\",\"name\":\"serverType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"0-16\",\"name\":\"systemID\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Password\",\"filter\":\"0-8\",\"name\":\"password\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Type\",\"filter\":\"0-12\",\"name\":\"systemType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local GTT\",\"filter\":\"0-16\",\"name\":\"localGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote GTT\",\"filter\":\"0-16\",\"name\":\"remoteGTT\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IP\",\"filter\":\"0-32\",\"name\":\"localIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote IP\",\"filter\":\"0-32\",\"name\":\"remoteIP\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Init Timer\",\"filter\":\"0-65535\",\"name\":\"sessionInitTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enquire Link Timer\",\"filter\":\"0-65535\",\"name\":\"enquireLinkTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Timer\",\"filter\":\"0-65535\",\"name\":\"inactivityTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Response Timer\",\"filter\":\"0-65535\",\"name\":\"responseTimer\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local SSN\",\"filter\":\"0-255\",\"name\":\"localSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Remote SSN\",\"filter\":\"0-255\",\"name\":\"remoteSSN\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"1\"}]', 9, 'put', 1728528805748); SET FOREIGN_KEY_CHECKS=1; From 9127865b12a1971c55b1d5928c7910da1066bd41 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 10 Oct 2024 20:39:15 +0800 Subject: [PATCH 11/69] =?UTF-8?q?fix:=20ws=E6=8E=A5=E6=94=B6=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=A4=84=E7=90=86=E6=94=B9=E4=B8=BA=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=98=93=E4=BA=8E=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/ws/controller/ws.go | 307 +------------------------ src/modules/ws/controller/ws_ssh.go | 118 ++++++++++ src/modules/ws/controller/ws_telnet.go | 111 +++++++++ src/modules/ws/controller/ws_view.go | 97 ++++++++ src/modules/ws/service/ws.go | 16 +- src/modules/ws/service/ws_receive.go | 7 - 6 files changed, 338 insertions(+), 318 deletions(-) create mode 100644 src/modules/ws/controller/ws_ssh.go create mode 100644 src/modules/ws/controller/ws_telnet.go create mode 100644 src/modules/ws/controller/ws_view.go diff --git a/src/modules/ws/controller/ws.go b/src/modules/ws/controller/ws.go index c3da955a..b0aece83 100644 --- a/src/modules/ws/controller/ws.go +++ b/src/modules/ws/controller/ws.go @@ -1,44 +1,32 @@ package controller import ( - "encoding/json" - "fmt" "strings" - "time" - - neService "be.ems/src/modules/network_element/service" "be.ems/src/framework/i18n" "be.ems/src/framework/logger" - "be.ems/src/framework/telnet" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/ssh" "be.ems/src/framework/vo/result" "be.ems/src/modules/ws/service" + "github.com/gin-gonic/gin" ) // NewWSController 实例化控制层 WSController 结构体 var NewWSController = &WSController{ - wsService: service.NewWS, - wsSendService: service.NewWSSend, - neHostService: neService.NewNeHostImpl, - neInfoService: neService.NewNeInfoImpl, + wsService: service.NewWS, + wsSendService: service.NewWSSend, + wsReceiveService: service.NewWSReceive, } // WSController WebSocket通信 // // PATH /ws type WSController struct { - // WebSocket 服务 - wsService *service.WS - // WebSocket消息发送 服务 - wsSendService *service.WSSend - // 网元主机连接服务 - neHostService neService.INeHost - // 网元信息服务 - neInfoService neService.INeInfo + wsService *service.WS // WebSocket 服务 + wsSendService *service.WSSend // WebSocket消息发送 服务 + wsReceiveService *service.WSReceive // WebSocket消息接收 服务 } // WS 通用 @@ -75,7 +63,7 @@ func (s *WSController) WS(c *gin.Context) { wsClient := s.wsService.ClientCreate(loginUser.UserID, subGroupIDs, conn, nil) go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveCommont) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Commont) // 等待停止信号 for value := range wsClient.StopChan { @@ -118,282 +106,3 @@ func (s *WSController) Test(c *gin.Context) { c.JSON(200, result.OkData(errMsgArr)) } - -// SSH 终端 -// -// GET /ssh?hostId=1&cols=80&rows=40 -func (s *WSController) SSH(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if query.Cols < 80 || query.Cols > 400 { - query.Cols = 80 - } - if query.Rows < 40 || query.Rows > 1200 { - query.Rows = 40 - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - neHost := s.neHostService.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "ssh" { - // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) - return - } - - // 创建链接SSH客户端 - var connSSH ssh.ConnSSH - neHost.CopyTo(&connSSH) - var client *ssh.ConnSSH - var clientErr error - if neHost.AuthMode == "2" { - client, clientErr = connSSH.NewClientByLocalPrivate() - } else { - client, clientErr = connSSH.NewClient() - } - if clientErr != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer client.Close() - - // 创建SSH客户端会话 - clientSession, err := client.NewClientSession(query.Cols, query.Rows) - if err != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer clientSession.Close() - - // 将 HTTP 连接升级为 WebSocket 连接 - wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) - if wsConn == nil { - return - } - defer wsConn.Close() - - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) - go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveShell) - - // 实时读取SSH消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - for { - select { - case ms := <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("ssh_%s_%d", neHost.HostID, ms.UnixMilli()), - "data": outputStr, - })) - wsClient.MsgChan <- msgByte - - // 退出ssh登录 - // if strings.LastIndex(outputStr, "logout\r\n") != -1 { - // time.Sleep(1 * time.Second) - // s.wsService.CloseClient(wsClient.ID) - // return - // } - } - case <-wsClient.StopChan: // 等待停止信号 - s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) - return - } - } -} - -// Telnet 终端 -// -// GET /telnet?hostId=1 -func (s *WSController) Telnet(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - HostId string `form:"hostId" binding:"required"` // 连接主机ID - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if query.Cols < 120 || query.Cols > 400 { - query.Cols = 120 - } - if query.Rows < 128 || query.Rows > 1200 { - query.Rows = 128 - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - neHost := s.neHostService.SelectById(query.HostId) - if neHost.HostID != query.HostId || neHost.HostType != "telnet" { - // 没有可访问主机信息数据! - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) - return - } - - // 创建链接Telnet客户端 - var connTelnet telnet.ConnTelnet - neHost.CopyTo(&connTelnet) - client, err := connTelnet.NewClient() - if err != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer client.Close() - // 创建Telnet客户端会话 - clientSession, err := client.NewClientSession(query.Cols, query.Rows) - if err != nil { - // 连接主机失败,请检查连接参数后重试 - c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) - return - } - defer clientSession.Close() - - // 将 HTTP 连接升级为 WebSocket 连接 - wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) - if wsConn == nil { - return - } - defer wsConn.Close() - - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) - go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveTelnet) - - // 实时读取Telnet消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - for { - select { - case ms := <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("telnet_%s_%d", neHost.HostID, ms.UnixMilli()), - "data": outputStr, - })) - wsClient.MsgChan <- msgByte - - // 退出telnet登录 - // if strings.LastIndex(outputStr, "logout\r\n") != -1 { - // time.Sleep(1 * time.Second) - // s.wsService.CloseClient(wsClient.ID) - // return - // } - } - case <-wsClient.StopChan: // 等待停止信号 - s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) - return - } - } -} - -// ShellView 终端交互式文件内容查看 -// -// GET /view -func (s *WSController) ShellView(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeType string `form:"neType" binding:"required"` - NeId string `form:"neId" binding:"required"` - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - if query.Cols < 120 || query.Cols > 400 { - query.Cols = 120 - } - if query.Rows < 40 || query.Rows > 1200 { - query.Rows = 40 - } - - // 登录用户信息 - loginUser, err := ctx.LoginUser(c) - if err != nil { - c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) - return - } - - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(query.NeType, query.NeId) - if err != nil { - c.JSON(200, result.ErrMsg(err.Error())) - return - } - defer sshClient.Close() - // ssh连接会话 - clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) - if err != nil { - c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) - return - } - defer clientSession.Close() - - // 将 HTTP 连接升级为 WebSocket 连接 - wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) - if wsConn == nil { - return - } - defer wsConn.Close() - - wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) - go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, service.ReceiveShellView) - - // 等待1秒,排空首次消息 - time.Sleep(1 * time.Second) - _ = clientSession.Read() - - // 实时读取SSH消息直接输出 - msTicker := time.NewTicker(100 * time.Millisecond) - defer msTicker.Stop() - for { - select { - case ms := <-msTicker.C: - outputByte := clientSession.Read() - if len(outputByte) > 0 { - outputStr := string(outputByte) - msgByte, _ := json.Marshal(result.Ok(map[string]any{ - "requestId": fmt.Sprintf("view_%d", ms.UnixMilli()), - "data": outputStr, - })) - wsClient.MsgChan <- msgByte - } - case <-wsClient.StopChan: // 等待停止信号 - s.wsService.ClientClose(wsClient.ID) - logger.Infof("ws Stop Client UID %s", wsClient.BindUid) - return - } - } -} diff --git a/src/modules/ws/controller/ws_ssh.go b/src/modules/ws/controller/ws_ssh.go new file mode 100644 index 00000000..d5444c44 --- /dev/null +++ b/src/modules/ws/controller/ws_ssh.go @@ -0,0 +1,118 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// SSH 终端 +// +// GET /ssh?hostId=1&cols=80&rows=40 +func (s *WSController) SSH(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + HostId string `form:"hostId" binding:"required"` // 连接主机ID + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if query.Cols < 80 || query.Cols > 400 { + query.Cols = 80 + } + if query.Rows < 40 || query.Rows > 1200 { + query.Rows = 40 + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + neHost := neService.NewNeHostImpl.SelectById(query.HostId) + if neHost.HostID != query.HostId || neHost.HostType != "ssh" { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + // 创建链接SSH客户端 + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + var client *ssh.ConnSSH + var clientErr error + if neHost.AuthMode == "2" { + client, clientErr = connSSH.NewClientByLocalPrivate() + } else { + client, clientErr = connSSH.NewClient() + } + if clientErr != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 创建SSH客户端会话 + clientSession, err := client.NewClientSession(query.Cols, query.Rows) + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Shell) + + // 实时读取SSH消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("ssh_%s_%d", neHost.HostID, ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + + // 退出ssh登录 + // if strings.LastIndex(outputStr, "logout\r\n") != -1 { + // time.Sleep(1 * time.Second) + // s.wsService.CloseClient(wsClient.ID) + // return + // } + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/ws/controller/ws_telnet.go b/src/modules/ws/controller/ws_telnet.go new file mode 100644 index 00000000..668d0ec4 --- /dev/null +++ b/src/modules/ws/controller/ws_telnet.go @@ -0,0 +1,111 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// Telnet 终端 +// +// GET /telnet?hostId=1 +func (s *WSController) Telnet(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + HostId string `form:"hostId" binding:"required"` // 连接主机ID + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if query.Cols < 120 || query.Cols > 400 { + query.Cols = 120 + } + if query.Rows < 128 || query.Rows > 1200 { + query.Rows = 128 + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + neHost := neService.NewNeHostImpl.SelectById(query.HostId) + if neHost.HostID != query.HostId || neHost.HostType != "telnet" { + // 没有可访问主机信息数据! + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) + return + } + + // 创建链接Telnet客户端 + var connTelnet telnet.ConnTelnet + neHost.CopyTo(&connTelnet) + client, err := connTelnet.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + // 创建Telnet客户端会话 + clientSession, err := client.NewClientSession(query.Cols, query.Rows) + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.Telnet) + + // 实时读取Telnet消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("telnet_%s_%d", neHost.HostID, ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + + // 退出telnet登录 + // if strings.LastIndex(outputStr, "logout\r\n") != -1 { + // time.Sleep(1 * time.Second) + // s.wsService.CloseClient(wsClient.ID) + // return + // } + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go new file mode 100644 index 00000000..56c77f89 --- /dev/null +++ b/src/modules/ws/controller/ws_view.go @@ -0,0 +1,97 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + + "github.com/gin-gonic/gin" +) + +// ShellView 终端交互式文件内容查看 +// +// GET /view +func (s *WSController) ShellView(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元标识id + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + if query.Cols < 120 || query.Cols > 400 { + query.Cols = 120 + } + if query.Rows < 40 || query.Rows > 1200 { + query.Rows = 40 + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) + if err != nil { + c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.wsReceiveService.ShellView) + + // 等待1秒,排空首次消息 + time.Sleep(1 * time.Second) + _ = clientSession.Read() + + // 实时读取SSH消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("view_%d", ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/ws/service/ws.go b/src/modules/ws/service/ws.go index 58f2f870..728dd609 100644 --- a/src/modules/ws/service/ws.go +++ b/src/modules/ws/service/ws.go @@ -149,8 +149,8 @@ func (s *WS) ClientClose(clientID string) { } // ClientReadListen 客户端读取消息监听 -// receiveType 根据接收类型进行消息处理 -func (s *WS) ClientReadListen(wsClient *model.WSClient, receiveType int) { +// receiveFn 接收函数进行消息处理 +func (s *WS) ClientReadListen(wsClient *model.WSClient, receiveFn func(*model.WSClient, model.WSRequest)) { defer func() { if err := recover(); err != nil { logger.Errorf("ws ReadMessage Panic Error: %v", err) @@ -175,21 +175,13 @@ func (s *WS) ClientReadListen(wsClient *model.WSClient, receiveType int) { continue } // 接收器处理 - switch receiveType { - case ReceiveCommont: - go NewWSReceive.Commont(wsClient, reqMsg) - case ReceiveShell: - go NewWSReceive.Shell(wsClient, reqMsg) - case ReceiveShellView: - go NewWSReceive.ShellView(wsClient, reqMsg) - case ReceiveTelnet: - go NewWSReceive.Telnet(wsClient, reqMsg) - } + go receiveFn(wsClient, reqMsg) } } } // ClientWriteListen 客户端写入消息监听 +// wsClient.MsgChan <- msgByte 写入消息 func (s *WS) ClientWriteListen(wsClient *model.WSClient) { defer func() { if err := recover(); err != nil { diff --git a/src/modules/ws/service/ws_receive.go b/src/modules/ws/service/ws_receive.go index 68ec9bdd..f374b3f2 100644 --- a/src/modules/ws/service/ws_receive.go +++ b/src/modules/ws/service/ws_receive.go @@ -14,13 +14,6 @@ import ( "be.ems/src/modules/ws/processor" ) -const ( - ReceiveCommont = iota // Commont 接收通用业务处理 - ReceiveShell // Shell 接收终端交互业务处理 - ReceiveShellView // ShellView 接收查看文件终端交互业务处理 - ReceiveTelnet // Telnet 接收终端交互业务处理 -) - // 实例化服务层 WSReceive 结构体 var NewWSReceive = &WSReceive{} From 7ba111a7e9370e1597a8948666d362aad48798aa Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 10 Oct 2024 21:05:12 +0800 Subject: [PATCH 12/69] =?UTF-8?q?feat:=20=E5=B7=A5=E5=85=B7=E6=A8=A1?= =?UTF-8?q?=E5=9D=97ping=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/tool/controller/ping.go | 158 +++++++++++++++++ src/modules/tool/model/ping.go | 62 +++++++ src/modules/tool/service/ping.go | 256 ++++++++++++++++++++++++++++ src/modules/tool/tool.go | 24 +++ 4 files changed, 500 insertions(+) create mode 100644 src/modules/tool/controller/ping.go create mode 100644 src/modules/tool/model/ping.go create mode 100644 src/modules/tool/service/ping.go diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go new file mode 100644 index 00000000..7af020de --- /dev/null +++ b/src/modules/tool/controller/ping.go @@ -0,0 +1,158 @@ +package controller + +import ( + "encoding/json" + "fmt" + "time" + + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ctx" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/tool/model" + "be.ems/src/modules/tool/service" + wsService "be.ems/src/modules/ws/service" + + "github.com/gin-gonic/gin" +) + +// 实例化控制层 PingController 结构体 +var NewPing = &PingController{ + pingService: service.NewPing, + wsService: wsService.NewWS, +} + +// ping ICMP网络探测工具 https://github.com/prometheus-community/pro-bing +// +// PATH /tool/ping +type PingController struct { + pingService *service.Ping // ping ICMP网络探测工具 + wsService *wsService.WS // WebSocket 服务 +} + +// ping 基本信息运行 +// +// POST / +func (s *PingController) Statistics(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.Ping + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + info, err := s.pingService.Statistics(body) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.OkData(info)) +} + +// ping 传统UNIX运行 +// +// GET / +func (s *PingController) StatisticsOn(c *gin.Context) { + language := ctx.AcceptLanguage(c) + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, nil) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.pingService.StatisticsOn) + + // 等待停止信号 + for value := range wsClient.StopChan { + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) + return + } +} + +// ping 网元端UNIX运行 +// +// GET /run +func (s *PingController) Run(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元标识id + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) + if err != nil { + c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.pingService.RunNE) + + // 等待1秒,排空首次消息 + time.Sleep(1 * time.Second) + _ = clientSession.Read() + + // 实时读取Run消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("ping_%d", ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } +} diff --git a/src/modules/tool/model/ping.go b/src/modules/tool/model/ping.go new file mode 100644 index 00000000..9a00b1ff --- /dev/null +++ b/src/modules/tool/model/ping.go @@ -0,0 +1,62 @@ +package model + +import ( + "runtime" + "time" + + probing "github.com/prometheus-community/pro-bing" +) + +// Ping 探针发包参数 +type Ping struct { + DesAddr string `json:"desAddr" binding:"required"` // 目的 IP 地址(字符串类型,必填) + SrcAddr string `json:"srcAddr"` // 源 IP 地址(字符串类型,可选) + Interval int `json:"interval"` // 发包间隔(整数类型,可选,单位:秒,取值范围:1-60,默认值:1) + TTL int `json:"ttl"` // TTL(整数类型,可选,取值范围:1-255,默认值:255) + Count int `json:"count"` // 发包数(整数类型,可选,取值范围:1-65535,默认值:5) + Size int `json:"size"` // 报文大小(整数类型,可选,取值范围:36-8192,默认值:36) + Timeout int `json:"timeout"` // 报文超时时间(整数类型,可选,单位:秒,取值范围:1-60,默认值:2) +} + +// setDefaultValue 设置默认值 +func (p *Ping) setDefaultValue() { + if p.Interval < 1 || p.Interval > 10 { + p.Interval = 1 + } + if p.TTL < 1 || p.TTL > 255 { + p.TTL = 255 + } + if p.Count < 1 || p.Count > 65535 { + p.Count = 5 + } + if p.Size < 36 || p.Size > 8192 { + p.Size = 36 + } + if p.Timeout < 1 || p.Timeout > 60 { + p.Timeout = 2 + } +} + +// NewPinger ping对象 +func (p *Ping) NewPinger() (*probing.Pinger, error) { + p.setDefaultValue() + + pinger, err := probing.NewPinger(p.DesAddr) + if err != nil { + return nil, err + } + if p.SrcAddr != "" { + pinger.Source = p.SrcAddr + } + pinger.Interval = time.Duration(p.Interval) * time.Second + pinger.TTL = p.TTL + pinger.Count = p.Count + pinger.Size = p.Size + pinger.Timeout = time.Duration(p.Timeout) * time.Second + + // 设置特权模式(需要管理员权限) + if runtime.GOOS == "windows" { + pinger.SetPrivileged(true) + } + return pinger, nil +} diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go new file mode 100644 index 00000000..100ef9db --- /dev/null +++ b/src/modules/tool/service/ping.go @@ -0,0 +1,256 @@ +package service + +import ( + "encoding/json" + "fmt" + "io" + "strings" + "time" + + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" + "be.ems/src/modules/tool/model" + wsModel "be.ems/src/modules/ws/model" + probing "github.com/prometheus-community/pro-bing" +) + +// 实例化服务层 Ping 结构体 +var NewPing = &Ping{ + neInfoService: neService.NewNeInfoImpl, +} + +// Ping 网络性能测试工具 服务层处理 +type Ping struct { + // 网元信息服务 + neInfoService neService.INeInfo +} + +// Statistics ping基本信息 +func (s *Ping) Statistics(ping model.Ping) (map[string]any, error) { + pinger, err := ping.NewPinger() + if err != nil { + return nil, err + } + if err = pinger.Run(); err != nil { + return nil, err + } + defer pinger.Stop() + stats := pinger.Statistics() + return map[string]any{ + "minTime": stats.MinRtt.Microseconds(), // 最小时延(整数类型,可选,单位:微秒) + "maxTime": stats.MaxRtt.Microseconds(), // 最大时延(整数类型,可选,单位:微秒) + "avgTime": stats.AvgRtt.Microseconds(), // 平均时延(整数类型,可选,单位:微秒) + "lossRate": int64(stats.PacketLoss), // 丢包率(整数类型,可选,单位:%) + "jitter": stats.StdDevRtt.Microseconds(), // 时延抖动(整数类型,可选,单位:微秒) + }, nil +} + +// StatisticsOn ping模拟传统UNIX +func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws Commont UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + return + case "ping": + msgByte, _ := json.Marshal(reqMsg.Data) + var ping model.Ping + if errj := json.Unmarshal(msgByte, &ping); errj != nil { + err = fmt.Errorf("query data structure error") + } + var pinger *probing.Pinger + pinger, errp := ping.NewPinger() + if errp != nil { + logger.Warnf("ws pinger new err: %s", errp.Error()) + err = fmt.Errorf("pinger error") + } + defer pinger.Stop() + + // 接收的数据包 + pinger.OnRecv = func(pkt *probing.Packet) { + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("%d bytes from %s: icmp_seq=%d time=%v\\r\\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt), + })) + client.MsgChan <- resultByte + } + // 已接收过的数据包 + pinger.OnDuplicateRecv = func(pkt *probing.Packet) { + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\\r\\n", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.TTL), + })) + client.MsgChan <- resultByte + } + // 接收结束 + pinger.OnFinish = func(stats *probing.Statistics) { + end1 := fmt.Sprintf("\\r\\n--- %s ping statistics ---\\r\\n", stats.Addr) + end2 := fmt.Sprintf("%d packets transmitted, %d packets received, %v%% packet loss\\r\\n", stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) + end3 := fmt.Sprintf("round-trip min/avg/max/stddev = %v/%v/%v/%v\\r\\n", stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("%s%s%s", end1, end2, end3), + })) + client.MsgChan <- resultByte + } + resultByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": reqMsg.RequestID, + "data": fmt.Sprintf("PING %s (%s) %d bytes of data.\\r\\n", pinger.Addr(), pinger.IPAddr(), pinger.Size), + })) + client.MsgChan <- resultByte + if errp := pinger.Run(); errp != nil { + logger.Warnf("ws pinger run err: %s", errp.Error()) + err = fmt.Errorf("pinger error") + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws ping run UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// RunNE 接收ping终端交互业务处理 +func (s *Ping) RunNE(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws ping run UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + return + case "ping": + // SSH会话消息接收写入会话 + var command string + command, err = s.parseOptions(reqMsg.Data) + if command != "" && err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write(command) + } + case "ctrl-c": + // 模拟按下 Ctrl+C + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write("\u0003\n") + case "resize": + // 会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws ping run UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// parseOptions 解析拼装ping命令 ping [options] +func (s *Ping) parseOptions(reqData any) (string, error) { + msgByte, _ := json.Marshal(reqData) + var data struct { + Command string `json:"command"` // 命令字符串 + DesAddr string `json:"desAddr"` // dns name or ip address + // Options + Interval int `json:"interval"` // seconds between sending each packet + TTL int `json:"ttl"` // define time to live + Cunt int `json:"count"` // 次回复后停止 + Size int `json:"size"` // 使用 作为要发送的数据字节数 + Timeout int `json:"timeout"` // time to wait for response + } + if err := json.Unmarshal(msgByte, &data); err != nil { + logger.Warnf("ws processor parseClient err: %s", err.Error()) + return "", fmt.Errorf("query data structure error") + } + + command := []string{"ping"} + // 命令字符串高优先级 + if data.Command != "" { + command = append(command, data.Command) + command = append(command, "\n") + return strings.Join(command, " "), nil + } + + // Options + if data.Interval > 0 { + command = append(command, fmt.Sprintf("-i %d", data.Interval)) + } + if data.TTL > 0 { + command = append(command, fmt.Sprintf("-t %d", data.TTL)) + } + if data.Cunt > 0 { + command = append(command, fmt.Sprintf("-c %d", data.Cunt)) + } + if data.Size > 0 { + command = append(command, fmt.Sprintf("-s %d", data.Size)) + } + if data.Timeout > 0 { + command = append(command, fmt.Sprintf("-w %d", data.Timeout)) + } + + command = append(command, data.DesAddr) + command = append(command, "\n") + return strings.Join(command, " "), nil +} diff --git a/src/modules/tool/tool.go b/src/modules/tool/tool.go index 6d91e856..7a92d1d9 100644 --- a/src/modules/tool/tool.go +++ b/src/modules/tool/tool.go @@ -25,5 +25,29 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.iperf", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewIPerf.Install, ) + iperfGroup.GET("/run", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.iperf", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewIPerf.Run, + ) + } + + // ping ICMP网络探测工具 + pingGroup := router.Group("/tool/ping") + { + pingGroup.POST("", + middleware.PreAuthorize(nil), + controller.NewPing.Statistics, + ) + pingGroup.GET("", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ping", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPing.StatisticsOn, + ) + pingGroup.GET("/run", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ping", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewPing.Run, + ) } } From c1fa37731fcb1a72a4c439017090cae0be6a77bd Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 10 Oct 2024 21:05:35 +0800 Subject: [PATCH 13/69] =?UTF-8?q?feat:=20=E5=B7=A5=E5=85=B7=E6=A8=A1?= =?UTF-8?q?=E5=9D=97iperf=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/tool/controller/iperf.go | 97 ++++++++++++++++-- src/modules/tool/model/iperf.go | 8 -- src/modules/tool/service/iperf.go | 142 +++++++++++++++++++++++++++ 3 files changed, 231 insertions(+), 16 deletions(-) delete mode 100644 src/modules/tool/model/iperf.go diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go index 57fe7cc8..c908d584 100644 --- a/src/modules/tool/controller/iperf.go +++ b/src/modules/tool/controller/iperf.go @@ -1,29 +1,34 @@ package controller -// https://iperf.fr/iperf-download.php -// https://launchpad.net/ubuntu/jammy/amd64/libsctp1/1.0.19+dfsg-1build1 - import ( + "encoding/json" + "fmt" "strings" + "time" "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/service" + wsService "be.ems/src/modules/ws/service" + "github.com/gin-gonic/gin" ) // 实例化控制层 IPerfController 结构体 var NewIPerf = &IPerfController{ iperfService: service.NewIPerf, + wsService: wsService.NewWS, } -// iperf 网络性能测试工具 +// iperf 网络性能测试工具 https://iperf.fr/iperf-download.php // // PATH /tool/iperf type IPerfController struct { - // IPerf3 网络性能测试工具服务 - iperfService *service.IPerf + iperfService *service.IPerf // IPerf3 网络性能测试工具服务 + wsService *wsService.WS // WebSocket 服务 } // iperf 版本信息 @@ -51,7 +56,7 @@ func (s *IPerfController) Version(c *gin.Context) { // iperf 软件安装 // -// GET /i +// POST /i func (s *IPerfController) Install(c *gin.Context) { language := ctx.AcceptLanguage(c) var body struct { @@ -67,5 +72,81 @@ func (s *IPerfController) Install(c *gin.Context) { c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkData(nil)) + c.JSON(200, result.Ok(nil)) +} + +// iperf 软件运行 +// +// GET /run +func (s *IPerfController) Run(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeId string `form:"neId" binding:"required"` // 网元标识id + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 登录用户信息 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) + return + } + + // 网元主机的SSH客户端 + sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + defer sshClient.Close() + // ssh连接会话 + clientSession, err := sshClient.NewClientSession(query.Cols, query.Rows) + if err != nil { + c.JSON(200, result.ErrMsg("neinfo ssh client session new err")) + return + } + defer clientSession.Close() + + // 将 HTTP 连接升级为 WebSocket 连接 + wsConn := s.wsService.UpgraderWs(c.Writer, c.Request) + if wsConn == nil { + return + } + defer wsConn.Close() + + wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) + go s.wsService.ClientWriteListen(wsClient) + go s.wsService.ClientReadListen(wsClient, s.iperfService.Run) + + // 等待1秒,排空首次消息 + time.Sleep(1 * time.Second) + _ = clientSession.Read() + + // 实时读取Run消息直接输出 + msTicker := time.NewTicker(100 * time.Millisecond) + defer msTicker.Stop() + for { + select { + case ms := <-msTicker.C: + outputByte := clientSession.Read() + if len(outputByte) > 0 { + outputStr := string(outputByte) + msgByte, _ := json.Marshal(result.Ok(map[string]any{ + "requestId": fmt.Sprintf("iperf3_%d", ms.UnixMilli()), + "data": outputStr, + })) + wsClient.MsgChan <- msgByte + } + case <-wsClient.StopChan: // 等待停止信号 + s.wsService.ClientClose(wsClient.ID) + logger.Infof("ws Stop Client UID %s", wsClient.BindUid) + return + } + } } diff --git a/src/modules/tool/model/iperf.go b/src/modules/tool/model/iperf.go deleted file mode 100644 index 54950d43..00000000 --- a/src/modules/tool/model/iperf.go +++ /dev/null @@ -1,8 +0,0 @@ -package model - -// IPerf G6关系图数据对象 chart_graph -type IPerf struct { - RowID int64 `json:"rowId,omitempty" gorm:"column:row_id;primaryKey;autoIncrement"` // 记录ID - RowType string `json:"rowType,omitempty" gorm:"column:row_type"` // 记录类型(node/edge/combo) - RowGroup string `json:"rowGroup,omitempty" gorm:"column:row_group"` // 记录组名 -} diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index 947d419a..ae204513 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -1,12 +1,18 @@ package service import ( + "encoding/json" "fmt" "io" "strings" + "time" "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/ssh" + "be.ems/src/framework/vo/result" neService "be.ems/src/modules/network_element/service" + wsModel "be.ems/src/modules/ws/model" ) // 实例化服务层 IPerf 结构体 @@ -108,3 +114,139 @@ func (s *IPerf) Install(meType, neId string) error { } return err } + +// Run 接收IPerf3终端交互业务处理 +func (s *IPerf) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { + // 必传requestId确认消息 + if reqMsg.RequestID == "" { + msg := "message requestId is required" + logger.Infof("ws IPerf3 Run UID %s err: %s", client.BindUid, msg) + msgByte, _ := json.Marshal(result.ErrMsg(msg)) + client.MsgChan <- msgByte + return + } + + var resByte []byte + var err error + + switch reqMsg.Type { + case "close": + // 主动关闭 + resultByte, _ := json.Marshal(result.OkMsg("user initiated closure")) + client.MsgChan <- resultByte + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + return + case "iperf3": + // SSH会话消息接收写入会话 + var command string + command, err = s.parseOptions(reqMsg.Data) + if command != "" && err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write(command) + } + case "ctrl-c": + // 模拟按下 Ctrl+C + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + _, err = sshClientSession.Write("\u0003\n") + case "resize": + // 会话窗口重置 + msgByte, _ := json.Marshal(reqMsg.Data) + var data struct { + Cols int `json:"cols"` + Rows int `json:"rows"` + } + err = json.Unmarshal(msgByte, &data) + if err == nil { + sshClientSession := client.ChildConn.(*ssh.SSHClientSession) + err = sshClientSession.Session.WindowChange(data.Rows, data.Cols) + } + default: + err = fmt.Errorf("message type %s not supported", reqMsg.Type) + } + + if err != nil { + logger.Warnf("ws IPerf3 Run UID %s err: %s", client.BindUid, err.Error()) + msgByte, _ := json.Marshal(result.ErrMsg(err.Error())) + client.MsgChan <- msgByte + if err == io.EOF { + // 等待1s后关闭连接 + time.Sleep(1 * time.Second) + client.StopChan <- struct{}{} + } + return + } + if len(resByte) > 0 { + client.MsgChan <- resByte + } +} + +// parseOptions 解析拼装iperf3命令 iperf [-s|-c host] [options] +func (s *IPerf) parseOptions(reqData any) (string, error) { + msgByte, _ := json.Marshal(reqData) + var data struct { + Command string `json:"command"` // 命令字符串 + Client bool `json:"client"` // 服务端或客户端,默认服务端 + Host string `json:"host"` // 客户端连接到的服务端IP地址 + // Server or Client + Port int `json:"port"` // 服务端口 + Interval int `json:"interval"` // 每次报告之间的时间间隔,单位为秒 + // Server + OneOff bool `json:"oneOff"` // 只进行一次连接 + // Client + UDP bool `json:"udp"` // use UDP rather than TCP + Time int `json:"time"` // 以秒为单位的传输时间(默认为 10 秒) + Reverse bool `json:"reverse"` // 以反向模式运行(服务器发送,客户端接收) + Window string `json:"window"` // 设置窗口大小/套接字缓冲区大小 + } + if err := json.Unmarshal(msgByte, &data); err != nil { + logger.Warnf("ws processor parseClient err: %s", err.Error()) + return "", fmt.Errorf("query data structure error") + } + + command := []string{"iperf3"} + // 命令字符串高优先级 + if data.Command != "" { + command = append(command, data.Command) + command = append(command, "\n") + return strings.Join(command, " "), nil + } + + if data.Client && data.Host == "" { + return "", fmt.Errorf("query data client host empty") + } + if !data.Client { + command = append(command, "-s") + // Server + if data.OneOff { + command = append(command, "-1") + } + } else { + command = append(command, "-c") + command = append(command, data.Host) + // Client + if data.UDP { + command = append(command, "-u") + } + if data.Time > 0 { + command = append(command, fmt.Sprintf("-t %d", data.Time)) + } + if data.Reverse { + command = append(command, "-R") + } + if data.Window != "" { + command = append(command, fmt.Sprintf("-w %s", data.Window)) + } + } + + // Server or Client + if data.Port > 0 { + command = append(command, fmt.Sprintf("-p %d", data.Port)) + } + if data.Interval > 0 { + command = append(command, fmt.Sprintf("-i %d", data.Interval)) + } + command = append(command, "\n") + return strings.Join(command, " "), nil +} From 6e8472d2e87a9bc4c3b3d15db9a954721e4eea8c Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 11 Oct 2024 09:54:08 +0800 Subject: [PATCH 14/69] =?UTF-8?q?fix:=20ws=E5=B7=A5=E5=85=B7net=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=B1=9E=E6=80=A7=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/ws/model/net_connect.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/ws/model/net_connect.go b/src/modules/ws/model/net_connect.go index 6b67edb6..0c246897 100644 --- a/src/modules/ws/model/net_connect.go +++ b/src/modules/ws/model/net_connect.go @@ -6,8 +6,8 @@ import "github.com/shirou/gopsutil/v4/net" type NetConnectData struct { Type string `json:"type"` Status string `json:"status"` - Laddr net.Addr `json:"localaddr"` - Raddr net.Addr `json:"remoteaddr"` + Laddr net.Addr `json:"localAddr"` + Raddr net.Addr `json:"remoteAddr"` PID int32 `json:"pid"` Name string `json:"name"` } From b55ce9e2901bff1913f434d07bdee102f471f487 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 11 Oct 2024 16:29:14 +0800 Subject: [PATCH 15/69] =?UTF-8?q?fix:=20MML=E5=91=BD=E4=BB=A4=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=94=B9=E4=B8=BA=E7=BD=91=E5=85=83=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AEtelnet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/etc/default/restconf.yaml | 4 - features/mml/mml.go | 960 +++++++++++++++---------------- restagent/config/config.go | 4 - 3 files changed, 469 insertions(+), 499 deletions(-) diff --git a/config/etc/default/restconf.yaml b/config/etc/default/restconf.yaml index 7c7211eb..60d882ab 100644 --- a/config/etc/default/restconf.yaml +++ b/config/etc/default/restconf.yaml @@ -69,15 +69,11 @@ redis: # sleep: time delay for after write buffer (millisecond) # deadLine: timeout for io read and write (second) mml: - port: 4100 - port2: 5002 sleep: 200 deadLine: 10 sizeRow: 600 sizeCol: 128 bufferSize: 65535 - user: admin - password: admin mmlHome: ./mmlhome # Tracking configuration diff --git a/features/mml/mml.go b/features/mml/mml.go index 04417737..537b0cde 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -10,15 +10,15 @@ import ( "strings" "time" - "be.ems/lib/dborm" + "be.ems/lib/core/ctx" "be.ems/lib/global" "be.ems/lib/log" "be.ems/lib/mmlp" "be.ems/lib/services" "be.ems/restagent/config" - tokenConst "be.ems/src/framework/constants/token" - "github.com/gorilla/mux" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" ) // const ( @@ -74,30 +74,463 @@ func InitMML() { func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { log.Info("PostMML2ToNF processing... ") - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - neInfo := new(dborm.NeInfo) - params := r.URL.Query() - neId := params["ne_id"] - neInfo, err := dborm.XormGetNeInfo(neType, neId[0]) - if err != nil { - log.Error("Failed to dborm.XormGetNeInfo:", err) - services.ResponseInternalServerError500ProcessError(w, err) + neType := ctx.GetParam(r, "elementTypeValue") + neId := ctx.GetQuery(r, "ne_id") + if neId == "" { + log.Error("NOT FOUND ne_id") + services.ResponseBadRequest400WrongParamValue(w) return } + log.Debug("neType:", neType, "neId", neId) + + neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + if len(neInfoArr) < 1 { + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + neInfo := neInfoArr[0] + if neInfo.NeId != neId || neInfo.IP == "" || len(neInfo.Hosts) < 2 { + services.ResponseWithJson(w, 200, map[string]any{ + "code": 0, + "msg": "neInfo not found", + }) + return + } + telnetHost := neInfo.Hosts[1] buf := make([]byte, BUFFER_SIZE) var n int var mmlResult []string - port2 := 5002 - if config.GetYamlConfig().MML.Port2 != 0 { - port2 = config.GetYamlConfig().MML.Port2 + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + // localAddr := conn.LocalAddr() + // remoteAddr := conn.RemoteAddr() + // if localAddr == nil || remoteAddr == nil { + // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + + // 发送窗口大小设置命令 + conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE + conn.Write([]byte{ + 255, 250, 31, + byte(WIN_COL_SIZE >> 8), byte(WIN_COL_SIZE & 0xFF), + byte(WIN_ROW_SIZE >> 8), byte(WIN_ROW_SIZE & 0xFF), + 255, 240, + }) // 发送设置 WINDOW SIZE + + conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) + loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) + _, err = conn.Write([]byte(loginStr)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return } - if neInfo != nil { - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, port2) + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0:n])) + + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("Failed to ReadAll:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + for _, mml := range mmlRequest.MML { + mmlCommand := fmt.Sprintf("%s\n", mml) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + log.Trace(string(buf[0 : n-len(neType)-2])) + re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 + //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 + re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 + //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) + result := re1.ReplaceAllString(string(buf[0:n]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + } + + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) +} + +func PostMMLToNF(w http.ResponseWriter, r *http.Request) { + log.Debug("PostMMLToNF processing... ") + + // token, err := services.CheckExtValidRequest(w, r) + // if err != nil { + // log.Error("Request error:", err) + // return + // } + // 经过测试,linux下,延时需要大于100ms + // var TIME_DELAY_AFTER_WRITE time.Duration = 200 + // var TIME_DEAD_LINE time.Duration = 10 + // if config.GetYamlConfig().MML.Sleep != 0 { + // TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) + // } + // if config.GetYamlConfig().MML.DeadLine != 0 { + // TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) + // } + + neType := ctx.GetParam(r, "elementTypeValue") + neId := ctx.GetQuery(r, "ne_id") + if neId == "" { + log.Error("NOT FOUND ne_id") + services.ResponseBadRequest400WrongParamValue(w) + return + } + log.Debug("neType:", neType, "neId", neId) + + if strings.ToLower(neType) == "omc" { + PostMMLToOMC(w, r) + return + } + + neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + if len(neInfoArr) < 1 { + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + neInfo := neInfoArr[0] + if neInfo.NeId != neId || neInfo.IP == "" || len(neInfo.Hosts) < 2 { + services.ResponseWithJson(w, 200, map[string]any{ + "code": 0, + "msg": "neInfo not found", + }) + return + } + telnetHost := neInfo.Hosts[1] + + var buf [20 * 1024]byte + //buf := make([]byte, 0) + var n int + var mmlResult []string + switch strings.ToLower(neType) { + case "xxx": + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + // hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) + // conn, err := net.Dial("tcp", hostMML) + // if err != nil { + // errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // defer conn.Close() + + // conn.SetDeadline(time.Now().Add(10 * time.Second)) + // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + // _, err = conn.Write([]byte(loginStr)) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + // n, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + for _, mml := range mmlRequest.MML { + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) + + loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) + _, err = conn.Write([]byte(loginStr)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + mmlCommand := fmt.Sprintf("%s\n", mml) + log.Debug("mml command:", mmlCommand) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + //response := Response{mmlResult} + //services.ResponseWithJson(w, http.StatusOK, response) + //return + continue + } + log.Trace(string(buf[0 : n-len(neType)-2])) + + re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 + //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 + re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 + //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) + // upf telnet buffer只能读取一次,需要去掉前面的多余字符 + //result := re1.ReplaceAllString(string(buf[config.GetYamlConfig().MML.UpfHeaderLength:n-len(neType)-2]), "") + result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + conn.Close() + //mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) + + // can't read buffer from upf telnet server, so return ok always + // mmlResult = append(mmlResult, "COMMAND OK\n") + } + case "ims": + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) + conn, err := net.Dial("tcp", hostMML) + if err != nil { + errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) + log.Error(errMsg) + mmlResult = append(mmlResult, errMsg) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + defer conn.Close() + + // localAddr := conn.LocalAddr() + // remoteAddr := conn.RemoteAddr() + // if localAddr == nil || remoteAddr == nil { + // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) + // log.Error(errMsg) + // mmlResult = append(mmlResult, errMsg) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) + + _, err = conn.Write([]byte(telnetHost.User + "\r\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0:n])) + + _, err = conn.Write([]byte(telnetHost.Password + "\r\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // loginStr := fmt.Sprintf("%s\r\n%s\r\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + // _, err = conn.Write([]byte(loginStr)) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0 : n-len(neType)-2])) + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + for _, mml := range mmlRequest.MML { + mmlCommand := fmt.Sprintf("%s\r\n", mml) + log.Debug("mml command:", mmlCommand) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + continue + } + log.Trace(string(buf[0 : n-len(neType)-2])) + + re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 + //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 + re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 + //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) + result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") + result = re2.ReplaceAllString(result, "") + mmlResult = append(mmlResult, result) + } + default: + hostMML := fmt.Sprintf("%s:%d", telnetHost.Addr, telnetHost.Port) conn, err := net.Dial("tcp", hostMML) - //conn, err := net.Dial("tcp", hostMML) if err != nil { errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) log.Error(errMsg) @@ -119,17 +552,8 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { // return // } - // 发送窗口大小设置命令 - conn.Write([]byte{255, 251, 31}) // 发送WILL WINDOW SIZE - conn.Write([]byte{ - 255, 250, 31, - byte(WIN_COL_SIZE >> 8), byte(WIN_COL_SIZE & 0xFF), - byte(WIN_ROW_SIZE >> 8), byte(WIN_ROW_SIZE & 0xFF), - 255, 240, - }) // 发送设置 WINDOW SIZE - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + loginStr := fmt.Sprintf("%s\n%s\n", telnetHost.User, telnetHost.Password) _, err = conn.Write([]byte(loginStr)) if err != nil { log.Error("Failed to write:", err) @@ -189,455 +613,10 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n]), "") + result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") result = re2.ReplaceAllString(result, "") mmlResult = append(mmlResult, result) } - - } - - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) -} - -func PostMMLToNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostMMLToNF processing... ") - - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - // 经过测试,linux下,延时需要大于100ms - // var TIME_DELAY_AFTER_WRITE time.Duration = 200 - // var TIME_DEAD_LINE time.Duration = 10 - // if config.GetYamlConfig().MML.Sleep != 0 { - // TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) - // } - // if config.GetYamlConfig().MML.DeadLine != 0 { - // TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) - // } - - pack := "mml" - vars := mux.Vars(r) - module := vars["managedType"] - neType := vars["elementTypeValue"] - params := r.URL.Query() - neId := params["ne_id"] - if len(neId) == 0 { - log.Error("NOT FOUND ne_id") - services.ResponseBadRequest400WrongParamValue(w) - return - } - log.Debug("neType:", neType, "neId", neId) - - log.Debugf("method:%s, managementType:%s dbname:%s, tbname:%s pack:%s", r.Method, module, neType, neId[0], pack) - - var buf [20 * 1024]byte - //buf := make([]byte, 0) - var n int - var mmlResult []string - - // exist, err := services.CheckUserPermission(token, strings.ToLower(r.Method), module, neType, neId[0], pack) - // if err != nil { - // log.Error("Failed to get permission:", err) - // errMsg := fmt.Sprintf("RetCode = -1 operation failed: do not have the operation permissions") - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // //services.ResponseForbidden403NotPermission(w) - // return - // } - // if !exist { - // log.Error("Not permission!") - // errMsg := fmt.Sprintf("RetCode = -1 operation failed: do not have the operation permissions") - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // //services.ResponseForbidden403NotPermission(w) - // return - // } - - if strings.ToLower(neType) == "omc" { - PostMMLToOMC(w, r) - return - } - - neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo(neType, neId[0]) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) - services.ResponseInternalServerError500DatabaseOperationFailed(w) - return - } - - if neInfo != nil { - switch strings.ToLower(neType) { - case "xxx": - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - // conn, err := net.Dial("tcp", hostMML) - // if err != nil { - // errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // defer conn.Close() - - // conn.SetDeadline(time.Now().Add(10 * time.Second)) - // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - // _, err = conn.Write([]byte(loginStr)) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // n, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // n, err = conn.Read(buf[0:]) - // if err != nil { - // log.Error("Failed to read:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // log.Debug(string(buf[0:n])) - - for _, mml := range mmlRequest.MML { - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - mmlCommand := fmt.Sprintf("%s\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - //response := Response{mmlResult} - //services.ResponseWithJson(w, http.StatusOK, response) - //return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 - //result := re1.ReplaceAllString(string(buf[config.GetYamlConfig().MML.UpfHeaderLength:n-len(neType)-2]), "") - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - conn.Close() - //mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) - - // can't read buffer from upf telnet server, so return ok always - // mmlResult = append(mmlResult, "COMMAND OK\n") - } - case "ims": - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - // loginStr := fmt.Sprintf("%s\r\n%s\r\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - // _, err = conn.Write([]byte(loginStr)) - // if err != nil { - // log.Error("Failed to write:", err) - // mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\r\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - } - default: - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - mmlResult = append(mmlResult, errMsg) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - defer conn.Close() - - // localAddr := conn.LocalAddr() - // remoteAddr := conn.RemoteAddr() - // if localAddr == nil || remoteAddr == nil { - // errMsg := fmt.Sprintf("connect invalid: localAddr=%v, remoteAddr=%v", localAddr, remoteAddr) - // log.Error(errMsg) - // mmlResult = append(mmlResult, errMsg) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - // } - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - response := Response{mmlResult} - services.ResponseWithJson(w, http.StatusOK, response) - return - } - log.Trace(string(buf[0:n])) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to ReadAll:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\n", mml) - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - mmlResult = append(mmlResult, err.Error()) - // response := Response{mmlResult} - // services.ResponseWithJson(w, http.StatusOK, response) - // return - continue - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - mmlResult = append(mmlResult, result) - } - } } response := Response{mmlResult} @@ -647,28 +626,28 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { log.Debug("PostMMLToOMC processing... ") - // token, err := services.CheckExtValidRequest(w, r) - // if err != nil { - // log.Error("Failed to CheckMmlValidRequest:", err) - // return - // } - - params := r.URL.Query() - neId := params["ne_id"] - if len(neId) == 0 { - log.Error("NOT FOUND ne_id ") + neType := "OMC" //ctx.GetParam(r, "elementTypeValue") + neId := ctx.GetQuery(r, "ne_id") + if neId == "" { + log.Error("NOT FOUND ne_id") services.ResponseBadRequest400WrongParamValue(w) return } + log.Debug("neType:", neType, "neId", neId) - neInfo := new(dborm.NeInfo) - neInfo, err := dborm.XormGetNeInfo("OMC", neId[0]) - if err != nil { - log.Error("dborm.XormGetNeInfo is failed:", err) + neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) + if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return } - log.Trace("neInfo:", neInfo) + neInfo := neInfoArr[0] + if neInfo.NeId != neId || neInfo.IP == "" { + services.ResponseWithJson(w, 200, map[string]any{ + "code": 0, + "msg": "neInfo not found", + }) + return + } body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) if err != nil { @@ -678,8 +657,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { } log.Trace("Body:", string(body)) - hostUri := fmt.Sprintf("http://%s:%s", neInfo.Ip, neInfo.Port) - + hostUri := fmt.Sprintf("http://%s:%d", neInfo.IP, neInfo.Port) omcMmlVar := &mmlp.MmlVar{ Version: global.Version, Output: mmlp.DefaultFormatType, diff --git a/restagent/config/config.go b/restagent/config/config.go index 00c900f8..8f4951c5 100644 --- a/restagent/config/config.go +++ b/restagent/config/config.go @@ -184,15 +184,11 @@ type AlarmConfig struct { } type MMLParam struct { - Port int `yaml:"port"` - Port2 int `yaml:"port2"` Sleep int64 `yaml:"sleep"` DeadLine int64 `yaml:"deadLine"` SizeRow int16 `yaml:"sizeRow"` SizeCol int16 `yaml:"sizeCol"` BufferSize int `yaml:"bufferSize"` - User string `yaml:"user"` - Password string `ymal:"password"` MmlHome string `yaml:"mmlHome"` } From b8e090f5ad08bfcf6f10d4dda566d1412b380817 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 11 Oct 2024 16:29:41 +0800 Subject: [PATCH 16/69] =?UTF-8?q?style:=20=E8=A1=A5=E5=85=85=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/service/perf_kpi.impl.go | 2 +- src/modules/network_element/model/ne_host.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go index a7174faf..f34f5508 100644 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ b/src/modules/network_data/service/perf_kpi.impl.go @@ -63,7 +63,7 @@ func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID string, day int) map[stri return info } } - + // down * 8 / 1000 / 1000 单位M info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) if v, ok := info["up"]; ok && v == nil { info["up"] = 0 diff --git a/src/modules/network_element/model/ne_host.go b/src/modules/network_element/model/ne_host.go index ba7362b2..42409328 100644 --- a/src/modules/network_element/model/ne_host.go +++ b/src/modules/network_element/model/ne_host.go @@ -5,11 +5,11 @@ import "encoding/json" // NeHost 网元主机表 ne_host type NeHost struct { HostID string `json:"hostId" gorm:"column:host_id"` // 主机主键 - HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet"` // 主机类型 ssh telnet + HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet"` // 主机类型 ssh telnet redis GroupID string `json:"groupId" gorm:"column:group_id"` // 分组(0默认 1网元 2系统) Title string `json:"title" gorm:"column:title"` // 标题名称 Addr string `json:"addr" gorm:"column:addr" binding:"required"` // 主机地址 - Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // SSH端口 + Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // 主机端口 22 4100 User string `json:"user" gorm:"column:user" binding:"required"` // 主机用户名 AuthMode string `json:"authMode" gorm:"column:auth_mode" binding:"oneof=0 1 2"` // 认证模式(0密码 1主机私钥 2已免密) Password string `json:"password" gorm:"column:password"` // 认证密码 From b5e7317ee7e81af23af037c495d3a5777937a74d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 11 Oct 2024 18:49:48 +0800 Subject: [PATCH 17/69] =?UTF-8?q?sql:=20=E7=B3=BB=E7=BB=9F=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=96=B0=E5=A2=9E=E5=B7=A5=E5=85=B7=E6=A0=8F=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_dict_data1_i18n_zh.sql | 14 +++++++------- database/install/sys_dict_data2_i18n_en.sql | 12 ++++++------ database/install/sys_menu.sql | 12 +++++++++--- database/install/sys_role_menu.sql | 1 - database/upgrade/upg_sys_dict_data1_i18n_zh.sql | 16 ++++++++-------- database/upgrade/upg_sys_dict_data2_i18n_en.sql | 14 +++++++------- database/upgrade/upg_sys_menu.sql | 12 +++++++++--- database/upgrade/upg_sys_role_menu.sql | 1 - 8 files changed, 46 insertions(+), 36 deletions(-) diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 1ae08d32..3967cc57 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -120,9 +120,9 @@ INSERT INTO `sys_dict_data` VALUES (1112, 1112, 'menu.perf.task', '任务管理' INSERT INTO `sys_dict_data` VALUES (1113, 1113, 'menu.perf.data', '性能数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.report', '性能报表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1115, 1115, 'menu.perf.threshold', '性能门限', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '黄金指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '关键指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1117, 1117, 'menu.perf.customTarget', '自定义指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.set', '性能通用设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.kpiKeyTarget', '关键指标报表', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1119, 1119, 'menu.mml', 'MML', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1120, 1120, 'menu.mml.ne', '网元操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1121, 1121, 'menu.mml.udm', 'UDM操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -134,7 +134,7 @@ INSERT INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.reportRemark', '性 INSERT INTO `sys_dict_data` VALUES (1127, 1127, 'menu.perf.thresholdRemark', '性能门限菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1128, 1128, 'menu.perf.kpiRemark', '黄金指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1129, 1129, 'menu.perf.customTargetRemark', '自定义指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1131, 1131, 'menu.mmlRemark', 'MML管理目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1132, 1132, 'menu.mml.neRemark', '网元操作菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1133, 1133, 'menu.mml.udmRemark', '网元UDM用户数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -208,8 +208,8 @@ INSERT INTO `sys_dict_data` VALUES (1426, 1426, 'dictData.trace.user', '用户 -- INSERT INTO `sys_dict_data` VALUES (1444, 1444, 'dictData.securityLogType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- INSERT INTO `sys_dict_data` VALUES (1445, 1445, 'dictData.securityLogType.lock', '锁定', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- INSERT INTO `sys_dict_data` VALUES (1446, 1446, 'dictData.securityLogType.unlock', '解锁', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (1447, 1447, 'dictData.securityLogType.reset', '重置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (1448, 1448, 'dictData.securityLogType.deactivate', '停用', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1447, 1447, 'menu.tools.ping', '网络探测测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1448, 1448, 'menu.tools.iperf', '网络性能测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1449, 1449, 'dictData.jobSaveLog.no', '不记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1450, 1450, 'dictData.jobSaveLog.yes', '记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1451, 1451, 'dictData.neVersionStatus.upload', '已上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -239,9 +239,9 @@ INSERT INTO `sys_dict_data` VALUES (1505, 1505, 'dictType.sys_yes_no', '系统 INSERT INTO `sys_dict_data` VALUES (1506, 1506, 'dictType.sys_oper_type', '操作类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1507, 1507, 'dictType.sys_common_status', '系统状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1508, 1508, 'dictType.trace_type', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (1509, 1509, 'dictType.operation_log_type', '操作日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '程序运行进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1510, 1510, 'dictType.alarm_status', '告警日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (1511, 1511, 'dictType.security_log_type', '安全日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '网络连接进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1512, 1512, 'dictType.ne_version_status', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1513, 1513, 'dictType.i18n_en', '多语言-英文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1514, 1514, 'dictType.i18n_zh', '多语言-中文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index f3188862..61e18dfa 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -122,7 +122,7 @@ INSERT INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.report', 'Performance INSERT INTO `sys_dict_data` VALUES (3115, 3115, 'menu.perf.threshold', 'Performance Thresholds', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3116, 3116, 'menu.perf.kpi', 'Key Performance Indicators', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Indicator Management', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.set', 'Performance General Settings', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.kpiKeyTarget', 'Key Performance Reports', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3119, 3119, 'menu.mml', 'MML', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3120, 3120, 'menu.mml.ne', 'NE Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3121, 3121, 'menu.mml.udm', 'UDM Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -134,7 +134,7 @@ INSERT INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.reportRemark', 'Perfo INSERT INTO `sys_dict_data` VALUES (3127, 3127, 'menu.perf.thresholdRemark', 'Performance Threshold Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3128, 3128, 'menu.perf.kpiRemark', 'Key Performance Indicator Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Indicator Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3131, 3131, 'menu.mmlRemark', 'MML Management Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3132, 3132, 'menu.mml.neRemark', 'Network Element Operations Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3133, 3133, 'menu.mml.udmRemark', 'Network Element UDM User Data Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -208,8 +208,8 @@ INSERT INTO `sys_dict_data` VALUES (3426, 3426, 'dictData.trace.user', 'User Tra -- INSERT INTO `sys_dict_data` VALUES (3444, 3444, 'dictData.securityLogType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- INSERT INTO `sys_dict_data` VALUES (3445, 3445, 'dictData.securityLogType.lock', 'Locked', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- INSERT INTO `sys_dict_data` VALUES (3446, 3446, 'dictData.securityLogType.unlock', 'Unlock', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (3447, 3447, 'dictData.securityLogType.reset', 'Reset', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (3448, 3448, 'dictData.securityLogType.deactivate', 'Deactivate', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3447, 3447, 'menu.tools.ping', 'Net Probing Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3448, 3448, 'menu.tools.iperf', 'Net Performance Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3449, 3449, 'dictData.jobSaveLog.no', 'No Record', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3450, 3450, 'dictData.jobSaveLog.yes', 'Recorded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3451, 3451, 'dictData.neVersionStatus.upload', 'Uploaded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -239,9 +239,9 @@ INSERT INTO `sys_dict_data` VALUES (3505, 3505, 'dictType.sys_yes_no', 'System o INSERT INTO `sys_dict_data` VALUES (3506, 3506, 'dictType.sys_oper_type', 'Operation Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3507, 3507, 'dictType.sys_common_status', 'System Status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3508, 3508, 'dictType.trace_type', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (3509, 3509, 'dictType.operation_log_type', 'Operation Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Program Running Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3510, 3510, 'dictType.alarm_status', 'Alarm Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- INSERT INTO `sys_dict_data` VALUES (3511, 3511, 'dictType.security_log_type', 'Security Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Net Connection Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3512, 3512, 'dictType.ne_version_status', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3513, 3513, 'dictType.i18n_en', 'Multi-language - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3514, 3514, 'dictType.i18n_en', 'Multi-language - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index a4f116a4..da713786 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -49,6 +49,12 @@ CREATE TABLE `sys_menu` ( INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); INSERT INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); INSERT INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); +INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); +INSERT INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 8, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); +INSERT INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 9, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); +INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); INSERT INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); INSERT INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); INSERT INTO `sys_menu` VALUES (102, 'menu.security.roleUser', 2113, 3, 'role/inline/auth-user/:roleId', 'system/role/auth-user', '1', '1', 'M', '0', '1', 'system:role:auth', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleUserRemark'); @@ -146,9 +152,9 @@ INSERT INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'p INSERT INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '1', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); INSERT INTO `sys_menu` VALUES (2102, 'menu.perf.report', 2099, 3, 'perfReport', 'perfManage/perfReport/index', '1', '0', 'M', '0', '0', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.reportRemark'); INSERT INTO `sys_menu` VALUES (2103, 'menu.perf.threshold', 2099, 4, 'perfThreshold', 'perfManage/perfThreshold/index', '1', '0', 'M', '0', '0', 'perfManage:perfThreshold:index', 'icon-zhuanrang', 'supervisor', 1700000000000, 'supervisor', 1715417264697, 'menu.perf.thresholdRemark'); -INSERT INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 5, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); -INSERT INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 6, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); -INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.set', 2099, 7, 'perfSet', 'perfManage/perfSet/index', '1', '0', 'M', '0', '0', 'perfManage:perfSet:index', 'icon-gonggao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.setRemark'); +INSERT INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 11, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); +INSERT INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); +INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 13, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '0', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); INSERT INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-zhizuoliucheng', 'supervisor', 1700000000000, NULL, 0, 'menu.mmlRemark'); INSERT INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlManage/neOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:neOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.neRemark'); INSERT INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); diff --git a/database/install/sys_role_menu.sql b/database/install/sys_role_menu.sql index 5191ee51..22428ff4 100644 --- a/database/install/sys_role_menu.sql +++ b/database/install/sys_role_menu.sql @@ -104,7 +104,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2102); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2105); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2106); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2109); diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index 1a0b62c1..31572e63 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -127,9 +127,9 @@ REPLACE INTO `sys_dict_data` VALUES (1112, 1112, 'menu.perf.task', '任务管理 REPLACE INTO `sys_dict_data` VALUES (1113, 1113, 'menu.perf.data', '性能数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.report', '性能报表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1115, 1115, 'menu.perf.threshold', '性能门限', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '黄金指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '关键指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1117, 1117, 'menu.perf.customTarget', '自定义指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.set', '性能通用设置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1118, 1118, 'menu.perf.kpiKeyTarget', '关键指标报表', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1119, 1119, 'menu.mml', 'MML', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1120, 1120, 'menu.mml.ne', '网元操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1121, 1121, 'menu.mml.udm', 'UDM操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -141,7 +141,7 @@ REPLACE INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.reportRemark', '性 REPLACE INTO `sys_dict_data` VALUES (1127, 1127, 'menu.perf.thresholdRemark', '性能门限菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1128, 1128, 'menu.perf.kpiRemark', '黄金指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1129, 1129, 'menu.perf.customTargetRemark', '自定义指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1130, 1130, 'menu.perf.setRemark', '性能通用设置菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1131, 1131, 'menu.mmlRemark', 'MML管理目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1132, 1132, 'menu.mml.neRemark', '网元操作菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1133, 1133, 'menu.mml.udmRemark', '网元UDM用户数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -215,8 +215,8 @@ REPLACE INTO `sys_dict_data` VALUES (1426, 1426, 'dictData.trace.user', '用户 -- REPLACE INTO `sys_dict_data` VALUES (1444, 1444, 'dictData.securityLogType.delete', '删除', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- REPLACE INTO `sys_dict_data` VALUES (1445, 1445, 'dictData.securityLogType.lock', '锁定', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- REPLACE INTO `sys_dict_data` VALUES (1446, 1446, 'dictData.securityLogType.unlock', '解锁', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (1447, 1447, 'dictData.securityLogType.reset', '重置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (1448, 1448, 'dictData.securityLogType.deactivate', '停用', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1447, 1447, 'menu.tools.ping', '网络探测测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1448, 1448, 'menu.tools.iperf', '网络性能测试', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1449, 1449, 'dictData.jobSaveLog.no', '不记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1450, 1450, 'dictData.jobSaveLog.yes', '记录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1451, 1451, 'dictData.neVersionStatus.upload', '已上传', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -246,9 +246,9 @@ REPLACE INTO `sys_dict_data` VALUES (1505, 1505, 'dictType.sys_yes_no', '系统 REPLACE INTO `sys_dict_data` VALUES (1506, 1506, 'dictType.sys_oper_type', '操作类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1507, 1507, 'dictType.sys_common_status', '系统状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1508, 1508, 'dictType.trace_type', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (1509, 1509, 'dictType.operation_log_type', '操作日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '程序运行进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1510, 1510, 'dictType.alarm_status', '告警日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (1511, 1511, 'dictType.security_log_type', '安全日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '网络连接进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1512, 1512, 'dictType.ne_version_status', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1513, 1513, 'dictType.i18n_en', '多语言-英文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1514, 1514, 'dictType.i18n_zh', '多语言-中文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -663,7 +663,7 @@ REPLACE INTO `sys_dict_data` VALUES (2145, 2145, 'menu.system.user.editPost', ' REPLACE INTO `sys_dict_data` VALUES (2146, 2146, 'menu.dashboard.smscCDR', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1717051745866, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2147, 2147, 'log.operate.title.smscCDR', '短信话单', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2148, 2148, 'menu.trace.pcapFile', '信令抓包文件', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); --- REPLACE INTO `sys_dict_data` VALUES (2149, 2149, 'dictData.udm_sub_cn_type.2', '4G', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2149, 2149, 'menu.trace.taskAnalyze', '跟踪数据分析', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -- REPLACE INTO `sys_dict_data` VALUES (2150, 2150, 'dictData.udm_sub_cn_type.3', '5G&4G', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2151, 2151, 'menu.system.setting.doc', '系统使用文档', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2152, 2152, 'menu.system.setting.official', '官网链接', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index 42437f63..6c5ee8c7 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -127,7 +127,7 @@ REPLACE INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.report', 'Performanc REPLACE INTO `sys_dict_data` VALUES (3115, 3115, 'menu.perf.threshold', 'Performance Thresholds', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3116, 3116, 'menu.perf.kpi', 'Key Performance Indicators', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Indicator Management', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.set', 'Performance General Settings', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3118, 3118, 'menu.perf.kpiKeyTarget', 'Key Performance Reports', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3119, 3119, 'menu.mml', 'MML', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3120, 3120, 'menu.mml.ne', 'NE Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3121, 3121, 'menu.mml.udm', 'UDM Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -139,7 +139,7 @@ REPLACE INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.reportRemark', 'Perf REPLACE INTO `sys_dict_data` VALUES (3127, 3127, 'menu.perf.thresholdRemark', 'Performance Threshold Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3128, 3128, 'menu.perf.kpiRemark', 'Key Performance Indicator Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Indicator Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3130, 3130, 'menu.perf.setRemark', 'Performance General Settings Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3131, 3131, 'menu.mmlRemark', 'MML Management Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3132, 3132, 'menu.mml.neRemark', 'Network Element Operations Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3133, 3133, 'menu.mml.udmRemark', 'Network Element UDM User Data Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -209,8 +209,8 @@ REPLACE INTO `sys_dict_data` VALUES (3426, 3426, 'dictData.trace.user', 'User Tr -- REPLACE INTO `sys_dict_data` VALUES (3444, 3444, 'dictData.securityLogType.delete', 'Delete', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- REPLACE INTO `sys_dict_data` VALUES (3445, 3445, 'dictData.securityLogType.lock', 'Locked', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -- REPLACE INTO `sys_dict_data` VALUES (3446, 3446, 'dictData.securityLogType.unlock', 'Unlock', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (3447, 3447, 'dictData.securityLogType.reset', 'Reset', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (3448, 3448, 'dictData.securityLogType.deactivate', 'Deactivate', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3447, 3447, 'menu.tools.ping', 'Net Probing Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3448, 3448, 'menu.tools.iperf', 'Net Performance Test', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3449, 3449, 'dictData.jobSaveLog.no', 'No Record', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3450, 3450, 'dictData.jobSaveLog.yes', 'Recorded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3451, 3451, 'dictData.neVersionStatus.upload', 'Uploaded', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -240,9 +240,9 @@ REPLACE INTO `sys_dict_data` VALUES (3505, 3505, 'dictType.sys_yes_no', 'System REPLACE INTO `sys_dict_data` VALUES (3506, 3506, 'dictType.sys_oper_type', 'Operation Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3507, 3507, 'dictType.sys_common_status', 'System Status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3508, 3508, 'dictType.trace_type', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (3509, 3509, 'dictType.operation_log_type', 'Operation Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Program Running Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3510, 3510, 'dictType.alarm_status', 'Alarm Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); --- REPLACE INTO `sys_dict_data` VALUES (3511, 3511, 'dictType.security_log_type', 'Security Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Net Connection Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3512, 3512, 'dictType.ne_version_status', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3513, 3513, 'dictType.i18n_en', 'Multi-language - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3514, 3514, 'dictType.i18n_zh', 'Multi-language - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -658,7 +658,7 @@ REPLACE INTO `sys_dict_data` VALUES (4145, 4145, 'menu.system.user.editPost', 'M REPLACE INTO `sys_dict_data` VALUES (4146, 4146, 'menu.dashboard.smscCDR', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4147, 4147, 'log.operate.title.smscCDR', 'SMS CDR', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4148, 4148, 'menu.trace.pcapFile', 'Signaling Capture File', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); --- REPLACE INTO `sys_dict_data` VALUES (4149, 4149, 'dictData.udm_sub_cn_type.2', '4G', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4149, 4149, 'menu.trace.taskAnalyze', 'Tracking Data Analysis', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); -- REPLACE INTO `sys_dict_data` VALUES (4150, 4150, 'dictData.udm_sub_cn_type.3', '5G&4G', 'i18n_en', '', '', '1', 'supervisor', 1718441035866, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4151, 4151, 'menu.system.setting.doc', 'System User Documentation', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4152, 4152, 'menu.system.setting.official', 'Official Website', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index 9dbed4f5..73f92388 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -32,6 +32,12 @@ CREATE TABLE IF NOT EXISTS `sys_menu` ( REPLACE INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); REPLACE INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); REPLACE INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +REPLACE INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); +REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); +REPLACE INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 8, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); +REPLACE INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 9, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); +REPLACE INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); REPLACE INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); REPLACE INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); REPLACE INTO `sys_menu` VALUES (102, 'menu.security.roleUser', 2113, 3, 'role/inline/auth-user/:roleId', 'system/role/auth-user', '1', '1', 'M', '0', '1', 'system:role:auth', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleUserRemark'); @@ -129,9 +135,9 @@ REPLACE INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', ' REPLACE INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '1', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); REPLACE INTO `sys_menu` VALUES (2102, 'menu.perf.report', 2099, 3, 'perfReport', 'perfManage/perfReport/index', '1', '0', 'M', '0', '0', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.reportRemark'); REPLACE INTO `sys_menu` VALUES (2103, 'menu.perf.threshold', 2099, 4, 'perfThreshold', 'perfManage/perfThreshold/index', '1', '0', 'M', '0', '0', 'perfManage:perfThreshold:index', 'icon-zhuanrang', 'supervisor', 1700000000000, 'supervisor', 1715417264697, 'menu.perf.thresholdRemark'); -REPLACE INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 5, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); -REPLACE INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 6, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); -REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.set', 2099, 7, 'perfSet', 'perfManage/perfSet/index', '1', '0', 'M', '0', '0', 'perfManage:perfSet:index', 'icon-gonggao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.setRemark'); +REPLACE INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 11, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); +REPLACE INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); +REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 13, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '0', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); REPLACE INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-zhizuoliucheng', 'supervisor', 1700000000000, NULL, 0, 'menu.mmlRemark'); REPLACE INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlManage/neOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:neOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.neRemark'); REPLACE INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); diff --git a/database/upgrade/upg_sys_role_menu.sql b/database/upgrade/upg_sys_role_menu.sql index 1ad88c9d..5464d6bb 100644 --- a/database/upgrade/upg_sys_role_menu.sql +++ b/database/upgrade/upg_sys_role_menu.sql @@ -116,7 +116,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2102); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2105); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2106); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2109); From 5dd0ea91431f9e1d44b3e2f9deba67c8dc55ca3d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 15:26:55 +0800 Subject: [PATCH 18/69] =?UTF-8?q?perf:=20=E6=9B=B4=E6=96=B0UDM=E7=AD=BE?= =?UTF-8?q?=E7=BA=A6=E6=95=B0=E6=8D=AE=E8=A1=A8=EF=BC=8C=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=94=AF=E6=8C=81MICO=E5=92=8CRAT=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/u_sub_user.sql | 44 +++--- database/upgrade/upg_u_sub_user.sql | 91 ++++++----- .../network_data/controller/udm_auth.go | 22 +-- .../network_data/controller/udm_sub.go | 79 ++-------- src/modules/network_data/model/udm_auth.go | 14 +- src/modules/network_data/model/udm_sub.go | 56 ++++--- .../network_data/repository/udm_sub.go | 44 ++++-- src/modules/network_data/service/udm_auth.go | 42 +++-- src/modules/network_data/service/udm_sub.go | 149 ++++++++++++++---- 9 files changed, 311 insertions(+), 230 deletions(-) diff --git a/database/install/u_sub_user.sql b/database/install/u_sub_user.sql index 6b2786f4..c72c1411 100644 --- a/database/install/u_sub_user.sql +++ b/database/install/u_sub_user.sql @@ -2,33 +2,41 @@ -- Table structure for table `u_sub_user` -- -DROP TABLE IF EXISTS `u_sub_user`; - +DROP TABLE IF EXISTS `u_sub_user`; CREATE TABLE `u_sub_user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', - `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'SubUeAMBRTemp', - `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'SubSNSSAITemp', - `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'rat VIRTUAL|WLAN|EUTRA|NR', - `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'forbiddenAreasTemp', - `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'serviceAreaRestrictTemp', - `cn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'cnType EPC|5GC', + `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData', + `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubUeAMBRTemp', + `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubSNSSAITemp', + `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR', + `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData AreaForbidden', + `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData serviceAreaRestrictTemp', + `cn_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC', + `rfsp_index` varchar(50) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RfspIndex', + `reg_timer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RegTimer', + `ue_usage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData UEUsageType', + `active_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ActiveTime', + `mico` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData MICO', + `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn', + `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData GroupId', + `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat', + `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsFlag', + `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsOdb', + `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat hplmnOdb', + `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Ard', + `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Epstpl', + `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat ContextId', + `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnNum', + `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnContext', + `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名', `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smData', `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smfSel', - `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Eps', - `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'epsFlag', - `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'epsOdb', - `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'hplmnOdb', - `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Ard', - `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Epstpl', - `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ContextId', - `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'apnContext', - `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'staticIpstatic_ip指给4G UE分配的静态IP,没有可不带此字段名', `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'CAG', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_ne唯一索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM签约用户'; --- Dump completed on 2024-03-06 17:26:59 +-- Dump completed on 2024-10-12 15:26:59 diff --git a/database/upgrade/upg_u_sub_user.sql b/database/upgrade/upg_u_sub_user.sql index b3a2d46f..618c780e 100644 --- a/database/upgrade/upg_u_sub_user.sql +++ b/database/upgrade/upg_u_sub_user.sql @@ -1,54 +1,69 @@ -- -- Table structure for table `u_sub_user` -- --- DROP TABLE IF EXISTS `u_sub_user`; -CREATE TABLE IF NOT EXISTS `u_sub_user` ( +-- DROP TABLE IF EXISTS `u_sub_user`; +CREATE TABLE `u_sub_user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识', - `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'SubUeAMBRTemp', - `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'SubSNSSAITemp', - `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'rat VIRTUAL|WLAN|EUTRA|NR', - `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'forbiddenAreasTemp', - `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'serviceAreaRestrictTemp', - `cn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'cnType EPC|5GC', + `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData', + `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubUeAMBRTemp', + `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubSNSSAITemp', + `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR', + `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData AreaForbidden', + `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData serviceAreaRestrictTemp', + `cn_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC', + `rfsp_index` varchar(50) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RfspIndex', + `reg_timer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData RegTimer', + `ue_usage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData UEUsageType', + `active_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ActiveTime', + `mico` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData MICO', + `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn', + `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData GroupId', + `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat', + `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsFlag', + `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat epsOdb', + `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat hplmnOdb', + `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Ard', + `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat Epstpl', + `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat ContextId', + `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnNum', + `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat apnContext', + `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名', `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smData', `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smfSel', - `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Eps', - `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'epsFlag', - `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'epsOdb', - `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'hplmnOdb', - `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Ard', - `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Epstpl', - `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ContextId', - `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'apnContext', - `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'staticIpstatic_ip指给4G UE分配的静态IP,没有可不带此字段名', `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'CAG', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_ne唯一索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM签约用户'; --- Dump completed on 2024-03-06 17:26:59 +-- Dump completed on 2024-10-12 15:26:59 -ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'CAG' AFTER `static_ip`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID' AFTER `id`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户电话号码' AFTER `imsi`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'UDM网元标识' AFTER `msisdn`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'SubUeAMBRTemp' AFTER `ne_id`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'SubSNSSAITemp' AFTER `ambr`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'rat VIRTUAL|WLAN|EUTRA|NR' AFTER `nssai`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'forbiddenAreasTemp' AFTER `rat`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'serviceAreaRestrictTemp' AFTER `arfb`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `cn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'cnType EPC|5GC' AFTER `sar`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'smData' AFTER `cn`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData' AFTER `ne_id`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `cn_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC' AFTER `sar`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `rfsp_index` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RfspIndex' AFTER `cn_type`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `reg_timer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RegTimer' AFTER `rfsp_index`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `ue_usage_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData UEUsageType' AFTER `reg_timer`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `active_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData ActiveTime' AFTER `ue_usage_type`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `mico` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData MICO' AFTER `active_time`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn' AFTER `mico`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData GroupId' AFTER `odb_ps`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat apnNum' AFTER `context_id`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData SubUeAMBRTemp' AFTER `am_dat`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData SubSNSSAITemp' AFTER `ambr`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR' AFTER `nssai`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `arfb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData AreaForbidden' AFTER `rat`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `sar` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData serviceAreaRestrictTemp' AFTER `arfb`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat' AFTER `group_id`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat epsFlag' AFTER `eps_dat`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat epsOdb' AFTER `eps_flag`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat hplmnOdb' AFTER `eps_odb`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat Ard' AFTER `hplmn_odb`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat Epstpl' AFTER `ard`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat ContextId' AFTER `epstpl`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat apnContext' AFTER `apn_mum`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名' AFTER `apn_context`; +ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `sm_data` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'smData' AFTER `static_ip`; ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'smfSel' AFTER `sm_data`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'Eps' AFTER `smf_sel`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_flag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'epsFlag' AFTER `eps_dat`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `eps_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'epsOdb' AFTER `eps_flag`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `hplmn_odb` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'hplmnOdb' AFTER `eps_odb`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ard` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'Ard' AFTER `hplmn_odb`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `epstpl` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'Epstpl' AFTER `ard`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `context_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'ContextId' AFTER `epstpl`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `apn_context` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'apnContext' AFTER `context_id`; -ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `static_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'staticIpstatic_ip指给4G UE分配的静态IP,没有可不带此字段名' AFTER `apn_context`; +ALTER TABLE `u_sub_user` DROP COLUMN IF EXISTS `cn`; diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index c893129c..de05f3ea 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -142,7 +142,8 @@ func (s *UDMAuthController) Add(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("add authdat:imsi=%s,ki=%s,amf=%s,algo=%s,opc=%s", body.IMSI, body.Ki, body.Amf, body.AlgoIndex, body.Opc) + cmd := fmt.Sprintf("add authdat:imsi=%s,", body.IMSI) + cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -191,7 +192,8 @@ func (s *UDMAuthController) Adds(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("baa authdat:start_imsi=%s,sub_num=%s,ki=%s,amf=%s,algo=%s,opc=%s", body.IMSI, num, body.Ki, body.Amf, body.AlgoIndex, body.Opc) + cmd := fmt.Sprintf("baa authdat:start_imsi=%s,sub_num=%s,", body.IMSI, num) + cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -239,20 +241,8 @@ func (s *UDMAuthController) Edit(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("mod authdata:imsi=%s", body.IMSI) - // 修改的参数名称 - if body.Ki != "" { - cmd += fmt.Sprintf(",ki=%s", body.Ki) - } - if body.Amf != "" { - cmd += fmt.Sprintf(",amf=%s", body.Amf) - } - if body.AlgoIndex != "" { - cmd += fmt.Sprintf(",algo=%s", body.AlgoIndex) - } - if body.Opc != "" { - cmd += fmt.Sprintf(",opc=%s", body.Opc) - } + cmd := fmt.Sprintf("mod authdata:imsi=%s,", body.IMSI) + cmd += s.udmAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 7833ea35..3a7facc4 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -141,12 +141,8 @@ func (s *UDMSubController) Add(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("add udmuser:imsi=%s,msisdn=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s,cag=%s", - body.IMSI, body.MSISDN, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext, body.Cag) - // static_ip指给4G UE分配的静态IP,没有可不带此字段名,批量添加IP会自动递增 - if body.StaticIp != "" { - cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp) - } + 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())) @@ -196,8 +192,8 @@ func (s *UDMSubController) Adds(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("baa udmuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s,cag=%s", - body.IMSI, body.MSISDN, num, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext, body.Cag) + 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) @@ -249,65 +245,8 @@ func (s *UDMSubController) Edit(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("mod udmuser:imsi=%s", body.IMSI) - // 修改的参数名称 - if body.MSISDN != "" { - cmd += fmt.Sprintf(",msisdn=%s", body.MSISDN) - } - if body.Ambr != "" { - cmd += fmt.Sprintf(",ambr=%s", body.Ambr) - } - if body.Nssai != "" { - cmd += fmt.Sprintf(",nssai=%s", body.Nssai) - } - if body.Arfb != "" { - cmd += fmt.Sprintf(",arfb=%s", body.Arfb) - } - if body.Sar != "" { - cmd += fmt.Sprintf(",sar=%s", body.Sar) - } - if body.Rat != "" { - cmd += fmt.Sprintf(",rat=%s", body.Rat) - } - if body.Cn != "" { - cmd += fmt.Sprintf(",cn=%s", body.Cn) - } - if body.SmfSel != "" { - cmd += fmt.Sprintf(",smf_sel=%s", body.SmfSel) - } - if body.SmData != "" { - cmd += fmt.Sprintf(",sm_data=%s", body.SmData) - } - if body.EpsDat != "" { - cmd += fmt.Sprintf(",eps_dat=%s", body.EpsDat) - } - if body.EpsFlag != "" { - cmd += fmt.Sprintf(",eps_flag=%s", body.EpsFlag) - } - if body.EpsOdb != "" { - cmd += fmt.Sprintf(",eps_odb=%s", body.EpsOdb) - } - if body.HplmnOdb != "" { - cmd += fmt.Sprintf(",hplmn_odb=%s", body.HplmnOdb) - } - if body.Epstpl != "" { - cmd += fmt.Sprintf(",epstpl=%s", body.Epstpl) - } - if body.Ard != "" { - cmd += fmt.Sprintf(",ard=%s", body.Ard) - } - if body.ContextId != "" { - cmd += fmt.Sprintf(",context_id=%s", body.ContextId) - } - if body.ApnContext != "" { - cmd += fmt.Sprintf(",apn_context=%s", body.ApnContext) - } - if body.Cag != "" { - cmd += fmt.Sprintf(",cag=%s", body.Cag) - } - if body.StaticIp != "" { - cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp) - } + 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())) @@ -450,10 +389,10 @@ func (s *UDMSubController) Export(c *gin.Context) { if body.Type == "csv" { // 转换数据 data := [][]string{} - data = append(data, []string{"imsi", "msisdn", "ambr", "nssai", "arfb", "sar", "rat", "cn", "smf_sel", "sm_dat", "eps_dat"}) + 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.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat}) + 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) @@ -468,7 +407,7 @@ func (s *UDMSubController) Export(c *gin.Context) { 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.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat}) + 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) diff --git a/src/modules/network_data/model/udm_auth.go b/src/modules/network_data/model/udm_auth.go index 57ee012b..f22e52b0 100644 --- a/src/modules/network_data/model/udm_auth.go +++ b/src/modules/network_data/model/udm_auth.go @@ -3,13 +3,13 @@ package model // UDMAuthUser UDM鉴权用户 u_auth_user type UDMAuthUser struct { ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID - IMSI string `json:"imsi" gorm:"imsi"` // SIM卡/USIM卡ID - NeId string `json:"neId" gorm:"ne_id"` // UDM网元标识 - Amf string `json:"amf" gorm:"amf"` // AMF - Status string `json:"status" gorm:"status"` // 状态 - Ki string `json:"ki" gorm:"ki"` // ki - AlgoIndex string `json:"algoIndex" gorm:"algo_index"` // algoIndex - Opc string `json:"opc" gorm:"opc"` // OPC + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 + Amf string `json:"amf" gorm:"column:amf"` // AMF + Status string `json:"status" gorm:"column:status"` // 状态 + Ki string `json:"ki" gorm:"column:ki"` // ki + AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // algoIndex + Opc string `json:"opc" gorm:"column:opc"` // OPC } // TableName 表名称 diff --git a/src/modules/network_data/model/udm_sub.go b/src/modules/network_data/model/udm_sub.go index 415f0583..96342f9b 100644 --- a/src/modules/network_data/model/udm_sub.go +++ b/src/modules/network_data/model/udm_sub.go @@ -2,28 +2,40 @@ package model // UDMSubUser UDM签约用户 u_sub_user type UDMSubUser struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - IMSI string `json:"imsi" gorm:"imsi"` // SIM卡/USIM卡ID - MSISDN string `json:"msisdn" gorm:"msisdn"` // 用户电话号码 - NeId string `json:"neId" gorm:"ne_id"` // UDM网元标识 - Ambr string `json:"ambr" gorm:"ambr"` // SubUeAMBRTemp - Nssai string `json:"nssai" gorm:"nssai"` // SubSNSSAITemp - Rat string `json:"rat" gorm:"rat"` // rat VIRTUAL|WLAN|EUTRA|NR - Arfb string `json:"arfb" gorm:"arfb"` // forbiddenAreasTemp - Sar string `json:"sar" gorm:"sar"` // serviceAreaRestrictTemp - Cn string `json:"cn" gorm:"cn"` // cnType EPC|5GC - SmData string `json:"smData" gorm:"sm_data"` // smData - SmfSel string `json:"smfSel" gorm:"smf_sel"` // smfSel - EpsDat string `json:"epsDat" gorm:"eps_dat"` // Eps - EpsFlag string `json:"epsFlag" gorm:"eps_flag"` // epsFlag - EpsOdb string `json:"epsOdb" gorm:"eps_odb"` // epsOdb - HplmnOdb string `json:"hplmnOdb" gorm:"hplmn_odb"` // hplmnOdb - Ard string `json:"ard" gorm:"ard"` // Ard - Epstpl string `json:"epstpl" gorm:"epstpl"` // Epstpl - ContextId string `json:"contextId" gorm:"context_id"` // ContextId - ApnContext string `json:"apnContext" gorm:"apn_context"` // apnContext - StaticIp string `json:"staticIp" gorm:"static_ip"` // staticIpstatic_ip指给4G UE分配的静态IP,没有可不带此字段名 - Cag string `json:"cag" gorm:"cag"` // CAG + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 + + AmDat string `json:"amDat" gorm:"column:am_dat"` // AmData + UeAmbrTpl string `json:"ambr" gorm:"column:ambr"` // AmData SubUeAMBRTemp + NssaiTpl string `json:"nssai" gorm:"column:nssai"` // AmData SubSNSSAITemp + RatRestrictions string `json:"rat" gorm:"column:rat"` // AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR + AreaForbiddenTpl string `json:"arfb" gorm:"column:arfb"` // AmData AreaForbidden + ServiceAreaRestrictionTpl string `json:"sar" gorm:"column:sar"` // AmData serviceAreaRestrictTemp + CnTypeRestrictions string `json:"cnType" gorm:"column:cn_type"` // AmData CNType 0x00:EPC和5GC 0x01:5GC 0x02:EPC 0x03:EPC+5GC + RfspIndex string `json:"rfspIndex" gorm:"column:rfsp_index"` // AmData RfspIndex + SubsRegTime string `json:"regTimer" gorm:"column:reg_timer"` // AmData RegTimer + UeUsageType string `json:"ueUsageType" gorm:"column:ue_usage_type"` // AmData UEUsageType + ActiveTime string `json:"activeTime" gorm:"column:active_time"` // AmData ActiveTime + MicoAllowed string `json:"mico" gorm:"column:mico"` // AmData MICO + OdbPs string `json:"odbPs" gorm:"column:odb_ps"` // AmData ODB_PS 0-all,1-hplmn,2-vplmn + GroupId string `json:"groupId" gorm:"column:group_id"` // AmData GroupId + + EpsDat string `json:"epsDat" gorm:"column:eps_dat"` // EpsDat + EpsFlag string `json:"epsFlag" gorm:"column:eps_flag"` // EpsDat epsFlag + EpsOdb string `json:"epsOdb" gorm:"column:eps_odb"` // EpsDat epsOdb + HplmnOdb string `json:"hplmnOdb" gorm:"column:hplmn_odb"` // EpsDat hplmnOdb + Ard string `json:"ard" gorm:"column:ard"` // EpsDat Ard + Epstpl string `json:"epstpl" gorm:"column:epstpl"` // EpsDat Epstpl + ContextId string `json:"contextId" gorm:"column:context_id"` // EpsDat ContextId + ApnNum string `json:"apnNum" gorm:"column:apn_mum"` // EpsDat apnNum + ApnContext string `json:"apnContext" gorm:"column:apn_context"` // EpsDat apnContext + StaticIp string `json:"staticIp" gorm:"column:static_ip"` // EpsDat staticIp 指给4G UE分配的静态IP,没有可不带此字段名 + + SmData string `json:"smData" gorm:"column:sm_data"` // smData + SmfSel string `json:"smfSel" gorm:"column:smf_sel"` // smfSel + Cag string `json:"cag" gorm:"column:cag"` // CAG // ====== 非数据库字段属性 ====== diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index 9c9e7704..72e6ed26 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -14,23 +14,33 @@ import ( // 实例化数据层 UDMSubUser 结构体 var NewUDMSub = &UDMSubUser{ selectSql: `select - id, imsi, msisdn, ne_id, ambr, nssai, rat, arfb, sar, cn, sm_data, smf_sel, - eps_dat, eps_flag, eps_odb, hplmn_odb, ard, epstpl, context_id, apn_context, static_ip, cag + id, imsi, msisdn, ne_id, + am_dat, ambr, nssai, rat, arfb, sar, cn_type, rfsp_index, reg_timer, ue_usage_type, active_time, mico, odb_ps, group_id, + eps_dat, eps_flag, eps_odb, hplmn_odb, ard, epstpl, context_id, apn_mum, apn_context, static_ip, + sm_data, smf_sel, cag from u_sub_user`, resultMap: map[string]string{ - "id": "ID", - "imsi": "IMSI", - "msisdn": "MSISDN", - "ne_id": "NeId", - "ambr": "Ambr", - "nssai": "Nssai", - "rat": "Rat", - "arfb": "Arfb", - "sar": "Sar", - "cn": "Cn", - "sm_data": "SmData", - "smf_sel": "SmfSel", + "id": "ID", + "imsi": "IMSI", + "msisdn": "MSISDN", + "ne_id": "NeId", + + "am_dat": "AmDat", + "ambr": "UeAmbrTpl", + "nssai": "NssaiTpl", + "rat": "RatRestrictions", + "arfb": "AreaForbiddenTpl", + "sar": "ServiceAreaRestrictionTpl", + "cn_type": "CnTypeRestrictions", + "rfsp_index": "RfspIndex", + "reg_timer": "SubsRegTime", + "ue_usage_type": "UeUsageType", + "active_time": "ActiveTime", + "mico": "MicoAllowed", + "odb_ps": "OdbPs", + "group_id": "GroupId", + "eps_dat": "EpsDat", "eps_flag": "EpsFlag", "eps_odb": "EpsOdb", @@ -38,9 +48,13 @@ var NewUDMSub = &UDMSubUser{ "ard": "Ard", "epstpl": "Epstpl", "context_id": "ContextId", + "apn_mum": "ApnNum", "apn_context": "ApnContext", "static_ip": "StaticIp", - "cag": "Cag", + + "sm_data": "SmData", + "smf_sel": "SmfSel", + "cag": "Cag", }, } diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index 8e35bdd8..7b11e62b 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -69,21 +69,16 @@ func (r *UDMAuthUser) ResetData(neId string) int64 { // ParseInfo 解析单个用户imsi鉴权信息 data从命令MML得到的结果 func (r *UDMAuthUser) ParseInfo(imsi, neId string, data map[string]string) model.UDMAuthUser { - u := model.UDMAuthUser{ - IMSI: imsi, - NeId: neId, - Amf: data["amf"], - Status: "1", - Ki: data["ki"], - AlgoIndex: data["algo"], - Opc: data["opc"], - } + u := r.udmAuthRepository.SelectByIMSIAndNeID(imsi, neId) - // 补充用户ID用于更新 - auth := r.udmAuthRepository.SelectByIMSIAndNeID(imsi, neId) - if auth.IMSI == imsi { - u.ID = auth.ID - } + // 用于更新 + u.IMSI = imsi + u.NeId = neId + u.Amf = data["amf"] + u.Ki = data["ki"] + u.AlgoIndex = data["algo"] + u.Opc = data["opc"] + u.Status = "1" return u } @@ -170,3 +165,22 @@ func (r *UDMAuthUser) LoadData(neId, imsi, num string) { r.udmAuthRepository.Inserts(arr) } } + +// ParseCommandParams 解析数据组成命令参数 ki=xx,xx=xx,... +func (r *UDMAuthUser) ParseCommandParams(item model.UDMAuthUser) string { + var conditions []string + if item.Ki != "" { + conditions = append(conditions, fmt.Sprintf("ki=%s", item.Ki)) + } + + if item.Amf != "" { + conditions = append(conditions, fmt.Sprintf("amf=%s", item.Amf)) + } + if item.AlgoIndex != "" { + conditions = append(conditions, fmt.Sprintf("algo=%s", item.AlgoIndex)) + } + if item.Opc != "" { + conditions = append(conditions, fmt.Sprintf("opc=%s", item.Opc)) + } + return strings.Join(conditions, ",") +} diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 8aebea35..2f217cb2 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -50,12 +50,29 @@ func (r *UDMSubUser) dataByRedis(imsi, neId string) []model.UDMSubUser { // def_ambr,def_nssai,0,def_arfb,def_sar,3,1,12000,1,1000,0,1,- if v, ok := m["am-dat"]; ok { arr := strings.Split(v, ",") - a.Ambr = arr[0] - a.Nssai = arr[1] - a.Rat = arr[2] - a.Arfb = arr[3] - a.Sar = arr[4] - a.Cn = arr[5] + a.AmDat = v + a.UeAmbrTpl = arr[0] + a.NssaiTpl = arr[1] + a.RatRestrictions = arr[2] + a.AreaForbiddenTpl = arr[3] + a.ServiceAreaRestrictionTpl = arr[4] + a.CnTypeRestrictions = arr[5] + a.RfspIndex = arr[6] + a.SubsRegTime = arr[7] + a.UeUsageType = arr[8] + a.ActiveTime = arr[9] + a.MicoAllowed = "0" // arr[10] + a.OdbPs = "1" // arr[11] + a.GroupId = "-" // arr[12] + if len(arr) > 10 { + a.MicoAllowed = arr[10] + } + if len(arr) > 11 { + a.OdbPs = arr[11] + } + if len(arr) > 12 && arr[12] != "-" { + a.GroupId = arr[12] + } } // 1,64,24,65,def_eps,1,2,010200000000,- if v, ok := m["eps-dat"]; ok { @@ -71,9 +88,11 @@ func (r *UDMSubUser) dataByRedis(imsi, neId string) []model.UDMSubUser { a.Ard = arr[3] a.Epstpl = arr[4] a.ContextId = arr[5] + a.ApnNum = arr[6] // 导入和导出不用 a.ApnContext = arr[7] - // [6] 是不要的,导入和导出不用 - a.StaticIp = arr[8] + if len(arr) >= 9 { + a.StaticIp = arr[8] + } } arr = append(arr, a) @@ -91,27 +110,30 @@ func (r *UDMSubUser) ResetData(neId string) int64 { // ParseInfo 解析单个用户imsi签约信息 data从命令MML得到的结果 func (r *UDMSubUser) ParseInfo(imsi, neId string, data map[string]string) model.UDMSubUser { - cnType, _ := strconv.ParseInt(data["CNType"][:4], 0, 64) - rat, _ := strconv.ParseInt(data["RAT"][:4], 0, 64) + u := r.udmSubRepository.SelectByIMSIAndNeID(imsi, neId) + + cnType, _ := strconv.ParseInt(data["CNType"][:4], 0, 64) // 0x03(EPC|5GC) + rat, _ := strconv.ParseInt(data["RAT"][:4], 0, 64) // 0x00(VIRTUAL|WLAN|EUTRA|NR) msisdn := data["MSISDN"] if imsMsisdnLen := strings.Index(msisdn, ","); imsMsisdnLen != -1 { msisdn = msisdn[:imsMsisdnLen] } - u := model.UDMSubUser{ - IMSI: imsi, - MSISDN: msisdn, - NeId: neId, - Ambr: data["AMBR"], - Arfb: data["AreaForbidden"], - Cn: fmt.Sprint(cnType), - SmData: data["SM-Data(snssai+dnn[1..n])"], - Sar: data["ServiceAreaRestriction"], - Nssai: data["NSSAI"], - SmfSel: data["Smf-Selection"], - Cag: data["cag"], - Rat: fmt.Sprint(rat), - } + // 用于更新 + u.IMSI = imsi + u.MSISDN = msisdn + u.NeId = neId + u.UeAmbrTpl = data["AMBR"] + u.NssaiTpl = data["NSSAI"] + u.AreaForbiddenTpl = data["AreaForbidden"] + u.ServiceAreaRestrictionTpl = data["ServiceAreaRestriction"] + u.CnTypeRestrictions = fmt.Sprint(cnType) + u.RatRestrictions = fmt.Sprint(rat) + u.MicoAllowed = data["MICO"] + u.SmData = data["SM-Data(snssai+dnn[1..n])"] + u.SmfSel = data["Smf-Selection"] + u.Cag = data["cag"] + // 1,64,24,65,def_eps,1,2,010200000000,- if v, ok := data["EPS-Data"]; ok { u.EpsDat = v @@ -122,16 +144,11 @@ func (r *UDMSubUser) ParseInfo(imsi, neId string, data map[string]string) model. u.Ard = arr[3] u.Epstpl = arr[4] u.ContextId = arr[5] + u.ApnNum = arr[6] // 导入和导出不用 u.ApnContext = arr[7] - // [6] 是不要的,导入和导出不用 u.StaticIp = arr[8] } - // 补充用户ID用于更新 - sub := r.udmSubRepository.SelectByIMSIAndNeID(imsi, neId) - if sub.IMSI == imsi { - u.ID = sub.ID - } // 补充用户拓展信息 info := r.udmUserInfoRepository.SelectByIMSIAndNeID(imsi, neId) if info.IMSI == imsi { @@ -252,3 +269,75 @@ func (r *UDMSubUser) LoadData(neId, imsi, num, remark string) { } } } + +// ParseCommandParams 解析数据组成命令参数 msisdn=xx,xx=xx,... +func (r *UDMSubUser) ParseCommandParams(item model.UDMSubUser) string { + var conditions []string + if item.MSISDN != "" { + conditions = append(conditions, fmt.Sprintf("msisdn=%s", item.MSISDN)) + } + + // AmData + if item.UeAmbrTpl != "" { + conditions = append(conditions, fmt.Sprintf("ambr=%s", item.UeAmbrTpl)) + } + if item.NssaiTpl != "" { + conditions = append(conditions, fmt.Sprintf("nssai=%s", item.NssaiTpl)) + } + if item.AreaForbiddenTpl != "" { + conditions = append(conditions, fmt.Sprintf("arfb=%s", item.AreaForbiddenTpl)) + } + if item.ServiceAreaRestrictionTpl != "" { + conditions = append(conditions, fmt.Sprintf("sar=%s", item.ServiceAreaRestrictionTpl)) + } + if item.RatRestrictions != "" { + conditions = append(conditions, fmt.Sprintf("rat=%s", item.RatRestrictions)) + } + if item.CnTypeRestrictions != "" { + conditions = append(conditions, fmt.Sprintf("cn=%s", item.CnTypeRestrictions)) + } + if item.MicoAllowed != "" { + conditions = append(conditions, fmt.Sprintf("mico=%s", item.MicoAllowed)) + } + + // EpsDat + // if item.EpsDat != "" { + // conditions = append(conditions, fmt.Sprintf("eps_dat=%s", item.EpsDat)) + // } + if item.EpsFlag != "" { + conditions = append(conditions, fmt.Sprintf("eps_flag=%s", item.EpsFlag)) + } + if item.EpsOdb != "" { + conditions = append(conditions, fmt.Sprintf("eps_odb=%s", item.EpsOdb)) + } + if item.HplmnOdb != "" { + conditions = append(conditions, fmt.Sprintf("hplmn_odb=%s", item.HplmnOdb)) + } + if item.Epstpl != "" { + conditions = append(conditions, fmt.Sprintf("epstpl=%s", item.Epstpl)) + } + if item.Ard != "" { + conditions = append(conditions, fmt.Sprintf("ard=%s", item.Ard)) + } + if item.ContextId != "" { + conditions = append(conditions, fmt.Sprintf("context_id=%s", item.ContextId)) + } + if item.ApnContext != "" { + conditions = append(conditions, fmt.Sprintf("apn_context=%s", item.ApnContext)) + } + if item.StaticIp != "" { + conditions = append(conditions, fmt.Sprintf("static_ip=%s", item.StaticIp)) + } + + // 其他 + if item.SmfSel != "" { + conditions = append(conditions, fmt.Sprintf("smf_sel=%s", item.SmfSel)) + } + if item.SmData != "" { + conditions = append(conditions, fmt.Sprintf("sm_data=%s", item.SmData)) + } + if item.Cag != "" { + conditions = append(conditions, fmt.Sprintf("cag=%s", item.Cag)) + } + return strings.Join(conditions, ",") +} From 4e94ec23aaa456b95463b6ed9ceb7da56411b113 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 15:49:47 +0800 Subject: [PATCH 19/69] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.2410.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 8 ++++++++ captrace/makefile | 2 +- crontask/makefile | 2 +- data2html/makefile | 2 +- makefile | 2 +- mkpkg.sh | 2 +- restagent/makefile | 2 +- src/framework/config/config/config.default.yaml | 2 +- sshsvc/makefile | 2 +- 9 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0e03d26..04b02475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # 版本发布日志 +## 2.2410.1-20241012 + +- 新增 系统菜单新增工具栏目,网元SSH,网络测试,网络探针 +- 更新 UDM签约数据表,同步数据支持MICO和RAT操作修改 +- 优化 MML命令连接改为网元信息配置telnet +- 更新 SMSC、AMF参数配置数据 +- 更新 定时清除到导出文件缓存 + ## 2.2409.4-20240927 - 新增 跟踪任务pcap文件获取接口 diff --git a/captrace/makefile b/captrace/makefile index 072935f7..b2958d7a 100644 --- a/captrace/makefile +++ b/captrace/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2409.4 +VERSION = 2.2410.1 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/crontask/makefile b/crontask/makefile index 88f9d7fd..cd4750f4 100644 --- a/crontask/makefile +++ b/crontask/makefile @@ -1,7 +1,7 @@ # Makefile for OMC-OMC-crontask project PROJECT = OMC -VERSION = 2.2409.4 +VERSION = 2.2410.1 LIBDIR = be.ems/lib BINNAME = crontask diff --git a/data2html/makefile b/data2html/makefile index ba9d3527..76ae773b 100644 --- a/data2html/makefile +++ b/data2html/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2409.4 +VERSION = 2.2410.1 RelDate = `date +%Y%m%d` Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) diff --git a/makefile b/makefile index c515e346..dc530d07 100644 --- a/makefile +++ b/makefile @@ -3,7 +3,7 @@ ProjectL = omc ProjectU = OMC PROJECT = $(ProjectL) -VERSION = 2.2409.4 +VERSION = 2.2410.1 RelDate = `date +%Y%m%d` Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) diff --git a/mkpkg.sh b/mkpkg.sh index cee3c783..13e0a797 100644 --- a/mkpkg.sh +++ b/mkpkg.sh @@ -2,7 +2,7 @@ ProcList="restagent crontask sshsvc captrace data2html" ProjectL=omc -VERSION=2.2409.4 +VERSION=2.2410.1 RelDate=`date +%Y%m%d` Release=${RelDate} RelVer=${VERSION}-${RelDate} diff --git a/restagent/makefile b/restagent/makefile index 3df0eae9..4690c60b 100644 --- a/restagent/makefile +++ b/restagent/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2409.4 +VERSION = 2.2410.1 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/src/framework/config/config/config.default.yaml b/src/framework/config/config/config.default.yaml index 467085fe..102fd4af 100644 --- a/src/framework/config/config/config.default.yaml +++ b/src/framework/config/config/config.default.yaml @@ -1,7 +1,7 @@ # 项目信息 framework: name: "OMC" - version: "2.2409.4" + version: "2.2410.1" # 应用服务配置 server: diff --git a/sshsvc/makefile b/sshsvc/makefile index 58e8aaf1..6bb665f1 100644 --- a/sshsvc/makefile +++ b/sshsvc/makefile @@ -1,7 +1,7 @@ # Makefile for OMC-OMC-crontask project PROJECT = OMC -VERSION = 2.2409.4 +VERSION = 2.2410.1 LIBDIR = be.ems/lib BINNAME = sshsvc From 747ee080c87837a70ef26f8e51425d5207d9a85c Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 16:08:15 +0800 Subject: [PATCH 20/69] =?UTF-8?q?sql:=20=20=E6=9B=B4=E6=96=B0=E8=A1=A8u=5F?= =?UTF-8?q?sub=5Fuser=E5=88=A4=E6=96=AD=E8=A1=A8=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/upgrade/upg_u_sub_user.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/upgrade/upg_u_sub_user.sql b/database/upgrade/upg_u_sub_user.sql index 618c780e..baf1842c 100644 --- a/database/upgrade/upg_u_sub_user.sql +++ b/database/upgrade/upg_u_sub_user.sql @@ -2,7 +2,7 @@ -- Table structure for table `u_sub_user` -- -- DROP TABLE IF EXISTS `u_sub_user`; -CREATE TABLE `u_sub_user` ( +CREATE TABLE IF NOT EXISTS `u_sub_user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', From 495448254e4cdceaa8f3e60c9b1b3719dd032f4b Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Sat, 12 Oct 2024 16:24:27 +0800 Subject: [PATCH 21/69] fix: flag of version and help --- captrace/config/config.go | 10 ++++++---- crontask/config.go | 6 ++++-- misc/omcsvc.sh | 2 +- sshsvc/config/config.go | 6 ++++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/captrace/config/config.go b/captrace/config/config.go index 19c2e35e..38015020 100644 --- a/captrace/config/config.go +++ b/captrace/config/config.go @@ -110,15 +110,17 @@ const defaultConfigFile = "./etc/capconf.yaml" func init() { cfile := flag.String("c", defaultConfigFile, "config file") - pv := flag.Bool("version", false, "print version") - ph := flag.Bool("help", false, "print help") + pv := flag.Bool("v", false, "print version") + pversion := flag.Bool("version", false, "print version") + ph := flag.Bool("h", false, "print help") + phelp := flag.Bool("help", false, "print help") flag.Parse() - if *pv { + if *pv || *pversion { fmt.Printf("OMC captrace version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) os.Exit(0) } - if *ph { + if *ph || *phelp { flag.Usage() os.Exit(0) } diff --git a/crontask/config.go b/crontask/config.go index 0ba3deb2..2a616ace 100644 --- a/crontask/config.go +++ b/crontask/config.go @@ -179,14 +179,16 @@ var ConfigFile *string func init() { ConfigFile = flag.String("c", defaultConfigFile, "config file") pv := flag.Bool("v", false, "print version") + pversion := flag.Bool("version", false, "print version") ph := flag.Bool("h", false, "print help") + phelp := flag.Bool("help", false, "print help") flag.Parse() - if *pv { + if *pv || *pversion { fmt.Printf("OMC crontask version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) os.Exit(0) } - if *ph { + if *ph || *phelp { flag.Usage() os.Exit(0) } diff --git a/misc/omcsvc.sh b/misc/omcsvc.sh index ad242725..037a27b1 100644 --- a/misc/omcsvc.sh +++ b/misc/omcsvc.sh @@ -31,7 +31,7 @@ case "$1" in ;; version) for procName in $ProcList;do - $BinDir/$procName -v + $BinDir/$procName --version done ;; *) diff --git a/sshsvc/config/config.go b/sshsvc/config/config.go index ab4b0ed2..fcf978a4 100644 --- a/sshsvc/config/config.go +++ b/sshsvc/config/config.go @@ -167,14 +167,16 @@ const DefaultConfigFile = "./etc/sshsvc.yaml" func init() { cfile := flag.String("c", DefaultConfigFile, "config file") pv := flag.Bool("v", false, "print version") + pversion := flag.Bool("version", false, "print version") ph := flag.Bool("h", false, "print help") + phelp := flag.Bool("help", false, "print help") flag.Parse() - if *pv { + if *pv || *pversion { fmt.Printf("OMC sshsvc version: %s\n%s\n%s\n\n", global.Version, global.BuildTime, global.GoVer) os.Exit(0) } - if *ph { + if *ph || *phelp { flag.Usage() os.Exit(0) } From b01c38c4ac00b4d751fe11625697e23db8f3d4e3 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 18:00:20 +0800 Subject: [PATCH 22/69] =?UTF-8?q?del:=20=E7=A7=BB=E9=99=A4param=5Fconfig?= =?UTF-8?q?=E8=A1=A8=E7=9B=B8=E5=85=B3=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 10 - config/mml_map/http_mml_map.json | 17 +- database/common/mml_command.sql | 2 +- database/common/mml_http_map.sql | 2 +- database/common/param_config.sql | 114 ---------- lib/dborm/dborm.go | 62 ----- tools/loadpconf/db.go | 101 --------- tools/loadpconf/load.go | 375 ------------------------------- tools/loadpconf/loadpconf.go | 21 -- tools/loadpconf/loadpconf.yaml | 17 -- tools/loadpconf/makefile | 22 -- tools/misc/tables_c.lst | 2 +- 12 files changed, 9 insertions(+), 736 deletions(-) delete mode 100644 database/common/param_config.sql delete mode 100644 tools/loadpconf/db.go delete mode 100644 tools/loadpconf/load.go delete mode 100644 tools/loadpconf/loadpconf.go delete mode 100644 tools/loadpconf/loadpconf.yaml delete mode 100644 tools/loadpconf/makefile diff --git a/.vscode/launch.json b/.vscode/launch.json index 3ce5d98b..305ed684 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -29,15 +29,6 @@ "program": "d:/local.git/be.ems/sshsvc/sshsvc.go", "console": "integratedTerminal" }, - { - "name": "debug loadpconf", - "type": "go", - "request": "launch", - "mode": "debug", - "program": "d:/local.git/be.ems/tools/loadpconf", - "args": ["-p","../../config/param/smf_param_config.yaml"], - "console": "integratedTerminal" - }, { "name": "debug crontask", "type": "go", @@ -52,7 +43,6 @@ "request": "launch", "mode": "debug", "program": "d:/local.git/be.ems/tools/encode", - //"args": ["-p","../../config/param/smf_param_config.yaml"], "console": "integratedTerminal" } ] diff --git a/config/mml_map/http_mml_map.json b/config/mml_map/http_mml_map.json index 8e8ec408..d70652ec 100644 --- a/config/mml_map/http_mml_map.json +++ b/config/mml_map/http_mml_map.json @@ -890,7 +890,7 @@ } -"param_config": { +"ne_config": { "retFmt": "GetDB", "retMsg": "RetCode = %d operation succeeded\n\n", "errMsg": "ErrorCode = %d operation failed: %s\n\n", @@ -903,27 +903,22 @@ "cols": [ { "name": "ne_type", - "display": "NE type", + "display": "NE Type", "length": 10 }, { - "name": "ne_id", - "display": "NE ID", - "length": 28 - }, - { - "name": "top_tag", - "display": "Parameters tag", + "name": "param_display", + "display": "Parameter Display", "length": 128 }, { "name": "param_name", - "display": "Parameter name list", + "display": "Parameter Name", "length": 256 }, { "name": "param_value", - "display": "Parameter value list", + "display": "Parameter Value", "length": 256 } ], diff --git a/database/common/mml_command.sql b/database/common/mml_command.sql index 302d0ed4..43d1e488 100644 --- a/database/common/mml_command.sql +++ b/database/common/mml_command.sql @@ -43,7 +43,7 @@ INSERT INTO `mml_command` VALUES (1594, 'OMC', 'neManagement', 'Network Element INSERT INTO `mml_command` VALUES (1595, 'OMC', 'neManagement', 'Network Element Management', 'add', 'neinfo', 'Add Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"rm_uid\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Resource management UID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"rmuid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ip\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"ip\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"port\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"port\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"nename\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"pv_flag\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"pvflag\",\"optional\":\"false\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1596, 'OMC', 'neManagement', 'Network Element Management', 'mod', 'neinfo', 'Modify Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"rm_uid\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Resource management UID\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"rmuid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ip\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"IP address\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"ip\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"port\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"port\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"nename\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"pv_flag\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"pvflag\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1597, 'OMC', 'neManagement', 'Network Element Management', 'del', 'neinfo', 'Delete Network Element', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"false\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"false\",\"type\":\"string\"}]', 'Active'); -INSERT INTO `mml_command` VALUES (1598, 'OMC', 'neConfigManagement', 'NE Config Parameter Management', 'dsp', 'neconfig', 'Display NE Config Parameter', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"top_tag\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Parameter tag\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"tag\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); +INSERT INTO `mml_command` VALUES (1598, 'OMC', 'neConfigManagement', 'NE Config Parameter Management', 'dsp', 'neconfig', 'Display NE Config Parameter', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE Type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"param_display\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Parameters Display\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"paramDisplay\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1599, 'OMC', 'faultManagement', 'Fault Management', 'dsp', 'alarm', 'Display Alarm Information', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE UID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_name\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE name\",\"filter\":\"\",\"name\":\"nename\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"alarm_code\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm code\",\"filter\":\"\",\"name\":\"alarmcode\",\"optional\":\"true\",\"type\":\"int\"},{\"alias\":\"orig_severity\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Original severity\",\"filter\":\"{\\\"Critical\\\":\\\"Critical\\\",\\\"Major\\\":\\\"Major\\\",\\\"Minor\\\":\\\"Minor\\\",\\\"Warning\\\":\\\"Warning\\\",\\\"Event\\\":\\\"Event\\\"}\",\"name\":\"origseverity\",\"optional\":\"true\",\"type\":\"enum\"},{\"alias\":\"pv_flag\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"PV flag\",\"filter\":\"\",\"name\":\"pvflag\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"event_time\\u003e\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm event start time\",\"filter\":\"\",\"name\":\"starttime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"event_time\\u003c\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm event end time\",\"filter\":\"\",\"name\":\"endtime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"alarm_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm type\",\"filter\":\"{\\\"CommunicationAlarm\\\":\\\"CommunicationAlarm\\\",\\\"EquipmentAlarm\\\":\\\"EquipmentAlarm\\\",\\\"ProcessingFailure\\\":\\\"ProcessingFailure\\\",\\\"EnvironmentalAlarm\\\":\\\"EnvironmentalAlarm\\\",\\\"QualityOfServiceAlarm\\\":\\\"QualityOfServiceAlarm\\\"}\",\"name\":\"alarmtype\",\"optional\":\"true\",\"type\":\"enum\"},{\"alias\":\"alarm_status\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Alarm status\",\"filter\":\"\",\"name\":\"alarmstatus\",\"optional\":\"true\",\"type\":\"int\"}]', 'Active'); INSERT INTO `mml_command` VALUES (1600, 'OMC', 'systemCommand', 'Linux System Command', 'run', 'shell', 'Run Shell Command', '[{\"alias\":\"cmd\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Shell command\",\"filter\":\"\",\"loc\":\"false\",\"name\":\"cmd\",\"optional\":\"false\",\"type\":\"string\"}]', 'Inactive'); INSERT INTO `mml_command` VALUES (1601, 'OMC', 'licenseManagement', 'License Management', 'dsp', 'licenseinfo', 'Display NE License Information', '[{\"alias\":\"neType\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"neId\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Inactive'); diff --git a/database/common/mml_http_map.sql b/database/common/mml_http_map.sql index 48d9e647..b058e48d 100644 --- a/database/common/mml_http_map.sql +++ b/database/common/mml_http_map.sql @@ -65,7 +65,7 @@ INSERT INTO `mml_http_map` VALUES (22, 'OMC', 'act', 'measuretask', 'Put', '/api INSERT INTO `mml_http_map` VALUES (23, 'OMC', 'dea', 'measuretask', 'Put', '/api/rest/dataManagement/v1/omc_db/measure_task', NULL, NULL, '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"measure_task\",\r\n \"cols\": [\r\n {\r\n \"name\": \"status\",\r\n \"alias\": \"status\",\r\n \"type\": \"int\",\r\n \"length\": 11,\r\n \"value\": \"Inactive\"\r\n }\r\n ]\r\n}\r\n', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); INSERT INTO `mml_http_map` VALUES (24, 'OMC', 'dsp', 'nbicm', 'Get', '/api/rest/dataManagement/v1/omc_db/nbi_cm', NULL, NULL, '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NBI Resources Management\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"rm_uid\",\r\n \"display\": \"RM UID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"user_label\",\r\n \"display\": \"User label\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"object_type\",\r\n \"display\": \"Object type\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"pv_flag\",\r\n \"display\": \"PV flag\",\r\n \"length\": 8\r\n },\r\n {\r\n \"name\": \"value_json\",\r\n \"display\": \"NBI resource management\",\r\n \"length\": 200\r\n } \r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}\r\n'); INSERT INTO `mml_http_map` VALUES (25, 'OMC', 'upg', 'neversion', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_version', NULL, NULL, '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_version\",\r\n \"cols\": [\r\n {\r\n \"name\": \"status\",\r\n \"alias\": \"status\",\r\n \"type\": \"string\",\r\n \"length\": 8,\r\n \"value\": \"Active\"\r\n }\r\n ]\r\n}', '{\r\n \"retFmt\": \"PutDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); -INSERT INTO `mml_http_map` VALUES (26, 'OMC', 'dsp', 'neconfig', 'Get', '/api/rest/dataManagement/v1/omc_db/param_config', NULL, 'SQL', '?SQL=select+ne_type,ne_id,top_tag,json_extract(param_json,\'$.*[*].name\')+AS+param_name,JSON_EXTRACT(param_json,\'$.*[*].value\')+as+param_value+from+param_config', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE Config Parameters\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 28\r\n },\r\n {\r\n \"name\": \"top_tag\",\r\n \"display\": \"Parameters tag\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"param_name\",\r\n \"display\": \"Parameter name list\",\r\n \"length\": 256\r\n },\r\n {\r\n \"name\": \"param_value\",\r\n \"display\": \"Parameter value list\",\r\n \"length\": 256\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); +INSERT INTO `mml_http_map` VALUES (26, 'OMC', 'dsp', 'neconfig', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_config', NULL, 'SQL', '?SQL=select+ne_type,param_display,JSON_UNQUOTE(json_extract(param_json,\'$[0].name\'))+as+param_name,JSON_UNQUOTE(json_extract(param_json,\'$[0].value\'))+as+param_value+from+ne_config', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE Config Parameters\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE Type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"param_display\",\r\n \"display\": \"Parameter Display\",\r\n \"length\": 128\r\n },\r\n {\r\n \"name\": \"param_name\",\r\n \"display\": \"Parameter Name\",\r\n \"length\": 256\r\n },\r\n {\r\n \"name\": \"param_value\",\r\n \"display\": \"Parameter Value\",\r\n \"length\": 256\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); INSERT INTO `mml_http_map` VALUES (27, 'OMC', 'lst', 'license', 'Get', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{}', '{\r\n \"retFmt\": \"GetDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"title\": \"NE License Information\",\r\n \"singleList\": true,\r\n \"sepSpaceNum\": 2,\r\n \"alignmentM\": \"Left\",\r\n \"alignmentSN\": \"Right\",\r\n \"alignmentSV\": \"Left\",\r\n \"cols\": [\r\n {\r\n \"name\": \"ne_type\",\r\n \"display\": \"NE type\",\r\n \"length\": 10\r\n },\r\n {\r\n \"name\": \"ne_id\",\r\n \"display\": \"NE ID\",\r\n \"length\": 20\r\n },\r\n {\r\n \"name\": \"serial_no\",\r\n \"display\": \"Serial no\",\r\n \"length\": 12\r\n },\r\n {\r\n \"name\": \"capcity\",\r\n \"display\": \"License capcity\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"used\",\r\n \"display\": \"License used\",\r\n \"length\": 11\r\n },\r\n {\r\n \"name\": \"feature_enabled\",\r\n \"display\": \"Feature enabled\",\r\n \"length\": 30\r\n },\r\n {\r\n \"name\": \"expiration_date\",\r\n \"display\": \"License expiration date\",\r\n \"length\": 20\r\n }\r\n ],\r\n \"end\": \"(Number of results = %d)\\n\\n\"\r\n}'); INSERT INTO `mml_http_map` VALUES (28, 'OMC', 'dep', 'license', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_license\",\r\n \"callFunc\": \"DeploymentLicense\"\r\n}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); INSERT INTO `mml_http_map` VALUES (29, 'OMC', 'rel', 'license', 'Put', '/api/rest/dataManagement/v1/omc_db/ne_license', NULL, 'loc', '?loc=', '{\r\n \"bodyFmt\": \"PutDB\",\r\n \"bodyKey\": \"ne_license\",\r\n \"callFunc\": \"InstallLicense\"\r\n}', '{\r\n \"retFmt\": \"DeleteDB\",\r\n \"retMsg\": \"RetCode = %d operation succeeded\\n\\n\",\r\n \"errMsg\": \"ErrorCode = %d operation failed: %s\\n\\n\",\r\n \"cols\": [\r\n {\r\n \"name\": \"affectedRows\",\r\n \"display\": \"Affected rows\",\r\n \"length\": 11\r\n }\r\n ]\r\n}'); diff --git a/database/common/param_config.sql b/database/common/param_config.sql deleted file mode 100644 index be2e722c..00000000 --- a/database/common/param_config.sql +++ /dev/null @@ -1,114 +0,0 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for param_config --- ---------------------------- -DROP TABLE IF EXISTS `param_config`; -CREATE TABLE `param_config` ( - `id` int NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', - `top_tag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `top_display` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `method` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作属性 get只读强制不可编辑删除 put可编辑 delete可删除 post可新增', - `param_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'accesss属性控制:只读read-only/read/ro 读写read-write', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_type_name` (`ne_type`,`top_tag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元参数配置可用属性值'; - --- ---------------------------- --- Records of param_config --- ---------------------------- -INSERT INTO `param_config` VALUES (595, 'N3IWF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IKEBindAddress\",\"filter\":\"\",\"name\":\"ikeBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPBindAddress\",\"filter\":\"\",\"name\":\"gtpBindAddr\",\"type\":\"string\",\"value\":\"192.168.12.161\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"n3iwf.5gc.mnc00.mcc460.pub.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"InternalIP\",\"filter\":\"\",\"name\":\"internalIP\",\"type\":\"string\",\"value\":\"172.16.1.190\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UdmIPAddrPort\",\"filter\":\"\",\"name\":\"udmAddr\",\"type\":\"string\",\"value\":\"172.16.1.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SmfIPAddress\",\"filter\":\"\",\"name\":\"smfIPAddr\",\"type\":\"string\",\"value\":\"172.16.1.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3IPAddress\",\"filter\":\"\",\"name\":\"n3IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6IPAddress\",\"filter\":\"\",\"name\":\"n6IPAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"}]}'); -INSERT INTO `param_config` VALUES (1106, 'AUSF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1107, 'NRF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.180\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1108, 'NRF', '', 'registeredNFs', 'Registered NFs', 'get', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF Type\",\"filter\":\"^.{1,128}$\",\"name\":\"nfType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Status\",\"filter\":\"^.{1,128}$\",\"name\":\"status\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"^.{1,128}$\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"IP Address\",\"filter\":\"^.{1,128}$\",\"name\":\"ipAddress\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1243, 'NSSF', '', 'general', 'General', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSSF Name\",\"filter\":\"\",\"name\":\"nssfName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NF ID\",\"filter\":\"\",\"name\":\"nfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1244, 'NSSF', '', 'sbi', 'SBI', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"\",\"name\":\"scheme\",\"type\":\"string\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv4\",\"filter\":\"\",\"name\":\"registerIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv4\",\"filter\":\"\",\"name\":\"bindingIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register IPv6\",\"filter\":\"\",\"name\":\"registerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Binding IPv6\",\"filter\":\"\",\"name\":\"bindingIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Port\",\"filter\":\"\",\"name\":\"port\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv4\",\"filter\":\"\",\"name\":\"telnetIpv4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet IPv6\",\"filter\":\"\",\"name\":\"telnetIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Telnet Port\",\"filter\":\"\",\"name\":\"telnetPort\",\"type\":\"int\",\"value\":\"4100\"}]}'); -INSERT INTO `param_config` VALUES (1245, 'NSSF', '', 'supportedNetworkSliceList', 'Supported Network Slice List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TAC\",\"filter\":\"\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SST\",\"filter\":\"\",\"name\":\"supportedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported SD\",\"filter\":\"\",\"name\":\"supportedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SST\",\"filter\":\"\",\"name\":\"restrictedSst\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restricted SD\",\"filter\":\"\",\"name\":\"restrictedSd\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF ID\",\"filter\":\"\",\"name\":\"nrfId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NSI ID\",\"filter\":\"\",\"name\":\"nsiId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Access Type\",\"filter\":\"\",\"name\":\"accessType\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Set ID\",\"filter\":\"\",\"name\":\"amfSetId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1246, 'NSSF', '', 'plmnMappingList', 'PLMN Mapping List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Operator Name\",\"filter\":\"\",\"name\":\"operatorName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"\",\"name\":\"mcc\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"\",\"name\":\"mnc\",\"type\":\"string\",\"value\":\"02\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SST\",\"filter\":\"\",\"name\":\"servingSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Serving SNSSAI SD\",\"filter\":\"\",\"name\":\"servingSnssaiSd\",\"type\":\"string\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SST\",\"filter\":\"\",\"name\":\"homeSnssaiSst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Home SNSSAI SD\",\"filter\":\"\",\"name\":\"homeSnssaiSd\",\"type\":\"string\",\"value\":\"1\"}]}'); - --- AMF 更新时间2024/07/16 15:00 -INSERT INTO `param_config` VALUES (1473, 'AMF', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]}'); -INSERT INTO `param_config` VALUES (1474, 'AMF', '', 'association', 'TNL Association List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]}'); -INSERT INTO `param_config` VALUES (1475, 'AMF', '', 'guami', 'GUAMI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1476, 'AMF', '', 'tai', 'TAI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1477, 'AMF', '', 'slice', 'Slice List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]}'); - -INSERT INTO `param_config` VALUES (1480, 'MOCNGW', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP South Address\",\"filter\":\"0~64\",\"name\":\"s1apSouthAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP North Address\",\"filter\":\"0~64\",\"name\":\"s1apNorthAddr\",\"type\":\"string\",\"value\":\"192.168.8.163\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1048575\",\"display\":\"ENB ID\",\"filter\":\"0~1048575\",\"name\":\"enbId\",\"type\":\"int\",\"value\":\"24\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"userPlaneEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.7.163\"}]}'); -INSERT INTO `param_config` VALUES (1481, 'MOCNGW', '', 'mme', 'MME List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"S1AP Address\",\"filter\":\"0~64\",\"name\":\"s1apAddr\",\"type\":\"string\",\"value\":\"192.168.1.161\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S1AP Port\",\"filter\":\"0~65535\",\"name\":\"s1apPort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"}]}'); -INSERT INTO `param_config` VALUES (1482, 'MOCNGW', '', 'upgw', 'UPGW Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PFCP Address\",\"filter\":\"0~64\",\"name\":\"pfcpAddr\",\"type\":\"string\",\"value\":\"192.168.1.159\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"PFCP Port\",\"filter\":\"0~65535\",\"name\":\"pfcpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U South Address\",\"filter\":\"0~64\",\"name\":\"gtpuSouthAddr\",\"type\":\"string\",\"value\":\"10.10.1.2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTP-U North Address\",\"filter\":\"0~64\",\"name\":\"gtpuNorthAddr\",\"type\":\"string\",\"value\":\"192.168.7.123\"}]}'); -INSERT INTO `param_config` VALUES (1525, 'PCF', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"}]}'); -INSERT INTO `param_config` VALUES (1526, 'PCF', '', 'serviceAreaRestriction', 'Service Area Restriction', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1527, 'PCF', '', 'pccRules', 'PCC Rules', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Precedence\",\"filter\":\"0~255\",\"name\":\"precedence\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP ID\",\"filter\":\"^.{1,63}$\",\"name\":\"appId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Template\",\"filter\":\"^.{1,255}$\",\"name\":\"flowTemplate\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"trafficControlId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1528, 'PCF', '', 'sessionRules', 'Session Rules', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"^.{1,63}$\",\"name\":\"ruleId\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Activate\",\"filter\":\"false;true;\",\"name\":\"activate\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Usage\",\"filter\":\"{\\\"0\\\":\\\"General\\\", \\\"1\\\":\\\"IMS-Signalling\\\"}\",\"name\":\"flowUsage\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"usageMonitoringId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrDl\",\"type\":\"string\",\"value\":\"200Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"ambrUl\",\"type\":\"string\",\"value\":\"100Mbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Averaging Window\",\"filter\":\"0~4095\",\"name\":\"averagingWindow\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Data Burst Volume\",\"filter\":\"0~4095\",\"name\":\"maxDataBurstVolume\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1529, 'PCF', '', 'gxServer', 'Gx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1530, 'PCF', '', 'rxServer', 'Rx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{0,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{0,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1531, 'PCF', '', 'flowTemplate', 'Flow Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~256\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"^.{1,127}$\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"permit out ip from any to assigned\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Direction\",\"filter\":\"{\\\"0\\\":\\\"Unspecified\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Bidirectional\\\"}\",\"name\":\"flowDirection\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1532, 'PCF', '', 'qosTemplate', 'QoS Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QoS ID\",\"filter\":\"^.{1,63}$\",\"name\":\"qosId\",\"type\":\"string\",\"value\":\"qos_internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"fiveQI\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI Priority Level\",\"filter\":\"0~127\",\"name\":\"fiveQIPriorityLevel\",\"type\":\"int\",\"value\":\"80\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Bitrate Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"maxbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrDl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"gbrUl\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"1~15\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default QoS Flow Indication\",\"filter\":\"false;true;\",\"name\":\"defQosFlowIndication\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1533, 'PCF', '', 'usageMonitoringTemplate', 'Usage Monitoring Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Usage Monitoring ID\",\"filter\":\"^.{1,63}$\",\"name\":\"umId\",\"type\":\"string\",\"value\":\"flow_any\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold(KB)\",\"filter\":\"\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"5242880\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Uplink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdUplink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Volume Threshold Downlink(KB)\",\"filter\":\"\",\"name\":\"volumeThresholdDownlink\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time Threshold\",\"filter\":\"\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inactivity Time\",\"filter\":\"\",\"name\":\"inactivityTime\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1534, 'PCF', '', 'trafficControlTemplate', 'Traffic Control Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~64\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Traffic Control ID\",\"filter\":\"^.{1,63}$\",\"name\":\"tcId\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Status\",\"filter\":\"{\\\"0\\\":\\\"Disable\\\", \\\"1\\\":\\\"Uplink\\\", \\\"2\\\":\\\"Downlink\\\", \\\"3\\\":\\\"Enable\\\", \\\"4\\\":\\\"Remove\\\"}\",\"name\":\"flowStatus\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mute Notify\",\"filter\":\"false;true;\",\"name\":\"muteNotif\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Route to Location DNAI\",\"filter\":\"^.{1,63}$\",\"name\":\"dnai\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1535, 'PCF', '', 'headerEnrichTemplate', 'Header Enrich Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Template Name\",\"filter\":\"^.{1,63}$\",\"name\":\"templateName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Type\",\"filter\":\"{\\\"0\\\":\\\"GPSI\\\", \\\"1\\\":\\\"SUPI\\\", \\\"2\\\":\\\"UE IP\\\", \\\"3\\\":\\\"User Location\\\", \\\"4\\\":\\\"DNN\\\"}\",\"name\":\"headerType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Header Name\",\"filter\":\"^.{1,63}$\",\"name\":\"headerName\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1591, 'SMSC', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cdrFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SM Validity\",\"filter\":\"0-2147483647\",\"name\":\"smValidity\",\"type\":\"int\",\"value\":\"259200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"logFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable local users.\",\"display\":\"Local Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable outbound roaming users.\",\"display\":\"Local Roaming Out Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"localRoamingOutPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to unattainable inbound roaming users.\",\"display\":\"Visitor Roaming In Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"visitorRoamingInPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable resend pending SMS to other unattainable users.\",\"display\":\"Other Polling Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"otherPollingFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Define the maximum port number that the queue of pending SMS may grow to.\",\"display\":\"Polling Number\",\"filter\":\"0-64\",\"name\":\"pollingNumber\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"Specify the priority parameter of SM_RP_PRI. true = High; false = Low.\",\"display\":\"Priority Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"priorityFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"Enable or disable TP-Reply-Path parameter in the SMS-DELIVER data unit.\",\"display\":\"TP Reply Path Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"tpReplyPathFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMSC Domain\",\"filter\":\"0~16\",\"name\":\"smscDomain\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CSFB VoLTE Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbVolteFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Camel Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"camelFlag\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SCF Address\",\"filter\":\"0~16\",\"name\":\"scfAddress\",\"type\":\"string\",\"value\":\"0.0.0.0\"}]}'); -INSERT INTO `param_config` VALUES (1592, 'SMSC', '', 'msisdnsegment', 'MSISDN Segment List', 'put', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start MSISDN\",\"filter\":\"0~32\",\"name\":\"startMSISDN\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End MSISDN\",\"filter\":\"0~32\",\"name\":\"endMSISDN\",\"type\":\"string\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1593, 'SMSC', '', 'smpplink', 'SMPP Link List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~63\",\"display\":\"Index\",\"filter\":\"0~63\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Alias\",\"filter\":\"0~32\",\"name\":\"linkAlias\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Type\",\"filter\":\"{\\\"0\\\":\\\"bindTX\\\",\\\"1\\\":\\\"bindRX\\\",\\\"2\\\":\\\"bindTRX\\\"}\",\"name\":\"sessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Number\",\"filter\":\"0~32\",\"name\":\"serviceNumber\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Coding Scheme\",\"filter\":\"{\\\"0\\\":\\\"smpp7def7\\\",\\\"1\\\":\\\"smpp8dcs4def7\\\",\\\"2\\\":\\\"smpp8dcs0def7\\\",\\\"16\\\":\\\"smpp7def8\\\",\\\"17\\\":\\\"smpp8dcs4def8\\\",\\\"18\\\":\\\"smpp8dcs0def8\\\"}\",\"name\":\"dataCodingScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Platform Num\",\"filter\":\"{\\\"0\\\":\\\"plat0\\\",\\\"1\\\":\\\"plat1\\\",\\\"2\\\":\\\"ignore\\\"}\",\"name\":\"platformNum\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Time To Live\",\"filter\":\"0-2147483647\",\"name\":\"timeToLive\",\"type\":\"int\",\"value\":\"604800\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Manipulation Flag\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"manipulationFlag\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type of Number\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"international\\\",\\\"2\\\":\\\"national\\\",\\\"3\\\":\\\"networkSpecific\\\",\\\"4\\\":\\\"subscriberNumber\\\",\\\"5\\\":\\\"alphanumeric\\\",\\\"6\\\":\\\"abbreviated\\\"}\",\"name\":\"ton\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Plan Indicator\",\"filter\":\"{\\\"0\\\":\\\"unknown\\\",\\\"1\\\":\\\"isdn\\\",\\\"3\\\":\\\"data\\\",\\\"4\\\":\\\"telex\\\",\\\"6\\\":\\\"landMobile\\\",\\\"8\\\":\\\"national\\\",\\\"9\\\":\\\"private\\\",\\\"10\\\":\\\"ermes\\\",\\\"14\\\":\\\"internet\\\",\\\"18\\\":\\\"wapClientID\\\"}\",\"name\":\"npi\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Role Type\",\"filter\":\"{\\\"0\\\":\\\"server\\\",\\\"1\\\":\\\"client\\\"}\",\"name\":\"roleType\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1628, 'UDM', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.140\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF IP\",\"filter\":\"\",\"name\":\"ausfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"FQDN\",\"filter\":\"\",\"name\":\"fqdn\",\"type\":\"string\",\"value\":\"omc.com\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"0~4095\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Capacity\",\"filter\":\"0~65535\",\"name\":\"capacity\",\"type\":\"int\",\"value\":\"4096\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn1\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn1\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn2\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn2\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn3\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn3\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Plmn4\",\"filter\":\"^\\\\d{5,6}$\",\"name\":\"supportedPlmn4\",\"type\":\"string\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SUPI Ranges\",\"filter\":\"^imsi-\\\\d{15}~imsi-\\\\d{15}$\",\"name\":\"supiRanges\",\"type\":\"regex\",\"value\":\"imsi-001010100080000~imsi-001010100080099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GPSI Ranges\",\"filter\":\"^msisdn-\\\\d{2,15}~msisdn-\\\\d{2,15}$\",\"name\":\"gpsiRanges\",\"type\":\"regex\",\"value\":\"msisdn-69072000~msisdn-69072099\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Link\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"redisLink\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Redis Address\",\"filter\":\"\",\"name\":\"redisAddr\",\"type\":\"string\",\"value\":\"172.16.5.140:6379\"}]}'); -INSERT INTO `param_config` VALUES (1629, 'UDM', '', 'subsUEAmbr', 'Subs UE AMBR', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"uplink\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"downlink\",\"type\":\"regex\",\"value\":\"2 Gbps\"}]}'); -INSERT INTO `param_config` VALUES (1630, 'UDM', '', 'subsNssais', 'Subs NSSAIs', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Supported Features\",\"filter\":\"^[0-9a-fA-F]{8}$\",\"name\":\"supportedFeatures\",\"type\":\"regex\",\"value\":\"00000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Single NSSAIs\",\"filter\":\"\",\"name\":\"defaultSingleNSSAIs\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Single NSSAIs\",\"filter\":\"\",\"name\":\"singleNssais\",\"type\":\"string\",\"value\":\"1-000002\"}]}'); -INSERT INTO `param_config` VALUES (1631, 'UDM', '', 'forbiddenAreas', 'Forbidden Areas', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"}]}'); -INSERT INTO `param_config` VALUES (1632, 'UDM', '', 'serviceAreaRestriction', 'Service Area Restriction', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_ambr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Restriction Type\",\"filter\":\"{\\\"0\\\":\\\"Allowed Areas\\\", \\\"1\\\":\\\"Not Allowed Areas\\\"}\",\"name\":\"restrictionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"TACs\",\"filter\":\"\",\"name\":\"tacs\",\"type\":\"string\",\"value\":\"123\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Area Codes\",\"filter\":\"\",\"name\":\"areaCodes\",\"type\":\"string\",\"value\":\"123456\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TAs\",\"filter\":\"^\\\\d{1,2}$\",\"name\":\"maxTAs\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1633, 'UDM', '', 'smfSelection', 'Subs SMF Selection', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SNSSAI\",\"filter\":\"^\\\\d{1,3}[A-Fa-f0-9]{6}$\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{1,32}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN Indicator\",\"filter\":\"false;true;\",\"name\":\"defaultDnnInd\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LBO Roaming Allowed\",\"filter\":\"false;true;\",\"name\":\"lboRoamingAllowed\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"false;true;\",\"name\":\"iwkEpsInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"false;true;\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"false\"}],\"comment\":\"\",\"display\":\"DNN List\",\"filter\":\"1~4\",\"name\":\"dnnList\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1634, 'UDM', '', 'dnn', 'DNN Conf', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_nssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default PDU Session Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\"}\",\"name\":\"defaultPDUSessionType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed PDU Session Types\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"Ethernet\\\",\\\"4\\\":\\\"Unstruction\\\",\\\"5\\\":\\\"IPv4 \\u0026 IPv6\\\",\\\"6\\\":\\\"IPv4 \\u0026 IPv4v6\\\",\\\"7\\\":\\\"IPv6 \\u0026 IPv4v6\\\",\\\"8\\\":\\\"IPv4 \\u0026 IPv6 \\u0026 IPv4v6\\\"}\",\"name\":\"allowedPDUSessionTypes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"5QI\",\"filter\":\"0~255\",\"name\":\"5qi\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority Level\",\"filter\":\"1~127\",\"name\":\"priorityLevel\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default SSC Mode\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\"}\",\"name\":\"defaultSSCmode\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed SSC Modes\",\"filter\":\"{\\\"0\\\":\\\"SSC Mode1\\\",\\\"1\\\":\\\"SSC Mode2\\\",\\\"2\\\":\\\"SSC Mode3\\\",\\\"3\\\":\\\"SSC Mode1 \\u0026 SSC Mode2\\\",\\\"4\\\":\\\"SSC Mode1 \\u0026 SSC Mode3\\\",\\\"5\\\":\\\"SSC Mode2 \\u0026 SSC Mode3\\\",\\\"6\\\":\\\"SSC Mode1 \\u0026 SSC Mode2 \\u0026 SSC Mode3\\\"}\",\"name\":\"allowedSSCmodes\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interworking EPS Indicator\",\"filter\":\"\",\"name\":\"interworkingEPSIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LADN Indicator\",\"filter\":\"\",\"name\":\"ladnIndicator\",\"type\":\"bool\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristics\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristics\",\"type\":\"string\",\"value\":\"0001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Uplink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrUL\",\"type\":\"regex\",\"value\":\"1 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Subscribed Session AMBR Downlink\",\"filter\":\"^\\\\d+(\\\\.\\\\d+)?( ?)(bps|Kbps|Mbps|Gbps|Tbps)$\",\"name\":\"subscribedSessionAmbrDL\",\"type\":\"regex\",\"value\":\"2 Gbps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IP Address\",\"filter\":\"\",\"name\":\"staticIPAddress\",\"type\":\"ipv4\",\"value\":\"192.168.1.100\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Integrity\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneIntegrity\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Plane Confidentiality\",\"filter\":\"{\\\"0\\\":\\\"Null\\\",\\\"1\\\":\\\"Required\\\",\\\"2\\\":\\\"Preferred\\\",\\\"3\\\":\\\"Not Needed\\\"}\",\"name\":\"userPlaneConfidentiality\",\"type\":\"enum\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority Level\",\"filter\":\"0~255\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preempt Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1635, 'UDM', '', 'epsTemplate', 'EPS User Template', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{0,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_eps\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APN OI Replacement\",\"filter\":\"^.{0,31}$\",\"name\":\"apnOIReplacement\",\"type\":\"string\",\"value\":\"money\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RFSP\",\"filter\":\"\",\"name\":\"rfsp\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RAU TAU Timer\",\"filter\":\"\",\"name\":\"rauTauTimer\",\"type\":\"int\",\"value\":\"120\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]}'); -INSERT INTO `param_config` VALUES (1636, 'UDM', '', 'epsApn', 'EPS APN', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"^.{0,127}$\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN Type\",\"filter\":\"{\\\"0\\\":\\\"IPv4\\\",\\\"1\\\":\\\"IPv6\\\",\\\"2\\\":\\\"IPv4v6\\\",\\\"3\\\":\\\"IPv4 or IPv6\\\"}\",\"name\":\"pdnType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QCI\",\"filter\":\"1~255\",\"name\":\"qci\",\"type\":\"int\",\"value\":\"9\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Priority\",\"filter\":\"1~127\",\"name\":\"arpPriorityLevel\",\"type\":\"int\",\"value\":\"8\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Capability\",\"filter\":\"{\\\"0\\\":\\\"Not Preempt\\\",\\\"1\\\":\\\"May Preempt\\\"}\",\"name\":\"arpPreemptCap\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ARP Preemption Vulnerability\",\"filter\":\"{\\\"0\\\":\\\"Not Preemptable\\\",\\\"1\\\":\\\"Preemptable\\\"}\",\"name\":\"arpPreemptVuln\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Context Identifier\",\"filter\":\"\",\"name\":\"contextIdentifier\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"VPLMN Dynamic Address Allowed\",\"filter\":\"false;true;\",\"name\":\"vplmnDynamicAddressAllowed\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PDN GW Allocation Type\",\"filter\":\"{\\\"0\\\":\\\"Static\\\",\\\"1\\\":\\\"Dynamic\\\"}\",\"name\":\"pdnGWAllocationType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Uplink\",\"filter\":\"0~4294967295\",\"name\":\"ambrUplink\",\"type\":\"int\",\"value\":\"100000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMBR Downlink\",\"filter\":\"0~4294967295\",\"name\":\"ambrDownlink\",\"type\":\"int\",\"value\":\"200000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Charging Characteristic\",\"filter\":\"4~4\",\"name\":\"chargingCharacteristic\",\"type\":\"string\",\"value\":\"0001\"}]}'); -INSERT INTO `param_config` VALUES (1637, 'UDM', '', 'applicationServer', 'Application Server', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AS Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default Handling\",\"filter\":\"{\\\"0\\\":\\\"Session Continued\\\",\\\"1\\\":\\\"Session Terminated\\\"}\",\"name\":\"defaultHandling\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:192.168.8.26:7060\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Diameter Address\",\"filter\":\"^.{1,127}$\",\"name\":\"diameterAddress\",\"type\":\"string\",\"value\":\"mmtel.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rep Data Size Limit\",\"filter\":\"0~65535\",\"name\":\"repDataSizeLimit\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Request\",\"filter\":\"false;true;\",\"name\":\"includeRegisterRequest\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Include Register Response\",\"filter\":\"false;true;\",\"name\":\"includeRegisterResponse\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1638, 'UDM', '', 'scscfSet', 'SCSCF Set', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,31}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"mmtel_as\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Priority\",\"filter\":\"\",\"name\":\"priority\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Name\",\"filter\":\"^.{1,127}$\",\"name\":\"serverName\",\"type\":\"string\",\"value\":\"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\"}]}'); -INSERT INTO `param_config` VALUES (1639, 'UDM', '', 'triggerPoint', 'Trigger Point', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~16\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"^.{1,32}$\",\"name\":\"name\",\"type\":\"string\",\"value\":\"def_snssai\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Type CNF\",\"filter\":\"0~1\",\"name\":\"conditionTypeCNF\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"1~4\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Condition Negated\",\"filter\":\"0~1\",\"name\":\"conditionNegated\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group\",\"filter\":\"0~4096\",\"name\":\"group\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"^.{0,32}$\",\"name\":\"method\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Header\",\"filter\":\"^.{0,64}$\",\"name\":\"sipHeader\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SIP Content\",\"filter\":\"^.{0,64}$\",\"name\":\"sipContent\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"SPT List\",\"filter\":\"1~4\",\"name\":\"sptList\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1640, 'UDM', '', 's6aServer', 'S6a Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1641, 'UDM', '', 'cxServer', 'Cx Server', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Type\",\"filter\":\"{\\\"0\\\":\\\"TCP\\\",\\\"1\\\":\\\"SCTP\\\"}\",\"name\":\"netType\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Address\",\"filter\":\"\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"172.16.5.140:3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Host\",\"filter\":\"^.{1,127}$\",\"name\":\"host\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Realm\",\"filter\":\"^.{1,127}$\",\"name\":\"realm\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); - --- SMF 更新时间2024/06/17 17:50 -INSERT INTO `param_config` VALUES (1645, 'SMF', '', 'smfSystem', 'SMF System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI IP\",\"filter\":\"\",\"name\":\"sbiIpAddr\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Port\",\"filter\":\"0~65535\",\"name\":\"sbiPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\", \\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv4\",\"filter\":\"\",\"name\":\"n4Ipv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4 IPv6\",\"filter\":\"\",\"name\":\"n4Ipv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv4\",\"filter\":\"\",\"name\":\"n4UIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N4U IPv6\",\"filter\":\"\",\"name\":\"n4UIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF URI\",\"filter\":\"\",\"name\":\"amfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.120:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF Enable\",\"filter\":\"\",\"name\":\"pcfEnable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"display\":\"5G Charging Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"chfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Primary URI\",\"filter\":\"\",\"name\":\"chfPrimaryUri\",\"type\":\"string\",\"value\":\"http://172.16.5.240:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CHF Secondary URI\",\"filter\":\"\",\"name\":\"chfSecondaryUri\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv4\",\"filter\":\"\",\"name\":\"primaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"114.114.114.114\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv4\",\"filter\":\"\",\"name\":\"secondaryDnsIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary DNS IPv6\",\"filter\":\"\",\"name\":\"primaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary DNS IPv6\",\"filter\":\"\",\"name\":\"secondaryDnsIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv4\",\"filter\":\"\",\"name\":\"primaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv4\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv4\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary PCSCF IPv6\",\"filter\":\"\",\"name\":\"primaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary PCSCF IPv6\",\"filter\":\"\",\"name\":\"secondaryPcscfIpv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE MTU\",\"filter\":\"0~65535\",\"name\":\"ueMtu\",\"type\":\"int\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1646, 'SMF', '', 'spgwSystem', 'SPGW Sytem Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local S11 IP\",\"filter\":\"\",\"name\":\"s11Ip\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter IP\",\"filter\":\"\",\"name\":\"localDiameterIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Host Name\",\"filter\":\"\",\"name\":\"localDiameterHostName\",\"type\":\"string\",\"value\":\"smf.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Diameter Realm Name\",\"filter\":\"\",\"name\":\"localDiameterRealmName\",\"type\":\"string\",\"value\":\"mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gy Enable\",\"filter\":\"false;true;\",\"name\":\"peerGyEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gy IP\",\"filter\":\"\",\"name\":\"primaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gy IP\",\"filter\":\"\",\"name\":\"secondaryPeerGyIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gy Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGyPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Enable\",\"filter\":\"false;true;\",\"name\":\"peerGxEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gx Charging Enable\",\"filter\":\"false;true;\",\"name\":\"gxChargingEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Primary Remote Gx IP\",\"filter\":\"\",\"name\":\"primaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Primary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"primaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Remote Gx IP\",\"filter\":\"\",\"name\":\"secondaryPeerGxIp\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Secondary Remote Gx Port\",\"filter\":\"0~65535\",\"name\":\"secondaryPeerGxPort\",\"type\":\"int\",\"value\":\"3868\"}]}'); -INSERT INTO `param_config` VALUES (1647, 'SMF', '', 'upfConfig', 'UPF Config', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"id\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"e.g. ip:port\",\"display\":\"Address\",\"filter\":\"7~45\",\"name\":\"addr\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"},{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~2047\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"IPv4,IPv6,IPv4v6\",\"display\":\"Ip Pool Type\",\"filter\":\"\",\"name\":\"ipPoolType\",\"type\":\"string\",\"value\":\"IPv4v6\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. 192.168.1.0/24\",\"display\":\"IPv4 Pools\",\"filter\":\"10~256\",\"name\":\"ipv4Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"CIDR format, e.g. fe80::20c:29ff:fee4:dab7/50\",\"display\":\"IPv6 Pools\",\"filter\":\"5~512\",\"name\":\"ipv6Pools\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv4 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv4Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 Start\",\"filter\":\"\",\"name\":\"staticIpv4Start\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv4 format\",\"display\":\"Static IPv4 End\",\"filter\":\"\",\"name\":\"staticIpv4End\",\"type\":\"ipv4\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Static IPv6 Enable\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"staticIpv6Enable\",\"type\":\"bool\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 Start\",\"filter\":\"\",\"name\":\"staticIpv6Start\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"ipv6 format\",\"display\":\"Static IPv6 End\",\"filter\":\"\",\"name\":\"staticIpv6End\",\"type\":\"ipv6\",\"value\":\"\"}],\"display\":\"UE DNN IP Pool\",\"name\":\"ueDnnIpPool\"}]}'); -INSERT INTO `param_config` VALUES (1648, 'SMF', '', 'dnnSelectUpf', 'DNN Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1649, 'SMF', '', 'dnnTaiSelectUpf', 'DNN TAI Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN\",\"filter\":\"1~64\",\"name\":\"dnn\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"MCC+MNC+TAC\",\"display\":\"TAI\",\"filter\":\"1~64\",\"name\":\"tai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf2-Id\"}]}'); -INSERT INTO `param_config` VALUES (1650, 'SMF', '', 'snssaiSelectUpf', 'SNSSAI Select UPF', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Index\",\"filter\":\"0~65535\",\"name\":\"index\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"display\":\"Enable\",\"filter\":\"false;true;\",\"name\":\"enable\",\"type\":\"bool\",\"value\":\"true\"},{\"access\":\"read-write\",\"comment\":\"sst1-sd1;sst2-sd2;sst3-sd3\",\"display\":\"SNSSAI\",\"filter\":\"1~64\",\"name\":\"snssai\",\"type\":\"string\",\"value\":\"1-000001\"},{\"access\":\"read-write\",\"comment\":\"upf1-id;upf2-id;upf3-id\",\"display\":\"UPF ID\",\"filter\":\"1~64\",\"name\":\"upfId\",\"type\":\"string\",\"value\":\"upf1-Id\"}]}'); -INSERT INTO `param_config` VALUES (1651, 'SMF', '', 'offlineChargingConfig', 'Offline Charging Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Name\",\"filter\":\"\",\"name\":\"cdrFileName\",\"type\":\"string\",\"value\":\"smf.cdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Path\",\"filter\":\"\",\"name\":\"cdrFilePath\",\"type\":\"string\",\"value\":\"/var/log/smfCdr\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"CDR File Num\",\"filter\":\"1~999999999\",\"name\":\"cdrFileNum\",\"type\":\"int\",\"value\":\"50\"},{\"access\":\"read-write\",\"comment\":\"Megabytes\",\"display\":\"CDR File Size\",\"filter\":\"1~999999\",\"name\":\"cdrFileSize\",\"type\":\"int\",\"value\":\"300\"},{\"access\":\"read-write\",\"comment\":\"Days\",\"display\":\"CDR File Max Age\",\"filter\":\"0~9999\",\"name\":\"cdrFileMaxAge\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Free Subscribers CDR Enable\",\"filter\":\"\",\"name\":\"freeSubsCdrEnable\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"Seconds\",\"display\":\"Time Threshold\",\"filter\":\"0~999999999\",\"name\":\"timeThreshold\",\"type\":\"int\",\"value\":\"600\"},{\"access\":\"read-write\",\"comment\":\"Bytes\",\"display\":\"Volume Threshold\",\"filter\":\"0~999999999999999\",\"name\":\"volumeThreshold\",\"type\":\"int\",\"value\":\"0\"}]}'); - --- MME 更新时间2024/06/27 15:13 -INSERT INTO `param_config` VALUES (1657, 'MME', '', 'system', 'System Config', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"CSFB Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"csfbEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"true|false\",\"display\":\"VoLTE Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"volteEnabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S1 MME IP\",\"filter\":\"0~64\",\"name\":\"s1MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"S1 MME Port\",\"filter\":\"0~65535\",\"name\":\"s1MmePort\",\"type\":\"int\",\"value\":\"36412\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S11 MME IP\",\"filter\":\"0~64\",\"name\":\"s11MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S11 MME Port\",\"filter\":\"0~65535\",\"name\":\"s11MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"S10 MME IP\",\"filter\":\"0~64\",\"name\":\"s10MmeIp\",\"type\":\"string\",\"value\":\"192.168.1.178\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"S10 MME Port\",\"filter\":\"0~65535\",\"name\":\"s10MmePort\",\"type\":\"int\",\"value\":\"2123\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGs MME IP\",\"filter\":\"0~64\",\"name\":\"sgsMmeIp\",\"type\":\"string\",\"value\":\"192.168.1.179\"},{\"access\":\"read-only\",\"comment\":\"0~65535\",\"display\":\"SGs MME Port\",\"filter\":\"0~65535\",\"name\":\"sgsMmePort\",\"type\":\"int\",\"value\":\"29118\"},{\"access\":\"read-write\",\"comment\":\"0~100\",\"display\":\"S6A MME Identity\",\"filter\":\"0~100\",\"name\":\"s6aIdentity\",\"type\":\"string\",\"value\":\"mme.epc.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"0~20\",\"display\":\"S6A MME IP\",\"filter\":\"0~20\",\"name\":\"localIp\",\"type\":\"string\",\"value\":\"172.16.5.220\"}]}'); -INSERT INTO `param_config` VALUES (1658, 'MME', '', 'gummei', 'Gummei List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"Group ID\",\"filter\":\"0~65535\",\"name\":\"groupId\",\"type\":\"int\",\"value\":\"4\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Code\",\"filter\":\"0~255\",\"name\":\"code\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1659, 'MME', '', 'tai', 'TAI List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"}]}'); -INSERT INTO `param_config` VALUES (1660, 'MME', '', 'hss', 'HSS List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{1,15}$\",\"display\":\"IMSI Prefix\",\"filter\":\"^[0-9]{1,15}$\",\"name\":\"imsiPre\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"HSS Hostname\",\"filter\":\"0~128\",\"name\":\"hssHostname\",\"type\":\"string\",\"value\":\"hss.ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-write\",\"comment\":\"SCTP|TCP\",\"display\":\"Protocol\",\"filter\":\"0~8\",\"name\":\"protocol\",\"type\":\"string\",\"value\":\"SCTP\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"HSS Port\",\"filter\":\"0~65535\",\"name\":\"hssPort\",\"type\":\"int\",\"value\":\"3868\"}]}'); -INSERT INTO `param_config` VALUES (1661, 'MME', '', 'sgw', 'SGW List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"TAC\",\"filter\":\"0~65535\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"SGW IP\",\"filter\":\"0~64\",\"name\":\"sgwIp\",\"type\":\"string\",\"value\":\"172.16.5.150\"}]}'); -INSERT INTO `param_config` VALUES (1662, 'MME', '', 'pgw', 'PGW List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~128\",\"display\":\"APN\",\"filter\":\"0~128\",\"name\":\"apn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"PGW IP\",\"filter\":\"0~64\",\"name\":\"pgwIp\",\"type\":\"string\",\"value\":\"192.168.1.181\"}]}'); -INSERT INTO `param_config` VALUES (1663, 'MME', '', 'amf', 'AMF List', '', '{\"array\":[{\"access\":\"read\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"^[0-9]{5,6}$\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~16777215\",\"name\":\"tac\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~64\",\"display\":\"AMF IP\",\"filter\":\"0~64\",\"name\":\"amfIp\",\"type\":\"string\",\"value\":\"172.16.5.120\"}]}'); - --- UPF 更新时间2024/07/15 14:30 -INSERT INTO `param_config` VALUES (1681, 'UPF', '', 'general', 'General', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Config File Directory\",\"filter\":\"\",\"name\":\"configFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/etc/upf/\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"EXE File Directory\",\"filter\":\"\",\"name\":\"exeFileDirectory\",\"type\":\"string\",\"value\":\"/usr/local/bin/\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"System ID\",\"filter\":\"\",\"name\":\"systemId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~8\",\"display\":\"Data Forwarder Number\",\"filter\":\"1~8\",\"name\":\"dataForwarderNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Common Statistic Interval\",\"filter\":\"\",\"name\":\"commonStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"User Statistic Interval\",\"filter\":\"\",\"name\":\"userStatisticInterval\",\"type\":\"int\",\"value\":\"60\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N3 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN3OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX N6 OverLoad Threshold Mbps\",\"filter\":\"\",\"name\":\"rxN6OverLoadThresholdMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Checksum Offload\",\"filter\":\"0~255\",\"name\":\"checksumOffload\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Downlink Buffer Num\",\"filter\":\"\",\"name\":\"maxDownlinkBufferNum\",\"type\":\"int\",\"value\":\"50\"}]}'); -INSERT INTO `param_config` VALUES (1682, 'UPF', '', 'logger', 'Logger', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Log File Full Path\",\"filter\":\"\",\"name\":\"logFileFullPath\",\"type\":\"string\",\"value\":\"/var/log/upf.log\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Log Level\",\"filter\":\"\",\"name\":\"logLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"error|warning|info|debug\",\"display\":\"Upfd Log Level\",\"filter\":\"\",\"name\":\"upfdLogLevel\",\"type\":\"string\",\"value\":\"error\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Upfd Log Transfer\",\"filter\":\"\",\"name\":\"upfdLogTransfer\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Report Caller\",\"filter\":\"\",\"name\":\"reportCaller\",\"type\":\"bool\",\"value\":\"false\"}]}'); -INSERT INTO `param_config` VALUES (1683, 'UPF', '', 'pfcp', 'PFCP', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local UDP Port\",\"filter\":\"1~65535\",\"name\":\"localUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv4\",\"filter\":\"\",\"name\":\"smfIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF IPv6\",\"filter\":\"\",\"name\":\"smfIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"SMF UDP Port\",\"filter\":\"1~65535\",\"name\":\"smfUdpPort\",\"type\":\"int\",\"value\":\"8805\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Retry Interval\",\"filter\":\"1~255\",\"name\":\"retryInterval\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Max Retry\",\"filter\":\"0~255\",\"name\":\"maxRetry\",\"type\":\"int\",\"value\":\"3\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Heartbeat Interval\",\"filter\":\"1~255\",\"name\":\"heartbeatInterval\",\"type\":\"int\",\"value\":\"15\"}]}'); -INSERT INTO `param_config` VALUES (1684, 'UPF', '', 'telnet', 'Telnet', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv46\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv4\",\"filter\":\"\",\"name\":\"localIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local IPv6\",\"filter\":\"\",\"name\":\"localIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"1~65535\",\"display\":\"Local Port\",\"filter\":\"1~65535\",\"name\":\"localPort\",\"type\":\"int\",\"value\":\"4100\"}]}'); -INSERT INTO `param_config` VALUES (1685, 'UPF', '', 'redisDb', 'Redis DB', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Enabled\",\"filter\":\"\",\"name\":\"enabled\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"tcp|udp\",\"display\":\"Net Type\",\"filter\":\"\",\"name\":\"netType\",\"type\":\"string\",\"value\":\"tcp\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server Address\",\"filter\":\"\",\"name\":\"serverAddr\",\"type\":\"string\",\"value\":\"0.0.0.0:0\"}]}'); -INSERT INTO `param_config` VALUES (1686, 'UPF', '', 'dataForwarderCommon', 'Data Forwarder Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"upfd|tun\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"string\",\"value\":\"upfd\"},{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Instance ID\",\"filter\":\"1~8\",\"name\":\"instanceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"1~255\",\"display\":\"Main CPU\",\"filter\":\"1~255\",\"name\":\"mainCpu\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"2,3,4,5 or 2-5\",\"display\":\"CPU Workers\",\"filter\":\"\",\"name\":\"cpuWorkers\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"data forwarder already run or not\",\"display\":\"Is Run\",\"filter\":\"0~1\",\"name\":\"isRun\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Hot Standby work or not\",\"display\":\"Is Hot Standby\",\"filter\":\"0~1\",\"name\":\"isHotStandby\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"The value from which TEID is allocated\",\"display\":\"TEID Start\",\"filter\":\"\",\"name\":\"teidStart\",\"type\":\"int\",\"value\":\"16777216\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Heartbeat Interval\",\"filter\":\"\",\"name\":\"n3HeartbeatInterval\",\"type\":\"int\",\"value\":\"30\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"RX TX Queue Num\",\"filter\":\"\",\"name\":\"rxTxQueueNum\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"data rx\\u0026tx use C socket\",\"display\":\"Use Socket\",\"filter\":\"0~1\",\"name\":\"useSocket\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable 5G ethernet LAN\",\"display\":\"Enable Tap\",\"filter\":\"0~1\",\"name\":\"enableTap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"Enable PFCP Qer Control\",\"display\":\"Enable Qer\",\"filter\":\"0~1\",\"name\":\"enableQer\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1687, 'UPF', '', 'dataForwarderUpfd', 'Data Forwarder Upfd', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"Currently only support vfio-pci\",\"display\":\"UIO Driver\",\"filter\":\"\",\"name\":\"uioDriver\",\"type\":\"string\",\"value\":\"vfio-pci\"},{\"access\":\"read-write\",\"comment\":\"The format must be IP:Port\",\"display\":\"Telnet Address IP:Port\",\"filter\":\"\",\"name\":\"commandlineListen\",\"type\":\"string\",\"value\":\"localhost:5002\"},{\"access\":\"read-write\",\"comment\":\"the unit is GB\",\"display\":\"Heap Size GB\",\"filter\":\"1~8\",\"name\":\"heapSizeGB\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"the unit is MB\",\"display\":\"State Seg Size MB\",\"filter\":\"64~512\",\"name\":\"stateSegSizeMB\",\"type\":\"int\",\"value\":\"256\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK No PCI\",\"filter\":\"0~1\",\"name\":\"dpdkNoPci\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Mem Channel Num\",\"filter\":\"0~128\",\"name\":\"memChannelNum\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Session Base Va\",\"filter\":\"\",\"name\":\"sessionBaseVa\",\"type\":\"string\",\"value\":\"0x2000000000\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Buffers Per Numa\",\"filter\":\"\",\"name\":\"buffersPerNuma\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 RSS Hash\",\"filter\":\"\",\"name\":\"n3RssHash\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1688, 'UPF', '', 'dataInterfaceList', 'Data Interface List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"N3|N6|N9|N19\",\"display\":\"Interface Type\",\"filter\":\"\",\"name\":\"interfaceType\",\"type\":\"string\",\"value\":\"N3\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface ID\",\"filter\":\"1~32\",\"name\":\"interfaceId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"host|vmxnet3|dpdk|socket|uds\",\"display\":\"Driver Type\",\"filter\":\"\",\"name\":\"driverType\",\"type\":\"string\",\"value\":\"host\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"IP Type\",\"filter\":\"\",\"name\":\"ipType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"IPv4\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"IPv4 Address List\",\"filter\":\"0~8\",\"name\":\"ipv4AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~8\",\"display\":\"Index\",\"filter\":\"1~8\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"IPv6 Address List\",\"filter\":\"0~8\",\"name\":\"ipv6AddrList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MAC Address\",\"filter\":\"\",\"name\":\"macAddr\",\"type\":\"string\",\"value\":\"00:00:00:00:00:00\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Interface PCI\",\"filter\":\"\",\"name\":\"interfacePCI\",\"type\":\"string\",\"value\":\"0000:00:00.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"System Network Card Name\",\"filter\":\"\",\"name\":\"systemNetworkCardName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"null|bak|sub|xor|round|lacp\",\"display\":\"Bond Type\",\"filter\":\"\",\"name\":\"bondType\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Bond ID\",\"filter\":\"0~32\",\"name\":\"bondId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD TX Interval Ms\",\"filter\":\"\",\"name\":\"bfdTxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD RX Interval Ms\",\"filter\":\"\",\"name\":\"bfdRxIntervalMs\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"default\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv4\",\"filter\":\"\",\"name\":\"bfdGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"BFD Gateway IPv6\",\"filter\":\"\",\"name\":\"bfdGatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MTU\",\"filter\":\"0~65535\",\"name\":\"mtu\",\"type\":\"int\",\"value\":\"1500\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Src Port\",\"filter\":\"1~65535\",\"name\":\"udpSrcPort\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDP Listen Port\",\"filter\":\"0~65536\",\"name\":\"udpListenPort\",\"type\":\"int\",\"value\":\"2152\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Local File Full Path\",\"filter\":\"\",\"name\":\"udsLocalFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDS Remote File Full Path\",\"filter\":\"\",\"name\":\"udsRemoteFileFullPath\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Link Detection Type\",\"filter\":\"0~1\",\"name\":\"linkDetectionType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NAT Interface ID\",\"filter\":\"0~1\",\"name\":\"natInterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"0.0.0.0\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv4 Pool List\",\"filter\":\"1~32\",\"name\":\"gtpuRemoteIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"GTPU Remote IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"gtpuRemoteIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"GTPU Signaling Handle\",\"filter\":\"0~1\",\"name\":\"gtpuSignalingHandle\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMS Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"imsDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Data Default DSCP Value\",\"filter\":\"0~1\",\"name\":\"dataDefaultDSCPValue\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Inner DSCP Value Map\",\"filter\":\"0~1\",\"name\":\"innerDSCPValueMap\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Support Speed Mbps\",\"filter\":\"0~65536\",\"name\":\"maxSupportSpeedMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkRxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Queues Number\",\"filter\":\"0~127\",\"name\":\"dpdkTxQueuesNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK RX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkRxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK TX Desc Number\",\"filter\":\"0~32768\",\"name\":\"dpdkTxDescNumber\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DPDK Workers\",\"filter\":\"\",\"name\":\"dpdkworkers\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1689, 'UPF', '', 'networkControlCommon', 'Network Control Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Disabled\",\"filter\":\"0~1\",\"name\":\"localSwitchDisabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max TCP Sync Per Second\",\"filter\":\"\",\"name\":\"maxTCPSyncPerSecond\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UPF Max Support Mbps\",\"filter\":\"\",\"name\":\"upfMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dscp Inner Mapping\",\"filter\":\"\",\"name\":\"dscpInnerMapping\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1690, 'UPF', '', 'networkControlDnnList', 'Network Control DNN List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Name\",\"filter\":\"\",\"name\":\"dnnName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Header Enrich Info List\",\"filter\":\"0~32\",\"name\":\"headerEnrichInfoList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Switch Check\",\"filter\":\"0~1\",\"name\":\"localSwitchCheck\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"UE IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"UE IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"ueIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4\",\"filter\":\"\",\"name\":\"ipv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv4 Mask\",\"filter\":\"\",\"name\":\"ipv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"}],\"comment\":\"\",\"display\":\"Dst Server IPv4 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv4PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6\",\"filter\":\"\",\"name\":\"ipv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ipv6Prefix\",\"type\":\"int\",\"value\":\"64\"}],\"comment\":\"\",\"display\":\"Dst Server IPv6 Pool List\",\"filter\":\"0~32\",\"name\":\"dstServerIpv6PoolList\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"ipv4|ipv6|ipv4v6\",\"display\":\"Gateway IP Type\",\"filter\":\"\",\"name\":\"gatewayIpType\",\"type\":\"string\",\"value\":\"ipv4\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv4\",\"filter\":\"\",\"name\":\"gatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Gateway IPv6\",\"filter\":\"\",\"name\":\"gatewayIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv4\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Secondary Gateway IPv6\",\"filter\":\"\",\"name\":\"secondaryGatewayIpv6\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1691, 'UPF', '', 'networkControlSnssaiList', 'Network Control SNSSAI List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SST\",\"filter\":\"\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"\",\"name\":\"sd\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"QER Max Support Mbps\",\"filter\":\"\",\"name\":\"qerMaxSupportMbps\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Statistic Enabled\",\"filter\":\"0~1\",\"name\":\"statisticEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Min\",\"filter\":\"\",\"name\":\"vlanIdMin\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Vlan ID Max\",\"filter\":\"\",\"name\":\"vlanIdMax\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1692, 'UPF', '', 'networkControlAclWhiteList', 'Network Control ACL White List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]}'); -INSERT INTO `param_config` VALUES (1693, 'UPF', '', 'networkControlAclBlackList', 'Network Control ACL Black List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4\",\"filter\":\"\",\"name\":\"ueIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv4 Mask\",\"filter\":\"\",\"name\":\"ueIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6\",\"filter\":\"\",\"name\":\"ueIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UE IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"ueIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4\",\"filter\":\"\",\"name\":\"dstServerIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv4 Mask\",\"filter\":\"\",\"name\":\"dstServerIpv4Mask\",\"type\":\"string\",\"value\":\"255.255.255.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6\",\"filter\":\"\",\"name\":\"dstServerIpv6\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dst Server IPv6 Prefix\",\"filter\":\"1~128\",\"name\":\"dstServerIpv6Prefix\",\"type\":\"int\",\"value\":\"64\"}]}'); -INSERT INTO `param_config` VALUES (1694, 'UPF', '', 'networkControlDnsServerList', 'Network Control DNS Server List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1\",\"display\":\"Enabled\",\"filter\":\"0~1\",\"name\":\"enabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNS Name\",\"filter\":\"\",\"name\":\"dnsName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv4\",\"filter\":\"\",\"name\":\"serverIpv4\",\"type\":\"string\",\"value\":\"0.0.0.0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Server IPv6\",\"filter\":\"\",\"name\":\"serverIpv6\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1695, 'UPF', '', 'dpiCommon', 'DPI Common', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Detect Packet Num\",\"filter\":\"\",\"name\":\"maxDetectPacketNum\",\"type\":\"int\",\"value\":\"20\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTP Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpProtoEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"HTTPS Proto Enabled\",\"filter\":\"0~1\",\"name\":\"httpsProtoEnabled\",\"type\":\"int\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1696, 'UPF', '', 'dpiHeaderEnrichInfoList', 'DPI Header Enrich Info List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Type\",\"filter\":\"\",\"name\":\"type\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Name\",\"filter\":\"\",\"name\":\"name\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Value\",\"filter\":\"\",\"name\":\"value\",\"type\":\"string\",\"value\":\"\"}]}'); -INSERT INTO `param_config` VALUES (1697, 'UPF', '', 'dpiAppList', 'DPI APP List', '', '{\"array\":[{\"access\":\"read-write\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"APP Name\",\"filter\":\"\",\"name\":\"appName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Proxy Enabled\",\"filter\":\"0~1\",\"name\":\"proxyEnabled\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Force Check Type\",\"filter\":\"0~1\",\"name\":\"forceCheckType\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N3 Interface ID\",\"filter\":\"0~32\",\"name\":\"n3InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"N6 Interface ID\",\"filter\":\"0~32\",\"name\":\"n6InterfaceId\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"array\":[{\"access\":\"read-only\",\"comment\":\"1~32\",\"display\":\"Index\",\"filter\":\"1~32\",\"name\":\"index\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rule ID\",\"filter\":\"\",\"name\":\"ruleId\",\"type\":\"int\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"REGEX Match\",\"filter\":\"\",\"name\":\"regexMatch\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Flow Description\",\"filter\":\"\",\"name\":\"flowDescription\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Custom Name\",\"filter\":\"\",\"name\":\"customName\",\"type\":\"string\",\"value\":\"\"}],\"comment\":\"\",\"display\":\"Rule List\",\"filter\":\"0~32\",\"name\":\"ruleList\",\"type\":\"int\",\"value\":\"1\"}]}'); - --- IMS 更新时间2024/06/26 14.41 -INSERT INTO `param_config` VALUES (1700, 'IMS', '', 'system', 'System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Label\",\"filter\":\"\",\"name\":\"label\",\"type\":\"string\",\"value\":\"ims-core\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MCC\",\"filter\":\"\",\"name\":\"hplmnMCC\",\"type\":\"string\",\"value\":\"001\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"HPLMN MNC\",\"filter\":\"\",\"name\":\"hplmnMNC\",\"type\":\"string\",\"value\":\"01\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Local Network IPv4\",\"filter\":\"\",\"name\":\"LocalNetworkIPv4\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv4\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.110\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Public Network IPv6\",\"filter\":\"\",\"name\":\"serviceIPv6\",\"type\":\"ipv6\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 1\",\"filter\":\"\",\"name\":\"domainName1\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 2\",\"filter\":\"\",\"name\":\"domainName2\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 3\",\"filter\":\"\",\"name\":\"domainName3\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain Name 4\",\"filter\":\"\",\"name\":\"domainName4\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MultiIPStack Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"multiIPStackInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Register Timer\",\"filter\":\"120~1000000\",\"name\":\"registerTimer\",\"type\":\"int\",\"value\":\"7200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Max Call Duration\",\"filter\":\"1800~1000000\",\"name\":\"maxCallDuration\",\"type\":\"int\",\"value\":\"43200\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal SMS Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalSMSInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal CDR Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalCDRInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Internal KPI Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"internalKPIInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF IP Address\",\"filter\":\"\",\"name\":\"pcfIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.160\"}]}'); -INSERT INTO `param_config` VALUES (1701, 'IMS', '', 'plmn', 'PLMN List', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MCC\",\"filter\":\"^[0-9]{3}$\",\"name\":\"mcc\",\"type\":\"regex\",\"value\":\"001\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"MNC\",\"filter\":\"^[0-9]{2,3}$\",\"name\":\"mnc\",\"type\":\"regex\",\"value\":\"01\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"Domain\",\"filter\":\"0~128\",\"name\":\"domain\",\"type\":\"string\",\"value\":\"ims.mnc001.mcc001.3gppnetwork.org\"}]}'); -INSERT INTO `param_config` VALUES (1702, 'IMS', '', 'mmtel_dialplan', 'MMTEL Dialplan', '', '{\"array\":[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-only\",\"comment\":\"\",\"display\":\"NaName\",\"filter\":\"0~128\",\"name\":\"naName\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Title\",\"filter\":\"0~128\",\"name\":\"title\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Method\",\"filter\":\"0-2\",\"name\":\"method\",\"type\":\"string\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Prefix\",\"filter\":\"0~128\",\"name\":\"prefix\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Start\",\"filter\":\"0~128\",\"name\":\"start\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"End\",\"filter\":\"0~128\",\"name\":\"end\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Attrib\",\"filter\":\"0~128\",\"name\":\"attrib\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Number Len\",\"filter\":\"0~128\",\"name\":\"numberLen\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Rsc\",\"filter\":\"0~128\",\"name\":\"rsc\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Nai\",\"filter\":\"0~128\",\"name\":\"e164Nai\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Delete\",\"filter\":\"0~128\",\"name\":\"e164Delete\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"E164 Insert\",\"filter\":\"0~128\",\"name\":\"e164Insert\",\"type\":\"string\",\"value\":\"\"},{\"access\":\"read-write\",\"comment\":\"Enable: Close/Open\",\"display\":\"Admin State\",\"filter\":\"{\\\"0\\\":\\\"Close\\\", \\\"1\\\":\\\"Open\\\"}\",\"name\":\"adminState\",\"type\":\"enum\",\"value\":\"0\"}]}'); -INSERT INTO `param_config` VALUES (1703, 'IMS', '', 'ds_system', 'DS System', '', '{\"list\":[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"dispatchSystemInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Transcode Indicator\",\"filter\":\"{\\\"0\\\":\\\"false\\\", \\\"1\\\":\\\"true\\\"}\",\"name\":\"transcodeInd\",\"type\":\"bool\",\"value\":\"false\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System IPv4\",\"filter\":\"\",\"name\":\"dispatchSystemIP\",\"type\":\"ipv4\",\"value\":\"1.0.0.1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Dispatch System Port\",\"filter\":\"\",\"name\":\"dispatchSystemPort\",\"type\":\"int\",\"value\":\"5060\"}]}'); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/lib/dborm/dborm.go b/lib/dborm/dborm.go index d3a0a3dc..1f782c0d 100644 --- a/lib/dborm/dborm.go +++ b/lib/dborm/dborm.go @@ -428,68 +428,6 @@ func XormParseResult(body []byte) ([]NeInfo, error) { return neInfo, nil } -type ParamConfig struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType"` - NeId string `json:"neId"` - TopTag string `json:"topTag"` - TopDisplay string `json:"topDisplay"` - ParamJson string `json:"paramJson"` -} - -func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) { - var affected, a int64 - var err error - paramConfig := new(ParamConfig) - for n, d := range *mapJson { - if d == nil { - break - } - log.Debugf("n: %s", n) - - for t, p := range d.(map[string]interface{}) { - if p == nil { - break - } - log.Debug("t:", t) - log.Debug("p:", p) - for k, v := range p.(map[string]interface{}) { - log.Debug("k, v: ", k, v) - if k == "display" { - paramConfig.TopDisplay = fmt.Sprintf("%v", v) - - } else { - pc, _ := json.Marshal(v) - paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc)) - } - } - - paramConfig.NeType = strings.ToUpper(n) - paramConfig.NeId = "" - paramConfig.TopTag = t - // paramConfig.TopDisplay = p["display"] - // paramConfig.ParamJson = p.(string) - - log.Debug("paramConfig:", paramConfig) - - xSession := xEngine.NewSession() - defer xSession.Close() - _, err = xSession.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete() - if err != nil { - log.Error("Failed to insert param_config:", err) - } - a, err = xSession.Insert(paramConfig) - if err != nil { - log.Error("Failed to insert param_config:", err) - } - affected += a - xSession.Commit() - } - } - - return affected, err -} - func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) { log.Debug("ConstructUpdateSQL processing... ") log.Debug("Request updateData:", updateData) diff --git a/tools/loadpconf/db.go b/tools/loadpconf/db.go deleted file mode 100644 index c460a3a9..00000000 --- a/tools/loadpconf/db.go +++ /dev/null @@ -1,101 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - - "strings" - - _ "github.com/go-sql-driver/mysql" - "xorm.io/xorm" -) - -var xEngine *xorm.Engine - -func XormConnectDatabaseWithUri(sql string) (*xorm.Engine, error) { - // sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", db.User, db.Password, db.Host, db.Port, db.Name) - sqlStr := fmt.Sprintf("%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", sql) - // fmt.Printf("sqlStr:%s:******@tcp(%s:%s)/%s?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true&loc=Local", db.User, db.Host, db.Port, db.Name) - var err error - xEngine, err = xorm.NewEngine("mysql", sqlStr) //1、Create xorm engine - if err != nil { - fmt.Println("Failed to connect database:", err) - return nil, err - } - xEngine.ShowSQL(true) - return xEngine, nil -} - -type ParamConfig struct { - // Id int `json:"id" xorm:"pk 'id' autoincr"` - NeType string `json:"neType"` - NeId string `json:"neId"` - TopTag string `json:"topTag"` - TopDisplay string `json:"topDisplay"` - Method string `json:"method"` - ParamJson string `json:"paramJson"` -} - -func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) { - var affected, a int64 - var err error - paramConfig := new(ParamConfig) - for n, d := range *mapJson { - if d == nil { - break - } - fmt.Printf("n: %s", n) - - session := xEngine.NewSession() - defer session.Close() - _, err = session.Table("param_config").Where("ne_type = ?", strings.ToUpper(n)).Delete() - if err != nil { - fmt.Println("Failed to delete param_config:", err) - } - session.Commit() - - for t, p := range d.(map[string]interface{}) { - if p == nil { - break - } - fmt.Println("t:", t) - fmt.Println("p:", p) - for k, v := range p.(map[string]interface{}) { - fmt.Println("k, v: ", k, v) - if k == "display" { - paramConfig.TopDisplay = fmt.Sprintf("%v", v) - - } else if k == "method" { - if v != "" { - paramConfig.Method = fmt.Sprintf("%v", v) - } - } else { - pc, _ := json.Marshal(v) - paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc)) - } - } - - paramConfig.NeType = strings.ToUpper(n) - paramConfig.NeId = "" - paramConfig.TopTag = t - // paramConfig.TopDisplay = p["display"] - // paramConfig.ParamJson = p.(string) - - fmt.Println("paramConfig:", paramConfig) - - session := xEngine.NewSession() - defer session.Close() - // _, err = session.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete() - // if err != nil { - // fmt.Println("Failed to delete param_config:", err) - // } - a, err = session.Insert(paramConfig) - if err != nil { - fmt.Println("Failed to insert param_config:", err) - } - session.Commit() - affected += a - } - } - return affected, err -} diff --git a/tools/loadpconf/load.go b/tools/loadpconf/load.go deleted file mode 100644 index 329f7cab..00000000 --- a/tools/loadpconf/load.go +++ /dev/null @@ -1,375 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - "reflect" - - "gopkg.in/yaml.v3" -) - -// Yaml struct of config -type YamlConfig struct { - Logger struct { - File string `yaml:"file"` - Level string `yaml:"level"` - } - - Rest struct { - Addr string `yaml:"addr"` - Port uint16 `yaml:"port"` - } - - Database struct { - Type string `yaml:"type"` - User string `yaml:"user"` - Password string `yaml:"password"` - Host string `yaml:"host"` - Port string `yaml:"port"` - Name string `yaml:"name"` - } - ParamFileDir string `yaml:"paramfiledir"` -} - -var yamlConfig YamlConfig - -func ReadConfig(configFile string) { - yamlFile, err := os.ReadFile(configFile) - if err != nil { - fmt.Printf("ioutil.ReadFile %s err %v", configFile, err) - } - // fmt.Println("yamlfile:", string(yamlFile)) - - err = yaml.Unmarshal(yamlFile, &yamlConfig) - if err != nil { - fmt.Printf("Unmarshal: %v when to struct", err) - } -} - -func GetYamlConfig() *YamlConfig { - return &yamlConfig -} - -//var mapYaml map[string]interface{} - -func ReadParamConfig(fileName string) *map[string]interface{} { - file, err := os.ReadFile(fileName) - if err != nil { - fmt.Println("yamlFile.Get err", err) - } - - mapYaml := make(map[string]interface{}) - - var node yaml.Node - err = yaml.Unmarshal(file, &node) - if err != nil { - fmt.Printf("yaml.Unmarshal: %v when to struct", err) - } - err = unmarshalNode(&node, &mapYaml) - if err != nil { - fmt.Println("Failed to unmarshalNode:", err) - } - - // var node yaml.Node - // err = yaml.Unmarshal(file, &node) - // if err != nil { - // fmt.Printf("yaml.Unmarshal: %v when to struct", err) - // } - - // err = unmarshalNode(&node, reflect.ValueOf(&mapYaml)) - // if err != nil { - // fmt.Println("Failed to unmarshalNode:", err) - // } - - err = yaml.Unmarshal(file, &mapYaml) - if err != nil { - fmt.Printf("yaml.Unmarshal: %v when to struct", err) - } - // fmt.Println("mapYaml:", mapYaml) - - return &mapYaml -} - -func GetAllFile(dir string, s []string) ([]string, error) { - rd, err := os.ReadDir(dir) - if err != nil { - fmt.Println("read dir fail:", err) - return s, err - } - - for _, fi := range rd { - if !fi.IsDir() { - fullName := dir + "/" + fi.Name() - s = append(s, fullName) - } - } - return s, nil -} - -const defaultConfigFile = "./loadpconf.yaml" - -var ( - version string - buildTime string - goVer string -) - -var pfiles []string - -func init() { - cfile := flag.String("c", defaultConfigFile, "config file") - pfile := flag.String("p", "", "param file") - pv := flag.Bool("v", false, "print version") - ph := flag.Bool("h", false, "print help") - - flag.Parse() - if *pv { - fmt.Printf("OMC initems version: %s\n%s\n%s\n\n", version, buildTime, goVer) - os.Exit(0) - } - if *ph { - flag.Usage() - os.Exit(0) - } - - ReadConfig(*cfile) - - fmt.Println("pfile:", *pfile) - if *pfile != "" { - pfiles = append(pfiles, *pfile) - } else { - pfiles, _ = GetAllFile(yamlConfig.ParamFileDir, pfiles) - } - fmt.Println("pfiles:", pfiles) -} - -func unmarshalNode(node *yaml.Node, out interface{}) error { - switch node.Kind { - case yaml.DocumentNode: - return unmarshalNode(node.Content[0], out) - case yaml.MappingNode: - m := nodeToMap(node) - return unmarshalMap(m, out) - case yaml.SequenceNode: - s := nodeToSlice(node) - return unmarshalSlice(s, out) - case yaml.ScalarNode: - return unmarshalScalar(node, out) - default: - return fmt.Errorf("unknown node kind: %v", node.Kind) - } -} - -func nodeToMap(node *yaml.Node) map[string]*yaml.Node { - m := make(map[string]*yaml.Node) - for i := 0; i < len(node.Content); i += 2 { - key := node.Content[i].Value - value := node.Content[i+1] - m[key] = value - } - return m -} - -func unmarshalMap(m map[string]*yaml.Node, out interface{}) error { - data, ok := out.(*map[string]interface{}) - if !ok { - return fmt.Errorf("out must be a map[string]interface{}") - } - - *data = make(map[string]interface{}) - for key, value := range m { - var v interface{} - err := unmarshalNode(value, &v) - if err != nil { - return err - } - (*data)[key] = v - } - return nil -} - -func nodeToSlice(node *yaml.Node) []*yaml.Node { - return node.Content -} - -func unmarshalSlice(s []*yaml.Node, out interface{}) error { - data, ok := out.(*[]interface{}) - if !ok { - return fmt.Errorf("out must be a []interface{}") - } - - *data = make([]interface{}, len(s)) - for i, value := range s { - var v interface{} - err := unmarshalNode(value, &v) - if err != nil { - return err - } - (*data)[i] = v - } - return nil -} - -func unmarshalScalar(node *yaml.Node, out interface{}) error { - switch node.Tag { - case "!!str": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value - case "!!int": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value - case "!!float": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value - case "!!bool": - val := reflect.ValueOf(node.Value == "true") - val.Elem().Set(reflect.ValueOf(out)) - //*out = node.Value == "true" - case "!!null": - val := reflect.ValueOf(node.Value) - val.Elem().Set(reflect.ValueOf(out)) - //*out = nil - default: - return fmt.Errorf("unknown scalar tag: %v", node.Tag) - } - return nil -} - -/* -func unmarshalNode(node *yaml.Node, out reflect.Value) error { - switch node.Kind { - case yaml.DocumentNode: - return unmarshalNode(node.Content[0], out) - case yaml.MappingNode: - m := nodeToMap(node) - return unmarshalMap(m, out) - case yaml.SequenceNode: - s := nodeToSlice(node) - return unmarshalSlice(s, out) - case yaml.ScalarNode: - return unmarshalScalar(node, out) - default: - return fmt.Errorf("unknown node kind: %v", node.Kind) - } -} - -func nodeToMap(node *yaml.Node) map[string]*yaml.Node { - m := make(map[string]*yaml.Node) - for i := 0; i < len(node.Content); i += 2 { - key := node.Content[i].Value - value := node.Content[i+1] - m[key] = value - } - return m -} - -func unmarshalMap(m map[string]*yaml.Node, out reflect.Value) error { - if out.Kind() != reflect.Ptr || out.IsNil() { - return fmt.Errorf("out must be a non-nil pointer") - } - - outType := out.Type().Elem() - if outType.Kind() != reflect.Map { - return fmt.Errorf("out must be a pointer to a map") - } - - mapType := outType.Elem() - if mapType.Kind() != reflect.Interface && mapType.Kind() != reflect.Map { - return fmt.Errorf("out must be a pointer to a map of interface{}") - } - - out.Set(reflect.MakeMap(outType)) - - for key, value := range m { - var v reflect.Value - if mapType.Kind() == reflect.Interface { - v = reflect.New(reflect.TypeOf((*interface{})(nil)).Elem()) - } else { - v = reflect.New(mapType) - } - - err := unmarshalNode(value, v.Elem()) - if err != nil { - return err - } - - out.Elem().SetMapIndex(reflect.ValueOf(key), v.Elem()) - } - - return nil -} - -func nodeToSlice(node *yaml.Node) []*yaml.Node { - return node.Content -} - -func unmarshalSlice(s []*yaml.Node, out reflect.Value) error { - if out.Kind() != reflect.Ptr || out.IsNil() { - return fmt.Errorf("out must be a non-nil pointer") - } - - outType := out.Type().Elem() - if outType.Kind() != reflect.Slice { - return fmt.Errorf("out must be a pointer to a slice") - } - - sliceType := outType.Elem() - if sliceType.Kind() != reflect.Interface && sliceType.Kind() != reflect.Slice { - return fmt.Errorf("out must be a pointer to a slice of interface{}") - } - - out.Set(reflect.MakeSlice(outType, len(s), len(s))) - - for i, value := range s { - var v reflect.Value - if sliceType.Kind() == reflect.Interface { - v = reflect.New(reflect.TypeOf((*interface{})(nil)).Elem()) - } else { - v = reflect.New(sliceType) - } - - err := unmarshalNode(value, v.Elem()) - if err != nil { - return err - } - - out.Elem().Index(i).Set(v.Elem()) - } - - return nil -} - -func unmarshalScalar(node *yaml.Node, out reflect.Value) error { - switch node.Tag { - case "!!str": - out.SetString(node.Value) - case "!!int": - i, err := strconv.ParseInt(node.Value, 10, 64) - if err != nil { - return err - } - out.SetInt(i) - case "!!float": - f, err := strconv.ParseFloat(node.Value, 64) - if err != nil { - return err - } - out.SetFloat(f) - case "!!bool": - b, err := strconv.ParseBool(node.Value) - if err != nil { - return err - } - out.SetBool(b) - case "!!null": - out.Set(reflect.Zero(out.Type())) - default: - return fmt.Errorf("unknown scalar tag: %v", node.Tag) - } - return nil -} -*/ diff --git a/tools/loadpconf/loadpconf.go b/tools/loadpconf/loadpconf.go deleted file mode 100644 index 08faf5e0..00000000 --- a/tools/loadpconf/loadpconf.go +++ /dev/null @@ -1,21 +0,0 @@ -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("========================= OMC loadpconf startup =========================") - fmt.Printf("OMC loadpconf version: %s %s %s", version, buildTime, goVer) - - for _, f := range pfiles { - fmt.Println("f:", f) - paramMap := ReadParamConfig(f) - fmt.Println("paramMap:", paramMap) - db := yamlConfig.Database - sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Password, db.Host, db.Port, db.Name) - XormConnectDatabaseWithUri(sqlStr) - XormInsertParamConfig(paramMap) - } - -} diff --git a/tools/loadpconf/loadpconf.yaml b/tools/loadpconf/loadpconf.yaml deleted file mode 100644 index f0b038e6..00000000 --- a/tools/loadpconf/loadpconf.yaml +++ /dev/null @@ -1,17 +0,0 @@ -logger: - file: ./initems.log - level: trace - -rest: - addr: 0.0.0.0 - port: 3040 - -database: - type: mysql - user: root - password: 1000omc@kp! - host: 127.0.0.1 - port: 33066 - name: omc_db - -paramfiledir: ../../config/param diff --git a/tools/loadpconf/makefile b/tools/loadpconf/makefile deleted file mode 100644 index 1a46296e..00000000 --- a/tools/loadpconf/makefile +++ /dev/null @@ -1,22 +0,0 @@ -# Makefile for rest agent project - -PROJECT = OMC -VERSION = 5GC16.1.1 -PLATFORM = amd64 -DEBDIR = ../../../deb -ETCDIR = ../../../etc -RELEASEDIR = ../../../release -LIBDIR = ../lib -BINNAME = loadpconf - -.PHONY: build $(BINNAME) -build $(BINNAME): - go build -o $(BINNAME) -v -ldflags "-X 'main.version=$(VERSION)' \ - -X 'main.buildTime=`date`' \ - -X 'main.goVer=`go version`'" - -run: $(BINNAME) - ./$(BINNAME) - -clean: - rm ./$(BINNAME) diff --git a/tools/misc/tables_c.lst b/tools/misc/tables_c.lst index 4a0a0ef4..5203389c 100644 --- a/tools/misc/tables_c.lst +++ b/tools/misc/tables_c.lst @@ -9,7 +9,7 @@ mml_command mml_http_map mml_subscriber mml_system -param_config +ne_config pm_custom_title title_info trace_info From ecbd298437ee240269b6e7ae7bc8ffab08c042cd Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 18:04:49 +0800 Subject: [PATCH 23/69] =?UTF-8?q?del:=20=E7=A7=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8PostGoldKPIFromNF=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/pm/performance.go | 129 ------------------------------------- 1 file changed, 129 deletions(-) diff --git a/features/pm/performance.go b/features/pm/performance.go index 94aea455..c7a5b3b3 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -335,135 +335,6 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { services.ResponseStatusOK204NoContent(w) } -// PostGoldKPIFromNF 已废弃 -// post kpi report from NEs, insert insto gold_kpi table, discard... -func PostGoldKPIFromNF(w http.ResponseWriter, r *http.Request) { - log.Debug("PostKPIReportFromNF processing... ") - - vars := mux.Vars(r) - apiVer := vars["apiVersion"] - if apiVer != global.ApiVersionV1 { - log.Error("Uri api version is invalid. apiVersion:", apiVer) - services.ResponseNotFound404UriNotExist(w, r) - return - } - - // body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Faile to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Trace("Request body:", string(body)) - kpiReport := new(KpiReport) - _ = json.Unmarshal(body, &kpiReport) - log.Trace("kpiReport:", kpiReport) - - session := xEngine.NewSession() - defer session.Close() - goldKpi := new(GoldKpi) - layout := time.RFC3339Nano - goldKpi.Date = GetDateFromTimeString(layout, kpiReport.Task.Period.StartTime) - goldKpi.Index, _ = strconv.Atoi(vars["index"]) - goldKpi.StartTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.StartTime, time.DateTime) - goldKpi.EndTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime) - // get time granularity from startTime and endTime - seconds, _ := global.GetSecondDuration(goldKpi.StartTime, goldKpi.EndTime) - goldKpi.Granularity = 60 - if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 { - goldKpi.Granularity = int8(seconds) - } - goldKpi.NEName = kpiReport.Task.NE.NEName - goldKpi.RmUid = kpiReport.Task.NE.RmUID - goldKpi.NEType = kpiReport.Task.NE.NeType - goldKpi.Timestamp = global.GetFmtTimeString(layout, kpiReport.Timestamp, time.DateTime) - // 黄金指标事件对象 - kpiEvent := map[string]any{ - // kip_id ... - "neType": goldKpi.NEType, - "neName": goldKpi.NEName, - "rmUID": goldKpi.RmUid, - "startIndex": goldKpi.Index, - "timeGroup": goldKpi.StartTime, - } - // insert into new kpi_report_xxx table - kpiData := new(KpiData) - kpiData.Date = goldKpi.Date - kpiData.Index = goldKpi.Index - //st, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.StartTime, time.Local) - //et, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.EndTime, time.Local) - kpiData.StartTime = goldKpi.StartTime - kpiData.EndTime = goldKpi.EndTime - kpiData.Granularity = goldKpi.Granularity - kpiData.NEName = goldKpi.NEName - kpiData.NEType = goldKpi.NEType - kpiData.RmUid = goldKpi.RmUid - kpiVal := new(KPIVal) - kpiData.CreatedAt = time.Now().UnixMilli() - for _, k := range kpiReport.Task.NE.KPIs { - kpiEvent[k.KPIID] = k.Value // kip_id - goldKpi.KpiId = k.KPIID - goldKpi.Value = k.Value - goldKpi.Error = k.Err - - kpiVal.KPIID = k.KPIID - kpiVal.Value = int64(k.Value) - kpiVal.Err = k.Err - kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal) - - //log.Trace("goldKpi:", goldKpi) - - // 启动事务 - err := session.Begin() - if err != nil { - log.Error("Failed to Begin gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - gkpi := &GoldKpi{} - _, err = session.Where("id = ?", 1).ForUpdate().Get(gkpi) - if err != nil { - // 回滚事务 - session.Rollback() - log.Error("Failed to ForUpdate gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - affected, err := session.Insert(goldKpi) - if err != nil && affected <= 0 { - session.Rollback() - log.Error("Failed to insert gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // 提交事务 - err = session.Commit() - if err != nil { - log.Error("Failed to Commit gold_kpi:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // insert kpi_report table, no session - tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType) - affected, err := xEngine.Table(tableName).Insert(kpiData) - if err != nil && affected <= 0 { - log.Errorf("Failed to insert %s:%v", tableName, err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI, kpiEvent) - if goldKpi.NEType == "UPF" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF, kpiEvent) - } - - services.ResponseStatusOK204NoContent(w) -} - type MeasureTask struct { Tasks []Task `json:"Tasks"` NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */ From e4c59cf28ffe756f3e7805a62c4ba6789069a0f2 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Sat, 12 Oct 2024 18:45:37 +0800 Subject: [PATCH 24/69] update omc service and setomc shell script --- misc/omcsvc.sh | 15 ++++++++++----- misc/setomc.sh | 50 +++++++++++++++++++++++++------------------------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/misc/omcsvc.sh b/misc/omcsvc.sh index 037a27b1..8e88b2fe 100644 --- a/misc/omcsvc.sh +++ b/misc/omcsvc.sh @@ -8,8 +8,11 @@ BinDir=/usr/local/omc/bin case "$1" in start) for procName in $ProcListDesc;do - echo "Starting $procName process ..." + echo -n "Starting $procName process ... " systemctl start $procName + if [ $? = 0 ]; then + echo "done" + fi sleep 1 done ;; @@ -20,8 +23,11 @@ case "$1" in ;; stop) for procName in $ProcList;do - echo "Stopping $procName process ..." - systemctl stop $procName + echo -n "Stopping $procName process ... " + systemctl stop $procName + if [ $? = 0 ]; then + echo "done" + fi done ;; restart) @@ -38,5 +44,4 @@ case "$1" in echo "OMC service" echo "Usage: $0 start|status|stop|restart|version" ;; -esac - +esac diff --git a/misc/setomc.sh b/misc/setomc.sh index d3fd3bf1..d1c83353 100644 --- a/misc/setomc.sh +++ b/misc/setomc.sh @@ -25,14 +25,14 @@ check_args() { m) M_ARG=$(echo $OPTARG | tr '[:upper:]' '[:lower:]') if [ "${VENDORS}" == "BA" ]; then - C_ARG_LOWER="ba" - C_ARG_UPPER="BA" + C_ARG_LOWER="ba" + C_ARG_UPPER="BA" fi ;; \?) echo "Invalid option: -$OPTARG" >&2 ;; - esac + esac done } @@ -54,19 +54,19 @@ case "${M_ARG}" in ${OMCBinDir}/importdb.sh ${M_ARG} if [ "${C_ARG_LOWER}" != "" ]; then - CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d - if [ ! -d "${CustomizedDir}" ]; then - echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" - exit 1 - fi + CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d + if [ ! -d "${CustomizedDir}" ]; then + echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" + exit 1 + fi echo -n "Setting ${C_ARG_UPPER} customized OMC ..." - for SQL in ${CustomizedDir}/db/*.sql; do - mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; - done - cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo - cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc - #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCRootDir}/etc/default/restconf.yaml - #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCBinDir}/nehosts + for SQL in ${CustomizedDir}/db/*.sql; do + mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; + done + cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo + cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc + #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCRootDir}/etc/default/restconf.yaml + #perl -0777 -i -pe 's/omcuser/bluearcus/g' ${OMCBinDir}/nehosts if [ $? = 0 ]; then echo "done" fi @@ -77,17 +77,17 @@ case "${M_ARG}" in ;; skip) if [ "${C_ARG_LOWER}" != "" ]; then - CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d - if [ ! -d "${CustomizedDir}" ]; then - echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" - exit 1 - fi + CustomizedDir=${OMCStaticDir}/${C_ARG_LOWER}.d + if [ ! -d "${CustomizedDir}" ]; then + echo "Not found ${C_ARG_UPPER} customized directory, nothing to be done" + exit 1 + fi echo -n "Setting ${C_ARG_UPPER} customized OMC ..." - for SQL in ${CustomizedDir}/db/*.sql; do - mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; - done - cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo - cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc + for SQL in ${CustomizedDir}/db/*.sql; do + mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} < ${SQL}; + done + cp -rf ${CustomizedDir}/logo/* ${OMCStaticDir}/logo + cp -rf ${CustomizedDir}/doc/* ${OMCStaticDir}/helpDoc if [ $? = 0 ]; then echo "done" fi From ee93b68683c56af7aa8c71bde9eb28c91963f7d1 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:03:52 +0800 Subject: [PATCH 25/69] =?UTF-8?q?del:=20=E7=A7=BB=E9=99=A4=E6=97=A7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3/objectType/license?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/cm/license.go | 558 ----------------------------------------- lib/routes/routes.go | 7 - 2 files changed, 565 deletions(-) delete mode 100644 features/cm/license.go diff --git a/features/cm/license.go b/features/cm/license.go deleted file mode 100644 index ed4299cc..00000000 --- a/features/cm/license.go +++ /dev/null @@ -1,558 +0,0 @@ -package cm - -import ( - "fmt" - "io" - "net/http" - "os" - "os/exec" - "strings" - - "be.ems/lib/core/ctx" - "be.ems/lib/dborm" - "be.ems/lib/log" - "be.ems/lib/services" - "be.ems/restagent/config" - neModel "be.ems/src/modules/network_element/model" - neService "be.ems/src/modules/network_element/service" - "github.com/gorilla/mux" -) - -var ( - // General License URI - UriLicense = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/license" - UriLicenseExt = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/license" - - CustomUriLicense = config.UriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/license" - CustomUriLicenseExt = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/license" -) - -func UploadLicenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("UploadLicenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // neTypeUpper := strings.ToUpper(neType) - // neTypeLower := strings.ToLower(neType) - - services.ResponseStatusOK204NoContent(w) -} - -func DownloadLicenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DownloadLicenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // // neTypeUpper := strings.ToUpper(neType) - // //neTypeLower := strings.ToLower(neType) - - // version := vars["version"] - // if version == "" { - // log.Error("version is empty") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - // neSoftware, err := dborm.XormGetDataBySQL(sql) - // if err != nil { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if len(*neSoftware) == 0 { - // err := global.ErrCMNotFoundTargetSoftware - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // fileName := (*neSoftware)[0]["file_name"] - // path := (*neSoftware)[0]["path"] - // md5Sum := (*neSoftware)[0]["md5_sum"] - - // services.ResponseFileWithNameAndMD5(w, http.StatusOK, fileName, path, md5Sum) -} - -func DeleteLcenseFile(w http.ResponseWriter, r *http.Request) { - log.Debug("DeleteLcenseFile processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["neType"] - if neType == "" { - log.Error("neType is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - // neTypeUpper := strings.ToUpper(neType) - // //neTypeLower := strings.ToLower(neType) - - // version := vars["version"] - // if version == "" { - // log.Error("version is empty") - // services.ResponseNotFound404UriNotExist(w, r) - // return - // } - - // sql := fmt.Sprintf("select * from ne_software where ne_type='%s' and version='%s'", neTypeUpper, version) - // neSoftware, err := dborm.XormGetDataBySQL(sql) - // if err != nil { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } else if len(*neSoftware) == 0 { - // err := global.ErrCMNotFoundTargetSoftware - // log.Error(err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // where := fmt.Sprintf("ne_type='%s' and version='%s'", neTypeUpper, version) - // affected, err := dborm.XormDeleteDataByWhere(where, "ne_software") - // if err != nil || affected == 0 { - // log.Error("Faile to XormGetDataBySQL:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - // fileName := (*neSoftware)[0]["file_name"] - // path := (*neSoftware)[0]["path"] - // filePath := fmt.Sprintf("%s/%s", path, fileName) - // err = os.Remove(filePath) - // if err != nil { - // log.Error("Faile to Remove:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // return - // } - - services.ResponseStatusOK204NoContent(w) -} - -// type MMLRequest struct { -// MML []string `json:"mml"` -// } - -// var TIME_DELAY_AFTER_WRITE time.Duration = 200 -// var TIME_DEAD_LINE time.Duration = 10 - -// func init() { -// if config.GetYamlConfig().MML.Sleep != 0 { -// TIME_DELAY_AFTER_WRITE = time.Duration(config.GetYamlConfig().MML.Sleep) -// } -// if config.GetYamlConfig().MML.DeadLine != 0 { -// TIME_DEAD_LINE = time.Duration(config.GetYamlConfig().MML.DeadLine) -// } -// } - -func UploadLicenseFileData(w http.ResponseWriter, r *http.Request) { - log.Info("UploadLicenseFileData processing... ") - - // _, err := services.CheckFrontValidRequest(w, r) - // if err != nil { - // log.Error("Http request error:", err) - // return - // } - - vars := mux.Vars(r) - neType := vars["elementTypeValue"] - if neType == "" { - log.Error("elementTypeValue is empty") - services.ResponseNotFound404UriNotExist(w, r) - return - } - neTypeUpper := strings.ToUpper(neType) - neTypeLower := strings.ToLower(neType) - - //md5Param := services.GetUriParamString(r, "md5Sum", ",", false, false) - - neId := services.GetUriParamString(r, "neId", ",", false, false) - - neInfo, err := dborm.XormGetNeInfo(neType, neId) - if err != nil { - log.Errorf("Failed to get ne_info:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Debug("neInfo:", neInfo) - - licensePath := fmt.Sprintf("%s/%s", config.GetYamlConfig().OMC.License, neTypeLower) - err = os.MkdirAll(licensePath, os.ModePerm) - if err != nil { - log.Error("Failed to Mkdir:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - //fileName, err := services.HandleUploadFile(r, softwarePath, "") - - // 解析multipart/form-data请求 - err = r.ParseMultipartForm(10 << 20) // 10MB - if err != nil { - log.Error("Faile to ParseMultipartForm:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // 获取文件和数据 - licFile := r.MultipartForm.File["file"] - data := r.MultipartForm.Value["comment"] - - var licenseFileName, comment string - - // 处理license文件 - if len(licFile) > 0 { - file := licFile[0] - // 打开文件 - f, err := file.Open() - if err != nil { - log.Error("Faile to Open:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer f.Close() - - // 创建本地文件 - dst, err := os.Create(licensePath + "/" + file.Filename) - if err != nil { - log.Error("Faile to Create:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer dst.Close() - - licenseFileName = file.Filename - // 将文件内容拷贝到本地文件 - _, err = io.Copy(dst, f) - if err != nil { - log.Error("Faile to Copy:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - - // 处理数据 - if len(data) > 0 { - comment = data[0] - } - - neLicensePath := strings.ReplaceAll(config.GetYamlConfig().NE.LicenseDir, "{neType}", neTypeLower) - - srcFile := fmt.Sprintf("%s/%s", licensePath, licenseFileName) - scpDir := fmt.Sprintf("%s@%s:%s", config.GetYamlConfig().NE.User, neInfo.Ip, config.GetYamlConfig().NE.ScpDir) - cmd := exec.Command("scp", "-r", srcFile, scpDir) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to scp NF: neType=%s, neId=%s, ip=%s", neType, neId, neInfo.Ip) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - // backup system.ini to system.ini.bak - sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) - cpCmd := fmt.Sprintf("sudo test -f %s/system.ini && cp -f %s/system.ini %s/system.ini.bak||echo 0", - neLicensePath, neLicensePath, neLicensePath) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Errorf("Faile to execute cp command:%v, cmd:%s", err, cpCmd) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - // replace system.ini - neFilePath := config.GetYamlConfig().NE.ScpDir + "/" + licenseFileName - cpCmd = fmt.Sprintf("sudo mv -f %s %s/system.ini", neFilePath, neLicensePath) - cmd = exec.Command("ssh", sshHost, cpCmd) - out, err = cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute cp command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - /* - // judge license if expired - isRestart := false - hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port) - requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", - hostUri, neTypeLower) - log.Debug("requestURI2NF:", requestURI2NF) - - resp, err := client.R(). - EnableTrace(). - SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}). - //SetHeaders(map[string]string{"accessToken": token}). - SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}). - SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}). - Get(requestURI2NF) - if err != nil { - log.Error("Failed to get system state:", err) - isRestart = true - } else { - systemState := make(map[string]interface{}) - _ = json.Unmarshal(resp.Body(), &systemState) - expiryDate := fmt.Sprintf("%v", systemState["expiryDate"]) - t1_expiry, _ := time.ParseInLocation(time.DateOnly, expiryDate, time.Local) - nowDate := time.Now().Local() - nowDate.Format(time.DateOnly) - isRestart = t1_expiry.Before(nowDate) - } - // case non-expired license: send NE reload license MML - if !isRestart { - // send reload license MML - var buf [20 * 1024]byte - //buf := make([]byte, 0) - var n int - if neInfo != nil { - switch strings.ToLower(neType) { - case "ims": - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0:n])) - - _, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\r\n")) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - mmlCommand := "check lic\r\n" - - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - // upf telnet buffer只能读取一次,需要去掉前面的多余字符 - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - if !strings.Contains(result, "COMMAND OK") { - err = fmt.Errorf("failed to check license, %s", result) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port) - conn, err := net.Dial("tcp", hostMML) - if err != nil { - errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err) - log.Error(errMsg) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - defer conn.Close() - - conn.SetDeadline(time.Now().Add(TIME_DEAD_LINE * time.Second)) - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - _, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0:n])) - - mmlCommand := "check lic\n" - _, err = conn.Write([]byte(mmlCommand)) - if err != nil { - log.Error("Failed to write:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Error("Failed to read:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - log.Trace(string(buf[0 : n-len(neType)-2])) - re1 := regexp.MustCompile(`\x1B\[[0-9;]*[a-zA-Z]`) // 匹配包含␛的控制字符 - //re2 := regexp.MustCompile(`\x00`) // 匹配空字符 - re2 := regexp.MustCompile(`[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x1B]`) // 匹配空字符和包含␛的控制字符 - //re := regexp.MustCompile(`[\x00-\x1F\x7F]`) - result := re1.ReplaceAllString(string(buf[0:n-len(neType)-2]), "") - result = re2.ReplaceAllString(result, "") - if !strings.Contains(result, "COMMAND OK") { - err = fmt.Errorf("failed to check license, %s", result) - log.Error(err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - } else { - // case expired license: restart NE service - switch neTypeLower { - case "omc": - restartCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh restart", config.GetYamlConfig().NE.OmcDir) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh restart omc:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - case "ims": - restartCmd := "sudo ims-stop && sudo ims-start" - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - default: - restartCmd := fmt.Sprintf("sudo systemctl restart %s.service", neTypeLower) - cmd := exec.Command("ssh", sshHost, restartCmd) - out, err := cmd.CombinedOutput() - log.Debugf("Exec output: %v", string(out)) - if err != nil { - log.Error("Faile to execute ssh sudo systemctl command:", err) - services.ResponseInternalServerError500ProcessError(w, err) - return - } - } - } - */ - - // neLicense := dborm.NeLicense{ - // NeType: neTypeUpper, - // NeID: neId, - // Status: "ACTIVE", - // Path: licensePath, - // FileName: licenseFileName, - // Comment: comment, - // } - - // log.Debug("neLicense:", neLicense) - // _, err = dborm.XormInsertTableOne("ne_license", neLicense) - // if err != nil { - // log.Error("Faile to XormInsertTableOne:", err) - // services.ResponseInternalServerError500ProcessError(w, err) - // } - - neLicense := neModel.NeLicense{ - NeType: neTypeUpper, - NeId: neId, - Status: "0", - LicensePath: neFilePath, - Remark: comment, - } - - log.Debug("neLicense:", neLicense) - - // 检查是否存在授权记录 - neLicense2 := neService.NewNeLicenseImpl.SelectByNeTypeAndNeID(neTypeUpper, neId) - if neLicense2.NeId != neId { - // 读取授权码 - code, _ := neService.NewNeLicenseImpl.ReadLicenseInfo(neLicense) - neLicense.ActivationRequestCode = code - - neLicense.CreateBy = ctx.LoginUserToUserName(r) - insertId := neService.NewNeLicenseImpl.Insert(neLicense) - if insertId != "" { - services.ResponseStatusOK204NoContent(w) - return - } - } else { - neLicense2.UpdateBy = ctx.LoginUserToUserName(r) - upRows := neService.NewNeLicenseImpl.Update(neLicense2) - if upRows > 0 { - services.ResponseStatusOK204NoContent(w) - return - } - } - - services.ResponseInternalServerError500ProcessError(w, err) -} diff --git a/lib/routes/routes.go b/lib/routes/routes.go index 70459094..a3143d02 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -207,13 +207,6 @@ func init() { Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil) Register("PATCH", cm.CustomUriSoftwareNE, cm.RollBackSoftwareToNF, nil) - // License management - Register("POST", cm.UriLicense, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT))) - Register("POST", cm.UriLicenseExt, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT))) - - Register("POST", cm.CustomUriLicense, cm.UploadLicenseFileData, nil) - Register("POST", cm.CustomUriLicenseExt, cm.UploadLicenseFileData, nil) - // Trace management 跟踪任务 Register("POST", trace.UriTraceTask, trace.PostTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_INSERT))) Register("PUT", trace.UriTraceTask, trace.PutTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_UPDATE))) From 94bba0c910bb8c18079d4b7d29d06cb7dbb4a1c5 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:04:48 +0800 Subject: [PATCH 26/69] =?UTF-8?q?add:=20=E6=96=87=E4=BB=B6=E5=B7=A5?= =?UTF-8?q?=E5=85=B7tar=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/file/tar.go | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/framework/utils/file/tar.go diff --git a/src/framework/utils/file/tar.go b/src/framework/utils/file/tar.go new file mode 100644 index 00000000..22c3fb67 --- /dev/null +++ b/src/framework/utils/file/tar.go @@ -0,0 +1,76 @@ +package file + +import ( + "archive/tar" + "compress/gzip" + "io" + "os" + "path/filepath" +) + +// CompressTarGZByDir 将目录下文件添加到 tar.gz 压缩文件 +func CompressTarGZByDir(zipFilePath, dirPath string) error { + // 创建本地输出目录 + if err := os.MkdirAll(filepath.Dir(zipFilePath), 0775); err != nil { + return err + } + + // 创建输出文件 + tarFile, err := os.Create(zipFilePath) + if err != nil { + return err + } + defer tarFile.Close() + + gw := gzip.NewWriter(tarFile) + defer gw.Close() + + tw := tar.NewWriter(gw) + defer tw.Close() + + // 遍历目录下的所有文件和子目录 + err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // 忽略目录 + if info.IsDir() { + return nil + } + + // 创建文件条目 + header, err := tar.FileInfoHeader(info, "") + if err != nil { + return err + } + relPath, err := filepath.Rel(dirPath, path) + if err != nil { + return err + } + header.Name = relPath + if err := tw.WriteHeader(header); err != nil { + return err + } + if !info.Mode().IsRegular() { + return nil + } + + // 打开文件 + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + // 写入文件内容 + _, err = io.Copy(tw, file) + if err != nil { + return err + } + + return nil + }) + + return err +} From 1f0c932be86e01d73481689048f60b9ae2794fb1 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:06:12 +0800 Subject: [PATCH 27/69] =?UTF-8?q?style:=20=E5=8E=BB=E9=99=A4Impl=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A3=B0=E6=98=8E=E5=B1=82=E8=81=9A=E7=84=A6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/cdr/cdrevent.go | 2 +- features/cm/ne.go | 10 +- features/cm/param.go | 8 +- features/event/event.go | 2 +- features/mml/mml.go | 6 +- features/pm/performance.go | 2 +- features/ue/ue.go | 2 +- .../ne_config_backup/ne_config_backup.go | 13 +- .../network_data/controller/all_alarm.go | 12 +- .../network_data/controller/all_kpi.go | 12 +- src/modules/network_data/controller/amf.go | 12 +- src/modules/network_data/controller/ims.go | 12 +- src/modules/network_data/controller/mme.go | 12 +- src/modules/network_data/controller/smf.go | 17 +- src/modules/network_data/controller/smsc.go | 12 +- .../network_data/controller/udm_auth.go | 8 +- .../network_data/controller/udm_sub.go | 8 +- src/modules/network_data/controller/upf.go | 12 +- src/modules/network_data/network_data.go | 42 +- src/modules/network_data/repository/alarm.go | 197 +++- .../network_data/repository/alarm.impl.go | 194 ---- .../network_data/repository/cdr_event_ims.go | 192 +++- .../repository/cdr_event_ims.impl.go | 189 ---- .../network_data/repository/cdr_event_smf.go | 173 +++- .../repository/cdr_event_smf.impl.go | 170 --- .../network_data/repository/cdr_event_smsc.go | 184 +++- .../repository/cdr_event_smsc.impl.go | 181 ---- .../network_data/repository/perf_kpi.go | 134 ++- .../network_data/repository/perf_kpi.impl.go | 131 --- .../network_data/repository/ue_event_amf.go | 178 +++- .../repository/ue_event_amf.impl.go | 175 ---- .../network_data/repository/ue_event_mme.go | 178 +++- .../repository/ue_event_mme.impl.go | 175 ---- src/modules/network_data/service/alarm.go | 41 +- .../network_data/service/alarm.impl.go | 40 - .../network_data/service/cdr_event_ims.go | 41 +- .../service/cdr_event_ims.impl.go | 40 - .../network_data/service/cdr_event_smf.go | 41 +- .../service/cdr_event_smf.impl.go | 37 - .../network_data/service/cdr_event_smsc.go | 41 +- .../service/cdr_event_smsc.impl.go | 37 - src/modules/network_data/service/perf_kpi.go | 84 +- .../network_data/service/perf_kpi.impl.go | 80 -- .../network_data/service/ue_event_amf.go | 42 +- .../network_data/service/ue_event_amf.impl.go | 40 - .../network_data/service/ue_event_mme.go | 41 +- .../network_data/service/ue_event_mme.impl.go | 40 - .../network_element/controller/action.go | 4 +- .../network_element/controller/ne_config.go | 10 +- .../controller/ne_config_backup.go | 10 +- .../network_element/controller/ne_host.go | 5 +- .../network_element/controller/ne_host_cmd.go | 5 +- .../network_element/controller/ne_info.go | 13 +- .../network_element/controller/ne_license.go | 10 +- .../network_element/controller/ne_software.go | 5 +- .../network_element/controller/ne_version.go | 3 +- .../network_element/network_element.go | 12 +- .../network_element/repository/ne_config.go | 271 ++++- .../repository/ne_config.impl.go | 259 ----- .../repository/ne_config_backup.go | 274 ++++- .../repository/ne_config_backup.impl.go | 262 ----- .../network_element/repository/ne_host.go | 391 ++++++- .../repository/ne_host.impl.go | 376 ------- .../network_element/repository/ne_host_cmd.go | 321 +++++- .../repository/ne_host_cmd.impl.go | 306 ------ .../network_element/repository/ne_info.go | 423 +++++++- .../repository/ne_info.impl.go | 405 -------- .../network_element/repository/ne_license.go | 309 +++++- .../repository/ne_license.impl.go | 297 ------ .../network_element/repository/ne_software.go | 332 +++++- .../repository/ne_software.impl.go | 317 ------ .../network_element/service/ne_config.go | 189 +++- .../network_element/service/ne_config.impl.go | 164 --- .../service/ne_config_backup.go | 221 +++- .../service/ne_config_backup.impl.go | 202 ---- .../network_element/service/ne_host.go | 191 +++- .../network_element/service/ne_host.impl.go | 172 ---- .../network_element/service/ne_host_cmd.go | 96 +- .../service/ne_host_cmd.impl.go | 80 -- .../network_element/service/ne_info.go | 972 ++++++++++++++++-- .../network_element/service/ne_info.impl.go | 918 ----------------- .../network_element/service/ne_license.go | 214 +++- .../service/ne_license.impl.go | 191 ---- .../network_element/service/ne_software.go | 162 ++- .../service/ne_software.impl.go | 143 --- .../network_element/service/ne_version.go | 23 +- src/modules/tool/controller/iperf.go | 2 +- src/modules/tool/controller/ping.go | 2 +- src/modules/tool/service/iperf.go | 13 +- src/modules/tool/service/ping.go | 10 +- src/modules/trace/controller/tcpdump.go | 4 +- .../trace/controller/trace_task_hlr.go | 8 +- src/modules/trace/service/tcpdump.go | 5 +- src/modules/trace/service/trace_task.go | 6 +- src/modules/trace/service/trace_task_hlr.go | 8 +- src/modules/ws/controller/ws_ssh.go | 2 +- src/modules/ws/controller/ws_telnet.go | 2 +- src/modules/ws/controller/ws_view.go | 2 +- src/modules/ws/processor/cdr_connect.go | 12 +- src/modules/ws/processor/ne_state.go | 2 +- src/modules/ws/processor/ue_connect.go | 4 +- src/modules/ws/processor/upf_total_flow.go | 4 +- 102 files changed, 5624 insertions(+), 6320 deletions(-) delete mode 100644 src/modules/network_data/repository/alarm.impl.go delete mode 100644 src/modules/network_data/repository/cdr_event_ims.impl.go delete mode 100644 src/modules/network_data/repository/cdr_event_smf.impl.go delete mode 100644 src/modules/network_data/repository/cdr_event_smsc.impl.go delete mode 100644 src/modules/network_data/repository/perf_kpi.impl.go delete mode 100644 src/modules/network_data/repository/ue_event_amf.impl.go delete mode 100644 src/modules/network_data/repository/ue_event_mme.impl.go delete mode 100644 src/modules/network_data/service/alarm.impl.go delete mode 100644 src/modules/network_data/service/cdr_event_ims.impl.go delete mode 100644 src/modules/network_data/service/cdr_event_smf.impl.go delete mode 100644 src/modules/network_data/service/cdr_event_smsc.impl.go delete mode 100644 src/modules/network_data/service/perf_kpi.impl.go delete mode 100644 src/modules/network_data/service/ue_event_amf.impl.go delete mode 100644 src/modules/network_data/service/ue_event_mme.impl.go delete mode 100644 src/modules/network_element/repository/ne_config.impl.go delete mode 100644 src/modules/network_element/repository/ne_config_backup.impl.go delete mode 100644 src/modules/network_element/repository/ne_host.impl.go delete mode 100644 src/modules/network_element/repository/ne_host_cmd.impl.go delete mode 100644 src/modules/network_element/repository/ne_info.impl.go delete mode 100644 src/modules/network_element/repository/ne_license.impl.go delete mode 100644 src/modules/network_element/repository/ne_software.impl.go delete mode 100644 src/modules/network_element/service/ne_config.impl.go delete mode 100644 src/modules/network_element/service/ne_config_backup.impl.go delete mode 100644 src/modules/network_element/service/ne_host.impl.go delete mode 100644 src/modules/network_element/service/ne_host_cmd.impl.go delete mode 100644 src/modules/network_element/service/ne_info.impl.go delete mode 100644 src/modules/network_element/service/ne_license.impl.go delete mode 100644 src/modules/network_element/service/ne_software.impl.go diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go index 6361fa05..12bb6766 100644 --- a/features/cdr/cdrevent.go +++ b/features/cdr/cdrevent.go @@ -56,7 +56,7 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(cdrEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(cdrEvent.RmUID) if neInfo.RmUID == cdrEvent.RmUID { // 推送到ws订阅组 switch neInfo.NeType { diff --git a/features/cm/ne.go b/features/cm/ne.go index 665c3f8f..f5f10071 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -157,7 +157,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -208,7 +208,7 @@ func PostNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -267,7 +267,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} @@ -319,7 +319,7 @@ func PutNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) services.ResponseStatusOK204NoContent(w) return @@ -381,7 +381,7 @@ func DeleteNeInfo(w http.ResponseWriter, r *http.Request) { } // 刷新缓存,不存在结构体网元Id空字符串 - neService.NewNeInfoImpl.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + neService.NewNeInfo.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) mapRow := make(map[string]interface{}) row := map[string]interface{}{"affectedRows": affected} diff --git a/features/cm/param.go b/features/cm/param.go index 9e5a62fb..c44c9743 100644 --- a/features/cm/param.go +++ b/features/cm/param.go @@ -39,7 +39,7 @@ func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.DataResponse if neInfo.NeId == neId && neInfo.NeId != "" { @@ -76,7 +76,7 @@ func PostParamConfigToNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -128,7 +128,7 @@ func PutParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") @@ -181,7 +181,7 @@ func DeleteParamConfigToNF(w http.ResponseWriter, r *http.Request) { } neId := ctx.GetQuery(r, "ne_id") - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.NeId == "" { log.Error("neId is empty") diff --git a/features/event/event.go b/features/event/event.go index faad0e11..1f75012b 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -99,7 +99,7 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(ueEvent.RmUID) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID) if neInfo.RmUID == ueEvent.RmUID { // 推送到ws订阅组 if ueEvent.NeType == "MME" { diff --git a/features/mml/mml.go b/features/mml/mml.go index 537b0cde..feaa6910 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -83,7 +83,7 @@ func PostMML2ToNF(w http.ResponseWriter, r *http.Request) { } log.Debug("neType:", neType, "neId", neId) - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return @@ -235,7 +235,7 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { return } - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, true) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return @@ -635,7 +635,7 @@ func PostMMLToOMC(w http.ResponseWriter, r *http.Request) { } log.Debug("neType:", neType, "neId", neId) - neInfoArr := neService.NewNeInfoImpl.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) + neInfoArr := neService.NewNeInfo.SelectList(neModel.NeInfo{NeType: neType, NeId: neId}, false, false) if len(neInfoArr) < 1 { services.ResponseInternalServerError500DatabaseOperationFailed(w) return diff --git a/features/pm/performance.go b/features/pm/performance.go index c7a5b3b3..cd54c741 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -288,7 +288,7 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { } // 发送到匹配的网元 - neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(kpiData.RmUid) + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(kpiData.RmUid) // custom kpi report to FE kpiCEvent := map[string]any{ // kip_id ... diff --git a/features/ue/ue.go b/features/ue/ue.go index 5581bb6f..cd2bb024 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -253,7 +253,7 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { return } - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(neType, neId) var response services.MapResponse if neInfo.NeId == neId && neInfo.NeId != "" { diff --git a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go index 8263e19d..bb36135c 100644 --- a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go +++ b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go @@ -11,19 +11,16 @@ import ( ) var NewProcessor = &NeConfigBackupProcessor{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, count: 0, } // NeConfigBackupProcessor 网元配置文件定期备份 type NeConfigBackupProcessor struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo - // 执行次数 - count int + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 + count int // 执行次数 } func (s *NeConfigBackupProcessor) Execute(data any) (any, error) { diff --git a/src/modules/network_data/controller/all_alarm.go b/src/modules/network_data/controller/all_alarm.go index da67adaf..2372de98 100644 --- a/src/modules/network_data/controller/all_alarm.go +++ b/src/modules/network_data/controller/all_alarm.go @@ -15,19 +15,17 @@ import ( ) // 实例化控制层 AlarmController 结构体 -var NewAlarmController = &AlarmController{ - neInfoService: neService.NewNeInfoImpl, - alarmService: neDataService.NewAlarmImpl, +var NewAlarm = &AlarmController{ + neInfoService: neService.NewNeInfo, + alarmService: neDataService.NewAlarm, } // 告警数据 // // PATH /alarm type AlarmController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 告警信息服务 - alarmService neDataService.IAlarm + neInfoService *neService.NeInfo // 网元信息服务 + alarmService *neDataService.Alarm // 告警信息服务 } // 告警列表 diff --git a/src/modules/network_data/controller/all_kpi.go b/src/modules/network_data/controller/all_kpi.go index 221eb655..e3dbc720 100644 --- a/src/modules/network_data/controller/all_kpi.go +++ b/src/modules/network_data/controller/all_kpi.go @@ -11,19 +11,17 @@ import ( ) // 实例化控制层 PerfKPIController 结构体 -var NewPerfKPIController = &PerfKPIController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewPerfKPI = &PerfKPIController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 性能统计 // // PATH /kpi type PerfKPIController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 获取统计数据 diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index fbc7142f..a41e95c9 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -22,19 +22,17 @@ import ( ) // 实例化控制层 AMFController 结构体 -var NewAMFController = &AMFController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventAMFImpl, +var NewAMF = &AMFController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventAMF, } // 网元AMF // // PATH /amf type AMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventAMF + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventAMF // UE会话事件服务 } // UE会话列表 diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 22221200..051ceb1b 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -23,19 +23,17 @@ import ( ) // 实例化控制层 IMSController 结构体 -var NewIMSController = &IMSController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventIMSImpl, +var NewIMS = &IMSController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventIMS, } // 网元IMS // // PATH /ims type IMSController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventIMS + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventIMS // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index a7707a18..1c61daa0 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -23,19 +23,17 @@ import ( ) // 实例化控制层 MMEController 结构体 -var NewMMEController = &MMEController{ - neInfoService: neService.NewNeInfoImpl, - ueEventService: neDataService.NewUEEventMMEImpl, +var NewMME = &MMEController{ + neInfoService: neService.NewNeInfo, + ueEventService: neDataService.NewUEEventMME, } // 网元MME // // PATH /mme type MMEController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // UE会话事件服务 - ueEventService neDataService.IUEEventMME + neInfoService *neService.NeInfo // 网元信息服务 + ueEventService *neDataService.UEEventMME // UE会话事件服务 } // UE会话列表 diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 0dc48827..d944f813 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -22,22 +22,19 @@ import ( ) // 实例化控制层 SMFController 结构体 -var NewSMFController = &SMFController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMFImpl, - udmUserInfoService: *neDataService.NewUDMUserInfo, +var NewSMF = &SMFController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMF, + udmUserInfoService: neDataService.NewUDMUserInfo, } // 网元SMF // // PATH /smf type SMFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMF - // UDM用户信息服务 - udmUserInfoService neDataService.UDMUserInfo + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMF // CDR会话事件服务 + udmUserInfoService *neDataService.UDMUserInfo // UDM用户信息服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 6ebcb75d..167d097a 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -22,19 +22,17 @@ import ( ) // 实例化控制层 SMSCController 结构体 -var NewSMSCController = &SMSCController{ - neInfoService: neService.NewNeInfoImpl, - cdrEventService: neDataService.NewCDREventSMSCImpl, +var NewSMSC = &SMSCController{ + neInfoService: neService.NewNeInfo, + cdrEventService: neDataService.NewCDREventSMSC, } // 网元SMSC // // PATH /smsc type SMSCController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // CDR会话事件服务 - cdrEventService neDataService.ICDREventSMSC + neInfoService *neService.NeInfo // 网元信息服务 + cdrEventService *neDataService.CDREventSMSC // CDR会话事件服务 } // CDR会话列表 diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index de05f3ea..dbaeb3ec 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -24,17 +24,15 @@ import ( // 实例化控制层 UDMAuthController 结构体 var NewUDMAuth = &UDMAuthController{ udmAuthService: neDataService.NewUDMAuthUser, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // UDM鉴权用户 // // PATH /udm/auth type UDMAuthController struct { - // UDM鉴权信息服务 - udmAuthService *neDataService.UDMAuthUser - // 网元信息服务 - neInfoService neService.INeInfo + udmAuthService *neDataService.UDMAuthUser // UDM鉴权信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM鉴权用户重载数据 diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 3a7facc4..cec49570 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -23,17 +23,15 @@ import ( // 实例化控制层 UDMSubController 结构体 var NewUDMSub = &UDMSubController{ udmSubService: neDataService.NewUDMSub, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // UDM签约用户 // // PATH /udm/sub type UDMSubController struct { - // UDM签约信息服务 - udmSubService *neDataService.UDMSubUser - // 网元信息服务 - neInfoService neService.INeInfo + udmSubService *neDataService.UDMSubUser // UDM签约信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // UDM签约用户重载数据 diff --git a/src/modules/network_data/controller/upf.go b/src/modules/network_data/controller/upf.go index 366fc15d..0d0acd5e 100644 --- a/src/modules/network_data/controller/upf.go +++ b/src/modules/network_data/controller/upf.go @@ -10,19 +10,17 @@ import ( ) // 实例化控制层 UPFController 结构体 -var NewUPFController = &UPFController{ - neInfoService: neService.NewNeInfoImpl, - perfKPIService: neDataService.NewPerfKPIImpl, +var NewUPF = &UPFController{ + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, } // 网元UPF // // PATH /upf type UPFController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 统计信息服务 - perfKPIService neDataService.IPerfKPI + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 } // 总流量数 N3上行 N6下行 diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index e60cdd9f..a114f75b 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -21,11 +21,11 @@ func Setup(router *gin.Engine) { { kpiGroup.GET("/title", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.Title, + controller.NewPerfKPI.Title, ) kpiGroup.GET("/data", middleware.PreAuthorize(nil), - controller.NewPerfKPIController.GoldKPI, + controller.NewPerfKPI.GoldKPI, ) } @@ -34,11 +34,11 @@ func Setup(router *gin.Engine) { { alarmGroup.GET("/list", middleware.PreAuthorize(nil), - controller.NewAlarmController.List, + controller.NewAlarm.List, ) alarmGroup.DELETE("/:alarmIds", middleware.PreAuthorize(nil), - controller.NewAlarmController.Remove, + controller.NewAlarm.Remove, ) } @@ -47,17 +47,17 @@ func Setup(router *gin.Engine) { { imsGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewIMSController.CDRList, + controller.NewIMS.CDRList, ) imsGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewIMSController.CDRRemove, + controller.NewIMS.CDRRemove, ) imsGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.imsCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewIMSController.CDRExport, + controller.NewIMS.CDRExport, ) } @@ -66,17 +66,17 @@ func Setup(router *gin.Engine) { { smscGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMSCController.CDRList, + controller.NewSMSC.CDRList, ) smscGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMSCController.CDRRemove, + controller.NewSMSC.CDRRemove, ) smscGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smscCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMSCController.CDRExport, + controller.NewSMSC.CDRExport, ) } @@ -85,21 +85,21 @@ func Setup(router *gin.Engine) { { smfGroup.GET("/cdr/list", middleware.PreAuthorize(nil), - controller.NewSMFController.CDRList, + controller.NewSMF.CDRList, ) smfGroup.DELETE("/cdr/:cdrIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewSMFController.CDRRemove, + controller.NewSMF.CDRRemove, ) smfGroup.POST("/cdr/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.smfCDR", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewSMFController.CDRExport, + controller.NewSMF.CDRExport, ) smfGroup.GET("/subscribers", middleware.PreAuthorize(nil), - controller.NewSMFController.SubUserList, + controller.NewSMF.SubUserList, ) } @@ -108,17 +108,17 @@ func Setup(router *gin.Engine) { { amfGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewAMFController.UEList, + controller.NewAMF.UEList, ) amfGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewAMFController.UERemove, + controller.NewAMF.UERemove, ) amfGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.amfUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewAMFController.UEExport, + controller.NewAMF.UEExport, ) } @@ -127,7 +127,7 @@ func Setup(router *gin.Engine) { { upfGroup.GET("/totalFlow", middleware.PreAuthorize(nil), - controller.NewUPFController.TotalFlow, + controller.NewUPF.TotalFlow, ) } @@ -244,17 +244,17 @@ func Setup(router *gin.Engine) { { mmeGroup.GET("/ue/list", middleware.PreAuthorize(nil), - controller.NewMMEController.UEList, + controller.NewMME.UEList, ) mmeGroup.DELETE("/ue/:ueIds", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_DELETE)), - controller.NewMMEController.UERemove, + controller.NewMME.UERemove, ) mmeGroup.POST("/ue/export", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.mmeUE", collectlogs.BUSINESS_TYPE_EXPORT)), - controller.NewMMEController.UEExport, + controller.NewMME.UEExport, ) } } diff --git a/src/modules/network_data/repository/alarm.go b/src/modules/network_data/repository/alarm.go index 0ea43bb0..41d50325 100644 --- a/src/modules/network_data/repository/alarm.go +++ b/src/modules/network_data/repository/alarm.go @@ -1,15 +1,194 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 告警 数据层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.Alarm +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + selectSql: `select + id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, + alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, + object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, + add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, + clear_time, clear_user, timestamp + from alarm`, - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "alarm_seq": "AlarmSeq", + "alarm_id": "AlarmId", + "alarm_title": "AlarmTitle", + "ne_type": "NeType", + "ne_id": "NeId", + "alarm_code": "AlarmCode", + "event_time": "EventTime", + "alarm_type": "AlarmType", + "orig_severity": "OrigSeverity", + "perceived_severity": "PerceivedSeverity", + "pv_flag": "PvFlag", + "ne_name": "NeName", + "object_uid": "ObjectUid", + "object_name": "ObjectName", + "object_type": "ObjectType", + "location_info": "LocationInfo", + "province": "Province", + "alarm_status": "AlarmStatus", + "specific_problem": "SpecificProblem", + "specific_problem_id": "SpecificProblemId", + "add_info": "AddInfo", + "counter": "Counter", + "latest_event_time": "LatestEventTime", + "ack_state": "AckState", + "ack_time": "AckTime", + "ack_user": "AckUser", + "clear_type": "ClearType", + "clear_time": "ClearTime", + "clear_user": "ClearUser", + "timestamp": "Timestamp", + }, +} + +// Alarm 告警 数据层处理 +type Alarm struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *Alarm) convertResultRows(rows []map[string]any) []model.Alarm { + arr := make([]model.Alarm, 0) + for _, row := range rows { + item := model.Alarm{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "object_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + params = append(params, querys.EndTime) + } + if querys.OrigSeverity != "" { + eventTypes := strings.Split(querys.OrigSeverity, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.Alarm{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from alarm" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *Alarm) SelectByIds(ids []string) []model.Alarm { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.Alarm{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from alarm where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/alarm.impl.go b/src/modules/network_data/repository/alarm.impl.go deleted file mode 100644 index 6a97dbf8..00000000 --- a/src/modules/network_data/repository/alarm.impl.go +++ /dev/null @@ -1,194 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - selectSql: `select - id, alarm_seq, alarm_id, alarm_title, ne_type, ne_id, alarm_code, event_time, - alarm_type, orig_severity, perceived_severity, pv_flag, ne_name, object_uid, object_name, - object_type, location_info, province, alarm_status, specific_problem, specific_problem_id, - add_info, counter, latest_event_time, ack_state, ack_time, ack_user, clear_type, - clear_time, clear_user, timestamp - from alarm`, - - resultMap: map[string]string{ - "id": "ID", - "alarm_seq": "AlarmSeq", - "alarm_id": "AlarmId", - "alarm_title": "AlarmTitle", - "ne_type": "NeType", - "ne_id": "NeId", - "alarm_code": "AlarmCode", - "event_time": "EventTime", - "alarm_type": "AlarmType", - "orig_severity": "OrigSeverity", - "perceived_severity": "PerceivedSeverity", - "pv_flag": "PvFlag", - "ne_name": "NeName", - "object_uid": "ObjectUid", - "object_name": "ObjectName", - "object_type": "ObjectType", - "location_info": "LocationInfo", - "province": "Province", - "alarm_status": "AlarmStatus", - "specific_problem": "SpecificProblem", - "specific_problem_id": "SpecificProblemId", - "add_info": "AddInfo", - "counter": "Counter", - "latest_event_time": "LatestEventTime", - "ack_state": "AckState", - "ack_time": "AckTime", - "ack_user": "AckUser", - "clear_type": "ClearType", - "clear_time": "ClearTime", - "clear_user": "ClearUser", - "timestamp": "Timestamp", - }, -} - -// AlarmImpl 告警 数据层处理 -type AlarmImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *AlarmImpl) convertResultRows(rows []map[string]any) []model.Alarm { - arr := make([]model.Alarm, 0) - for _, row := range rows { - item := model.Alarm{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "object_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - params = append(params, querys.EndTime) - } - if querys.OrigSeverity != "" { - eventTypes := strings.Split(querys.OrigSeverity, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("orig_severity in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.Alarm{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from alarm" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *AlarmImpl) SelectByIds(ids []string) []model.Alarm { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.Alarm{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from alarm where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_ims.go b/src/modules/network_data/repository/cdr_event_ims.go index fcc9a7bb..598e848c 100644 --- a/src/modules/network_data/repository/cdr_event_ims.go +++ b/src/modules/network_data/repository/cdr_event_ims.go @@ -1,15 +1,189 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件IMS 数据层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventIMS +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventIMS CDR会话事件IMS 数据层处理 +type CDREventIMS struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventIMS) convertResultRows(rows []map[string]any) []model.CDREventIMS { + arr := make([]model.CDREventIMS, 0) + for _, row := range rows { + item := model.CDREventIMS{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.CallerParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") + params = append(params, querys.CallerParty) + } + if querys.CalledParty != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") + params = append(params, querys.CalledParty) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventIMS{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_ims" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventIMS) SelectByIds(cdrIds []string) []model.CDREventIMS { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventIMS{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_ims where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_ims.impl.go b/src/modules/network_data/repository/cdr_event_ims.impl.go deleted file mode 100644 index 6d67b6ca..00000000 --- a/src/modules/network_data/repository/cdr_event_ims.impl.go +++ /dev/null @@ -1,189 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventIMSImpl CDR会话事件IMS 数据层处理 -type CDREventIMSImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventIMSImpl) convertResultRows(rows []map[string]any) []model.CDREventIMS { - arr := make([]model.CDREventIMS, 0) - for _, row := range rows { - item := model.CDREventIMS{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.CallerParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.callerParty') = ?") - params = append(params, querys.CallerParty) - } - if querys.CalledParty != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.calledParty') = ?") - params = append(params, querys.CalledParty) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventIMS{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_ims" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventIMSImpl) SelectByIds(cdrIds []string) []model.CDREventIMS { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventIMS{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_ims where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smf.go b/src/modules/network_data/repository/cdr_event_smf.go index 1a950a29..14f49cfc 100644 --- a/src/modules/network_data/repository/cdr_event_smf.go +++ b/src/modules/network_data/repository/cdr_event_smf.go @@ -1,15 +1,170 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMF 数据层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMF +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMF CDR会话事件 数据层处理 +type CDREventSMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMF) convertResultRows(rows []map[string]any) []model.CDREventSMF { + arr := make([]model.CDREventSMF, 0) + for _, row := range rows { + item := model.CDREventSMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.RecordType != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, querys.RecordType) + } + if querys.SubscriberID != "" { + conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") + params = append(params, querys.SubscriberID) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMF) SelectByIds(cdrIds []string) []model.CDREventSMF { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smf.impl.go b/src/modules/network_data/repository/cdr_event_smf.impl.go deleted file mode 100644 index 97c98aa7..00000000 --- a/src/modules/network_data/repository/cdr_event_smf.impl.go +++ /dev/null @@ -1,170 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMFImpl 结构体 -var NewCDREventSMFImpl = &CDREventSMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMFImpl CDR会话事件 数据层处理 -type CDREventSMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMFImpl) convertResultRows(rows []map[string]any) []model.CDREventSMF { - arr := make([]model.CDREventSMF, 0) - for _, row := range rows { - item := model.CDREventSMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.RecordType != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, querys.RecordType) - } - if querys.SubscriberID != "" { - conditions = append(conditions, "JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') = ?") - params = append(params, querys.SubscriberID) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMFImpl) SelectByIds(cdrIds []string) []model.CDREventSMF { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/cdr_event_smsc.go b/src/modules/network_data/repository/cdr_event_smsc.go index 403e0e40..7673e7bf 100644 --- a/src/modules/network_data/repository/cdr_event_smsc.go +++ b/src/modules/network_data/repository/cdr_event_smsc.go @@ -1,15 +1,181 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// CDR会话事件SMSC 数据层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(cdrIds []string) []model.CDREventSMSC +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + }, +} + +// CDREventSMSC CDR会话事件 数据层处理 +type CDREventSMSC struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *CDREventSMSC) convertResultRows(rows []map[string]any) []model.CDREventSMSC { + arr := make([]model.CDREventSMSC, 0) + for _, row := range rows { + item := model.CDREventSMSC{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + // MySQL8支持的 + // if querys.RecordType != "" { + // recordTypes := strings.Split(querys.RecordType, ",") + // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) + // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) + // for _, recordType := range recordTypes { + // params = append(params, recordType) + // } + // } + // Mariadb不支持json in查询改or + if querys.RecordType != "" { + recordTypes := strings.Split(querys.RecordType, ",") + var queryStrArr []string + for _, recordType := range recordTypes { + queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") + params = append(params, recordType) + } + conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.CDREventSMSC{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from cdr_event_smsc" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *CDREventSMSC) SelectByIds(cdrIds []string) []model.CDREventSMSC { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.CDREventSMSC{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) + sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cdrIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/cdr_event_smsc.impl.go b/src/modules/network_data/repository/cdr_event_smsc.impl.go deleted file mode 100644 index 82182313..00000000 --- a/src/modules/network_data/repository/cdr_event_smsc.impl.go +++ /dev/null @@ -1,181 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 CDREventSMSCImpl 结构体 -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smsc`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", - }, -} - -// CDREventSMSCImpl CDR会话事件 数据层处理 -type CDREventSMSCImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *CDREventSMSCImpl) convertResultRows(rows []map[string]any) []model.CDREventSMSC { - arr := make([]model.CDREventSMSC, 0) - for _, row := range rows { - item := model.CDREventSMSC{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - // MySQL8支持的 - // if querys.RecordType != "" { - // recordTypes := strings.Split(querys.RecordType, ",") - // placeholder := repo.KeyPlaceholderByQuery(len(recordTypes)) - // conditions = append(conditions, fmt.Sprintf("JSON_EXTRACT(cdr_json, '$.recordType') in (%s)", placeholder)) - // for _, recordType := range recordTypes { - // params = append(params, recordType) - // } - // } - // Mariadb不支持json in查询改or - if querys.RecordType != "" { - recordTypes := strings.Split(querys.RecordType, ",") - var queryStrArr []string - for _, recordType := range recordTypes { - queryStrArr = append(queryStrArr, "JSON_EXTRACT(cdr_json, '$.recordType') = ?") - params = append(params, recordType) - } - conditions = append(conditions, fmt.Sprintf("( %s )", strings.Join(queryStrArr, " OR "))) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.CDREventSMSC{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smsc" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *CDREventSMSCImpl) SelectByIds(cdrIds []string) []model.CDREventSMSC { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.CDREventSMSC{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cdrIds)) - sql := "delete from cdr_event_smsc where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cdrIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/perf_kpi.go b/src/modules/network_data/repository/perf_kpi.go index 1a00957f..e757fe01 100644 --- a/src/modules/network_data/repository/perf_kpi.go +++ b/src/modules/network_data/repository/perf_kpi.go @@ -1,15 +1,131 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// 性能统计 数据层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/modules/network_data/model" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{} - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any +// PerfKPI 性能统计 数据层处理 +type PerfKPI struct{} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + var tableName string = "kpi_report_" + if query.RmUID != "" { + conditions = append(conditions, "gk.rm_uid = ?") + params = append(params, query.RmUID) + } + if query.NeType != "" { + //conditions = append(conditions, "gk.ne_type = ?") + // params = append(params, query.NeType) + tableName += strings.ToLower(query.NeType) + } + if query.StartTime != "" { + conditions = append(conditions, "gk.created_at >= ?") + params = append(params, query.StartTime) + } + if query.EndTime != "" { + conditions = append(conditions, "gk.created_at <= ?") + params = append(params, query.EndTime) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询字段列 + var fields = []string{ + // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), + fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 + "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", + "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", + "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", + } + for i, kid := range kpiIds { + // 特殊字段,只取最后一次收到的非0值 + if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { + str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } else { + str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) + fields = append(fields, str) + } + } + fieldsSql := strings.Join(fields, ",") + + // 查询数据 + if query.SortField == "" { + query.SortField = "timeGroup" + } + if query.SortOrder == "" { + query.SortOrder = "desc" + } + orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) + querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + result := []model.GoldKPITitle{} + tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) + if err := tx.Error; err != nil { + logger.Errorf("Find err => %v", err) + } + return result +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if neType != "" { + conditions = append(conditions, "kupf.ne_type = ?") + params = append(params, neType) + } + if rmUID != "" { + conditions = append(conditions, "kupf.rm_uid = ?") + params = append(params, rmUID) + } + if startDate != "" { + conditions = append(conditions, "kupf.created_at >= ?") + params = append(params, startDate) + } + if endDate != "" { + conditions = append(conditions, "kupf.created_at <= ?") + params = append(params, endDate) + } + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := `SELECT + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', + sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' + FROM kpi_report_upf kupf` + results, err := datasource.RawDB("", querySql+whereSql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + return results[0] } diff --git a/src/modules/network_data/repository/perf_kpi.impl.go b/src/modules/network_data/repository/perf_kpi.impl.go deleted file mode 100644 index b7ac5bb8..00000000 --- a/src/modules/network_data/repository/perf_kpi.impl.go +++ /dev/null @@ -1,131 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{} - -// PerfKPIImpl 性能统计 数据层处理 -type PerfKPIImpl struct{} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery, kpiIds []string) []map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - var tableName string = "kpi_report_" - if query.RmUID != "" { - conditions = append(conditions, "gk.rm_uid = ?") - params = append(params, query.RmUID) - } - if query.NeType != "" { - //conditions = append(conditions, "gk.ne_type = ?") - // params = append(params, query.NeType) - tableName += strings.ToLower(query.NeType) - } - if query.StartTime != "" { - conditions = append(conditions, "gk.created_at >= ?") - params = append(params, query.StartTime) - } - if query.EndTime != "" { - conditions = append(conditions, "gk.created_at <= ?") - params = append(params, query.EndTime) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询字段列 - var fields = []string{ - // fmt.Sprintf("FROM_UNIXTIME(FLOOR(gk.created_at / (%d * 1000)) * %d) AS timeGroup", query.Interval, query.Interval), - fmt.Sprintf("CONCAT(FLOOR(gk.created_at / (%d * 1000)) * (%d * 1000)) AS timeGroup", query.Interval, query.Interval), // 时间戳毫秒 - "min(CASE WHEN gk.index != '' THEN gk.index ELSE 0 END) AS startIndex", - "min(CASE WHEN gk.ne_type != '' THEN gk.ne_type ELSE 0 END) AS neType", - "min(CASE WHEN gk.ne_name != '' THEN gk.ne_name ELSE 0 END) AS neName", - } - for i, kid := range kpiIds { - // 特殊字段,只取最后一次收到的非0值 - if kid == "AMF.01" || kid == "UDM.01" || kid == "UDM.02" || kid == "UDM.03" || kid == "SMF.01" { - str := fmt.Sprintf("IFNULL(SUBSTRING_INDEX(GROUP_CONCAT( CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') END ), ',', 1), 0) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } else { - str := fmt.Sprintf("sum(CASE WHEN JSON_EXTRACT(gk.kpi_values, '$[%d].kpi_id') = '%s' THEN JSON_EXTRACT(gk.kpi_values, '$[%d].value') ELSE 0 END) AS '%s'", i, kid, i, kid) - fields = append(fields, str) - } - } - fieldsSql := strings.Join(fields, ",") - - // 查询数据 - if query.SortField == "" { - query.SortField = "timeGroup" - } - if query.SortOrder == "" { - query.SortOrder = "desc" - } - orderSql := fmt.Sprintf(" order by %s %s", query.SortField, query.SortOrder) - querySql := fmt.Sprintf("SELECT %s FROM %s gk %s GROUP BY timeGroup %s", fieldsSql, tableName, whereSql, orderSql) - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - result := []model.GoldKPITitle{} - tx := datasource.DefaultDB().Table("kpi_title").Where("ne_type = ?", neType).Find(&result) - if err := tx.Error; err != nil { - logger.Errorf("Find err => %v", err) - } - return result -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID, startDate, endDate string) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if neType != "" { - conditions = append(conditions, "kupf.ne_type = ?") - params = append(params, neType) - } - if rmUID != "" { - conditions = append(conditions, "kupf.rm_uid = ?") - params = append(params, rmUID) - } - if startDate != "" { - conditions = append(conditions, "kupf.created_at >= ?") - params = append(params, startDate) - } - if endDate != "" { - conditions = append(conditions, "kupf.created_at <= ?") - params = append(params, endDate) - } - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := `SELECT - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[2].kpi_id') = 'UPF.03' THEN JSON_EXTRACT(kupf.kpi_values, '$[2].value') ELSE 0 END ) AS 'up', - sum( CASE WHEN JSON_EXTRACT(kupf.kpi_values, '$[5].kpi_id') = 'UPF.06' THEN JSON_EXTRACT(kupf.kpi_values, '$[5].value') ELSE 0 END ) AS 'down' - FROM kpi_report_upf kupf` - results, err := datasource.RawDB("", querySql+whereSql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - return results[0] -} diff --git a/src/modules/network_data/repository/ue_event_amf.go b/src/modules/network_data/repository/ue_event_amf.go index 4e053a01..76442b8c 100644 --- a/src/modules/network_data/repository/ue_event_amf.go +++ b/src/modules/network_data/repository/ue_event_amf.go @@ -1,15 +1,175 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件AMF 数据层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventAMF +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventAMF UE会话事件 数据层处理 +type UEEventAMF struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventAMF) convertResultRows(rows []map[string]any) []model.UEEventAMF { + arr := make([]model.UEEventAMF, 0) + for _, row := range rows { + item := model.UEEventAMF{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventAMF{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_amf" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventAMF) SelectByIds(ueIds []string) []model.UEEventAMF { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventAMF{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_amf where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_amf.impl.go b/src/modules/network_data/repository/ue_event_amf.impl.go deleted file mode 100644 index b442207c..00000000 --- a/src/modules/network_data/repository/ue_event_amf.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventAMFImpl UE会话事件 数据层处理 -type UEEventAMFImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventAMFImpl) convertResultRows(rows []map[string]any) []model.UEEventAMF { - arr := make([]model.UEEventAMF, 0) - for _, row := range rows { - item := model.UEEventAMF{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventAMF{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_amf" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventAMFImpl) SelectByIds(ueIds []string) []model.UEEventAMF { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventAMF{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_amf where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/repository/ue_event_mme.go b/src/modules/network_data/repository/ue_event_mme.go index 7a77fb18..a035f5aa 100644 --- a/src/modules/network_data/repository/ue_event_mme.go +++ b/src/modules/network_data/repository/ue_event_mme.go @@ -1,15 +1,175 @@ package repository -import "be.ems/src/modules/network_data/model" +import ( + "fmt" + "strings" -// UE会话事件MME 数据层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_data/model" +) - // SelectByIds 通过ID查询 - SelectByIds(ueIds []string) []model.UEEventMME +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + }, +} + +// UEEventMME UE会话事件 数据层处理 +type UEEventMME struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *UEEventMME) convertResultRows(rows []map[string]any) []model.UEEventMME { + arr := make([]model.UEEventMME, 0) + for _, row := range rows { + item := model.UEEventMME{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if querys.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, querys.NeType) + } + if querys.RmUID != "" { + conditions = append(conditions, "rm_uid = ?") + params = append(params, querys.RmUID) + } + if querys.StartTime != "" { + conditions = append(conditions, "timestamp >= ?") + if len(querys.StartTime) == 13 { + querys.StartTime = querys.StartTime[:10] + } + params = append(params, querys.StartTime) + } + if querys.EndTime != "" { + conditions = append(conditions, "timestamp <= ?") + if len(querys.EndTime) == 13 { + querys.EndTime = querys.EndTime[:10] + } + params = append(params, querys.EndTime) + } + if querys.EventType != "" { + eventTypes := strings.Split(querys.EventType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) + conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) + for _, eventType := range eventTypes { + params = append(params, eventType) + } + } + if querys.IMSI != "" { + conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") + params = append(params, querys.IMSI) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.UEEventMME{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ue_event_mme" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 排序 + orderSql := "" + if querys.SortField != "" { + sortSql := querys.SortField + if querys.SortOrder != "" { + if querys.SortOrder == "desc" { + sortSql += " desc " + } else { + sortSql += " asc " + } + } + orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) + } + + // 查询数据 + querySql := r.selectSql + whereSql + orderSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectByIds 通过ID查询 +func (r *UEEventMME) SelectByIds(ueIds []string) []model.UEEventMME { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.UEEventMME{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) + sql := "delete from ue_event_mme where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ueIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_data/repository/ue_event_mme.impl.go b/src/modules/network_data/repository/ue_event_mme.impl.go deleted file mode 100644 index 180bc9df..00000000 --- a/src/modules/network_data/repository/ue_event_mme.impl.go +++ /dev/null @@ -1,175 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_data/model" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", - }, -} - -// UEEventMMEImpl UE会话事件 数据层处理 -type UEEventMMEImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *UEEventMMEImpl) convertResultRows(rows []map[string]any) []model.UEEventMME { - arr := make([]model.UEEventMME, 0) - for _, row := range rows { - item := model.UEEventMME{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if querys.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, querys.NeType) - } - if querys.RmUID != "" { - conditions = append(conditions, "rm_uid = ?") - params = append(params, querys.RmUID) - } - if querys.StartTime != "" { - conditions = append(conditions, "timestamp >= ?") - if len(querys.StartTime) == 13 { - querys.StartTime = querys.StartTime[:10] - } - params = append(params, querys.StartTime) - } - if querys.EndTime != "" { - conditions = append(conditions, "timestamp <= ?") - if len(querys.EndTime) == 13 { - querys.EndTime = querys.EndTime[:10] - } - params = append(params, querys.EndTime) - } - if querys.EventType != "" { - eventTypes := strings.Split(querys.EventType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(eventTypes)) - conditions = append(conditions, fmt.Sprintf("event_type in (%s)", placeholder)) - for _, eventType := range eventTypes { - params = append(params, eventType) - } - } - if querys.IMSI != "" { - conditions = append(conditions, "JSON_EXTRACT(event_json, '$.imsi') = ?") - params = append(params, querys.IMSI) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.UEEventMME{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_mme" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(querys.PageNum, querys.PageSize) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 排序 - orderSql := "" - if querys.SortField != "" { - sortSql := querys.SortField - if querys.SortOrder != "" { - if querys.SortOrder == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - orderSql = fmt.Sprintf(" order by id desc, %s ", sortSql) - } - - // 查询数据 - querySql := r.selectSql + whereSql + orderSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectByIds 通过ID查询 -func (r *UEEventMMEImpl) SelectByIds(ueIds []string) []model.UEEventMME { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.UEEventMME{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ueIds)) - sql := "delete from ue_event_mme where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ueIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_data/service/alarm.go b/src/modules/network_data/service/alarm.go index 3c466ee4..3df04ead 100644 --- a/src/modules/network_data/service/alarm.go +++ b/src/modules/network_data/service/alarm.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// 告警 服务层接口 -type IAlarm interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.AlarmQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化数据层 Alarm 结构体 +var NewAlarm = &Alarm{ + alarmRepository: repository.NewAlarm, +} + +// Alarm 告警 服务层处理 +type Alarm struct { + alarmRepository *repository.Alarm // 告警数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *Alarm) SelectPage(querys model.AlarmQuery) map[string]any { + return r.alarmRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *Alarm) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.alarmRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(data) == len(ids) { + rows := r.alarmRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/alarm.impl.go b/src/modules/network_data/service/alarm.impl.go deleted file mode 100644 index e988ed13..00000000 --- a/src/modules/network_data/service/alarm.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 AlarmImpl 结构体 -var NewAlarmImpl = &AlarmImpl{ - alarmRepository: repository.NewAlarmImpl, -} - -// AlarmImpl 告警 服务层处理 -type AlarmImpl struct { - // 告警数据信息 - alarmRepository repository.IAlarm -} - -// SelectPage 根据条件分页查询 -func (r *AlarmImpl) SelectPage(querys model.AlarmQuery) map[string]any { - return r.alarmRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *AlarmImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.alarmRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(data) == len(ids) { - rows := r.alarmRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index 2f5be53e..922fb024 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件IMS 服务层接口 -type ICDREventIMS interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventIMSQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventIMS 结构体 +var NewCDREventIMS = &CDREventIMS{ + cdrEventIMSRepository: repository.NewCDREventIMS, +} + +// CDREventImpl CDR会话事件IMS 服务层处理 +type CDREventIMS struct { + cdrEventIMSRepository *repository.CDREventIMS // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventIMS) SelectPage(querys model.CDREventIMSQuery) map[string]any { + return r.cdrEventIMSRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_ims.impl.go b/src/modules/network_data/service/cdr_event_ims.impl.go deleted file mode 100644 index 15dfbd81..00000000 --- a/src/modules/network_data/service/cdr_event_ims.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 NewCDREventIMSImpl 结构体 -var NewCDREventIMSImpl = &CDREventIMSImpl{ - cdrEventIMSRepository: repository.NewCDREventIMSImpl, -} - -// CDREventImpl CDR会话事件IMS 服务层处理 -type CDREventIMSImpl struct { - // CDR会话事件数据信息 - cdrEventIMSRepository repository.ICDREventIMS -} - -// SelectPage 根据条件分页查询 -func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]any { - return r.cdrEventIMSRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventIMSImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventIMSRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventIMSRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smf.go b/src/modules/network_data/service/cdr_event_smf.go index 1e55a690..abd30a85 100644 --- a/src/modules/network_data/service/cdr_event_smf.go +++ b/src/modules/network_data/service/cdr_event_smf.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMF 服务层接口 -type ICDREventSMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMF 结构体 +var NewCDREventSMF = &CDREventSMF{ + cdrEventRepository: repository.NewCDREventSMF, +} + +// CDREventSMF CDR会话事件SMF 服务层处理 +type CDREventSMF struct { + cdrEventRepository *repository.CDREventSMF // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMF) SelectPage(querys model.CDREventSMFQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMF) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smf.impl.go b/src/modules/network_data/service/cdr_event_smf.impl.go deleted file mode 100644 index 09d2e48a..00000000 --- a/src/modules/network_data/service/cdr_event_smf.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -var NewCDREventSMFImpl = &CDREventSMFImpl{ - cdrEventRepository: repository.NewCDREventSMFImpl, -} - -type CDREventSMFImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMF -} - -func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMFImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index 472ffea7..39448874 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// CDR会话事件SMSC 服务层接口 -type ICDREventSMSC interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.CDREventSMSCQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(cdrIds []string) (int64, error) +// 实例化数据层 CDREventSMSC 结构体 +var NewCDREventSMSC = &CDREventSMSC{ + cdrEventRepository: repository.NewCDREventSMSC, +} + +// CDREventSMSC CDR会话事件SMSC 服务层处理 +type CDREventSMSC struct { + cdrEventRepository *repository.CDREventSMSC // CDR会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *CDREventSMSC) SelectPage(querys model.CDREventSMSCQuery) map[string]any { + return r.cdrEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) { + // 检查是否存在 + ids := r.cdrEventRepository.SelectByIds(cdrIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("not data") + } + + if len(ids) == len(cdrIds) { + rows := r.cdrEventRepository.DeleteByIds(cdrIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/cdr_event_smsc.impl.go b/src/modules/network_data/service/cdr_event_smsc.impl.go deleted file mode 100644 index b2d27f3d..00000000 --- a/src/modules/network_data/service/cdr_event_smsc.impl.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -var NewCDREventSMSCImpl = &CDREventSMSCImpl{ - cdrEventRepository: repository.NewCDREventSMSCImpl, -} - -type CDREventSMSCImpl struct { - // CDR会话事件数据信息 - cdrEventRepository repository.ICDREventSMSC -} - -func (r *CDREventSMSCImpl) SelectPage(querys model.CDREventSMSCQuery) map[string]any { - return r.cdrEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *CDREventSMSCImpl) DeleteByIds(cdrIds []string) (int64, error) { - // 检查是否存在 - ids := r.cdrEventRepository.SelectByIds(cdrIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("not data") - } - - if len(ids) == len(cdrIds) { - rows := r.cdrEventRepository.DeleteByIds(cdrIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/perf_kpi.go b/src/modules/network_data/service/perf_kpi.go index fcd7d768..b4aef0c4 100644 --- a/src/modules/network_data/service/perf_kpi.go +++ b/src/modules/network_data/service/perf_kpi.go @@ -1,15 +1,79 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "encoding/json" + "fmt" + "time" -// 性能统计 服务层接口 -type IPerfKPI interface { - // SelectGoldKPI 通过网元指标数据信息 - SelectGoldKPI(query model.GoldKPIQuery) []map[string]any + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // SelectGoldKPITitle 网元对应的指标名称 - SelectGoldKPITitle(neType string) []model.GoldKPITitle - - // SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 - SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any +// 实例化数据层 PerfKPI 结构体 +var NewPerfKPI = &PerfKPI{ + perfKPIRepository: repository.NewPerfKPI, +} + +// PerfKPI 性能统计 服务层处理 +type PerfKPI struct { + perfKPIRepository *repository.PerfKPI // 性能统计数据信息 +} + +// SelectGoldKPI 通过网元指标数据信息 +func (r *PerfKPI) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { + // 获取数据指标id + var kpiIds []string + kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) + for _, kpiId := range kpiTitles { + kpiIds = append(kpiIds, kpiId.KPIID) + } + + data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) + if data == nil { + return []map[string]any{} + } + return data +} + +// SelectGoldKPITitle 网元对应的指标名称 +func (r *PerfKPI) SelectGoldKPITitle(neType string) []model.GoldKPITitle { + return r.perfKPIRepository.SelectGoldKPITitle(neType) +} + +// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 +func (r *PerfKPI) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { + now := time.Now() + // 获取当前日期 + endDate := fmt.Sprint(now.UnixMilli()) + // 将当前日期前几天数 + startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) + + var info map[string]any + + // 读取缓存数据 小于2分钟重新缓存 + key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) + infoStr, _ := redis.Get("", key) + if infoStr != "" { + json.Unmarshal([]byte(infoStr), &info) + expireSecond, _ := redis.GetExpire("", key) + if expireSecond > 120 { + return info + } + } + // down * 8 / 1000 / 1000 单位M + info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) + if v, ok := info["up"]; ok && v == nil { + info["up"] = 0 + } + if v, ok := info["down"]; ok && v == nil { + info["down"] = 0 + } + + // 保存到缓存 + infoJSON, _ := json.Marshal(info) + redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) + + return info } diff --git a/src/modules/network_data/service/perf_kpi.impl.go b/src/modules/network_data/service/perf_kpi.impl.go deleted file mode 100644 index f34f5508..00000000 --- a/src/modules/network_data/service/perf_kpi.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "time" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 PerfKPIImpl 结构体 -var NewPerfKPIImpl = &PerfKPIImpl{ - perfKPIRepository: repository.NewPerfKPIImpl, -} - -// PerfKPIImpl 性能统计 服务层处理 -type PerfKPIImpl struct { - // 性能统计数据信息 - perfKPIRepository repository.IPerfKPI -} - -// SelectGoldKPI 通过网元指标数据信息 -func (r *PerfKPIImpl) SelectGoldKPI(query model.GoldKPIQuery) []map[string]any { - // 获取数据指标id - var kpiIds []string - kpiTitles := r.perfKPIRepository.SelectGoldKPITitle(query.NeType) - for _, kpiId := range kpiTitles { - kpiIds = append(kpiIds, kpiId.KPIID) - } - - data := r.perfKPIRepository.SelectGoldKPI(query, kpiIds) - if data == nil { - return []map[string]any{} - } - return data -} - -// SelectGoldKPITitle 网元对应的指标名称 -func (r *PerfKPIImpl) SelectGoldKPITitle(neType string) []model.GoldKPITitle { - return r.perfKPIRepository.SelectGoldKPITitle(neType) -} - -// SelectUPFTotalFlow 查询UPF总流量 N3上行 N6下行 -func (r *PerfKPIImpl) SelectUPFTotalFlow(neType, rmUID string, day int) map[string]any { - now := time.Now() - // 获取当前日期 - endDate := fmt.Sprint(now.UnixMilli()) - // 将当前日期前几天数 - startDate := fmt.Sprint(now.AddDate(0, 0, -day).Truncate(24 * time.Hour).UnixMilli()) - - var info map[string]any - - // 读取缓存数据 小于2分钟重新缓存 - key := fmt.Sprintf("%sUPF:totalFlow:%s_%d", cachekey.NE_DATA_KEY, rmUID, day) - infoStr, _ := redis.Get("", key) - if infoStr != "" { - json.Unmarshal([]byte(infoStr), &info) - expireSecond, _ := redis.GetExpire("", key) - if expireSecond > 120 { - return info - } - } - // down * 8 / 1000 / 1000 单位M - info = r.perfKPIRepository.SelectUPFTotalFlow(neType, rmUID, startDate, endDate) - if v, ok := info["up"]; ok && v == nil { - info["up"] = 0 - } - if v, ok := info["down"]; ok && v == nil { - info["down"] = 0 - } - - // 保存到缓存 - infoJSON, _ := json.Marshal(info) - redis.SetByExpire("", key, string(infoJSON), time.Duration(10)*time.Minute) - - return info -} diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go index e5f77a63..29fdec2d 100644 --- a/src/modules/network_data/service/ue_event_amf.go +++ b/src/modules/network_data/service/ue_event_amf.go @@ -1,12 +1,40 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件AMF 服务层接口 -type IUEEventAMF interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventAMFQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventAMF 结构体 +var NewUEEventAMF = &UEEventAMF{ + ueEventRepository: repository.NewUEEventAMF, +} + +// UEEventAMF UE会话事件AMF 服务层处理 +type UEEventAMF struct { + // UE会话事件数据信息 + ueEventRepository *repository.UEEventAMF +} + +// SelectPage 根据条件分页查询 +func (r *UEEventAMF) SelectPage(querys model.UEEventAMFQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_amf.impl.go b/src/modules/network_data/service/ue_event_amf.impl.go deleted file mode 100644 index 8d5f61c9..00000000 --- a/src/modules/network_data/service/ue_event_amf.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventMMEImpl 结构体 -var NewUEEventMMEImpl = &UEEventMMEImpl{ - ueEventRepository: repository.NewUEEventMMEImpl, -} - -// UEEventMMEImpl UE会话事件MME 服务层处理 -type UEEventMMEImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventMME -} - -// SelectPage 根据条件分页查询 -func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventMMEImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go index d4b5dd86..dd034b25 100644 --- a/src/modules/network_data/service/ue_event_mme.go +++ b/src/modules/network_data/service/ue_event_mme.go @@ -1,12 +1,39 @@ package service -import "be.ems/src/modules/network_data/model" +import ( + "fmt" -// UE会话事件MME 服务层接口 -type IUEEventMME interface { - // SelectPage 根据条件分页查询 - SelectPage(querys model.UEEventMMEQuery) map[string]any + "be.ems/src/modules/network_data/model" + "be.ems/src/modules/network_data/repository" +) - // DeleteByIds 批量删除信息 - DeleteByIds(ueIds []string) (int64, error) +// 实例化数据层 UEEventMME 结构体 +var NewUEEventMME = &UEEventMME{ + ueEventRepository: repository.NewUEEventMME, +} + +// UEEventMME UE会话事件MME 服务层处理 +type UEEventMME struct { + ueEventRepository *repository.UEEventMME // UE会话事件数据信息 +} + +// SelectPage 根据条件分页查询 +func (r *UEEventMME) SelectPage(querys model.UEEventMMEQuery) map[string]any { + return r.ueEventRepository.SelectPage(querys) +} + +// DeleteByIds 批量删除信息 +func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) { + // 检查是否存在 + ids := r.ueEventRepository.SelectByIds(ueIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("no data") + } + + if len(ids) == len(ueIds) { + rows := r.ueEventRepository.DeleteByIds(ueIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_data/service/ue_event_mme.impl.go b/src/modules/network_data/service/ue_event_mme.impl.go deleted file mode 100644 index 9c7e0710..00000000 --- a/src/modules/network_data/service/ue_event_mme.impl.go +++ /dev/null @@ -1,40 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_data/model" - "be.ems/src/modules/network_data/repository" -) - -// 实例化数据层 UEEventAMFImpl 结构体 -var NewUEEventAMFImpl = &UEEventAMFImpl{ - ueEventRepository: repository.NewUEEventAMFImpl, -} - -// UEEventAMFImpl UE会话事件AMF 服务层处理 -type UEEventAMFImpl struct { - // UE会话事件数据信息 - ueEventRepository repository.IUEEventAMF -} - -// SelectPage 根据条件分页查询 -func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any { - return r.ueEventRepository.SelectPage(querys) -} - -// DeleteByIds 批量删除信息 -func (r *UEEventAMFImpl) DeleteByIds(ueIds []string) (int64, error) { - // 检查是否存在 - ids := r.ueEventRepository.SelectByIds(ueIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("no data") - } - - if len(ids) == len(ueIds) { - rows := r.ueEventRepository.DeleteByIds(ueIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 0d121b7d..7d6ebc6f 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -20,7 +20,7 @@ import ( // 实例化控制层 NeActionController 结构体 var NewNeAction = &NeActionController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 网元处理请求 @@ -28,7 +28,7 @@ var NewNeAction = &NeActionController{ // PATH /action type NeActionController struct { // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo } // 发送文件从本地到网元 diff --git a/src/modules/network_element/controller/ne_config.go b/src/modules/network_element/controller/ne_config.go index e1d737bb..c6c25be6 100644 --- a/src/modules/network_element/controller/ne_config.go +++ b/src/modules/network_element/controller/ne_config.go @@ -18,18 +18,16 @@ import ( // NewNeConfig 网元参数配置 实例化控制层 var NewNeConfig = &NeConfigController{ - neConfigService: neService.NewNeConfigImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigService: neService.NewNeConfig, + neInfoService: neService.NewNeInfo, } // 网元参数配置 // // PATH /config type NeConfigController struct { - // 网元参数配置可用属性值服务 - neConfigService neService.INeConfig - // 网元信息服务 - neInfoService neService.INeInfo + neConfigService *neService.NeConfig // 网元参数配置可用属性值服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元参数配置可用属性值列表 diff --git a/src/modules/network_element/controller/ne_config_backup.go b/src/modules/network_element/controller/ne_config_backup.go index 1ba1870c..90937dc3 100644 --- a/src/modules/network_element/controller/ne_config_backup.go +++ b/src/modules/network_element/controller/ne_config_backup.go @@ -18,18 +18,16 @@ import ( // NewNeConfigBackup 实例化控制层 NeConfigBackupController 结构体 var NewNeConfigBackup = &NeConfigBackupController{ - neConfigBackupService: neService.NewNeConfigBackupImpl, - neInfoService: neService.NewNeInfoImpl, + neConfigBackupService: neService.NewNeConfigBackup, + neInfoService: neService.NewNeInfo, } // 网元配置文件备份记录 // // PATH /config/backup type NeConfigBackupController struct { - // 网元配置文件备份记录服务 - neConfigBackupService neService.INeConfigBackup - // 网元信息服务 - neInfoService neService.INeInfo + neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元配置文件备份记录列表 diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 7f8b9cdc..3b9c1871 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -17,15 +17,14 @@ import ( // 实例化控制层 NeHostController 结构体 var NewNeHost = &NeHostController{ - neHostService: neService.NewNeHostImpl, + neHostService: neService.NewNeHost, } // 网元主机连接请求 // // PATH /host type NeHostController struct { - // 网元主机连接服务 - neHostService neService.INeHost + neHostService *neService.NeHost // 网元主机连接服务 } // 网元主机列表 diff --git a/src/modules/network_element/controller/ne_host_cmd.go b/src/modules/network_element/controller/ne_host_cmd.go index f817a59a..31031da5 100644 --- a/src/modules/network_element/controller/ne_host_cmd.go +++ b/src/modules/network_element/controller/ne_host_cmd.go @@ -15,15 +15,14 @@ import ( // 实例化控制层 NeHostCmdController 结构体 var NewNeHostCmd = &NeHostCmdController{ - neHostCmdService: neService.NewNeHostCmdImpl, + neHostCmdService: neService.NewNeHostCmd, } // 网元主机命令请求 // // PATH /hostCmd type NeHostCmdController struct { - // 网元主机命令服务 - neHostCmdService neService.INeHostCmd + neHostCmdService *neService.NeHostCmd // 网元主机命令服务 } // 网元主机命令列表 diff --git a/src/modules/network_element/controller/ne_info.go b/src/modules/network_element/controller/ne_info.go index 001b778a..c2ce7ab3 100644 --- a/src/modules/network_element/controller/ne_info.go +++ b/src/modules/network_element/controller/ne_info.go @@ -18,8 +18,8 @@ import ( // 实例化控制层 NeInfoController 结构体 var NewNeInfo = &NeInfoController{ - neInfoService: neService.NewNeInfoImpl, - neLicenseService: neService.NewNeLicenseImpl, + neInfoService: neService.NewNeInfo, + neLicenseService: neService.NewNeLicense, neVersionService: neService.NewNeVersion, } @@ -27,12 +27,9 @@ var NewNeInfo = &NeInfoController{ // // PATH /info type NeInfoController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 网元授权激活信息服务 - neLicenseService neService.INeLicense - // 网元版本信息服务 - neVersionService *neService.NeVersion + neInfoService *neService.NeInfo // 网元信息服务 + neLicenseService *neService.NeLicense // 网元授权激活信息服务 + neVersionService *neService.NeVersion // 网元版本信息服务 } // neStateCacheMap 网元状态缓存最后一次成功的信息 diff --git a/src/modules/network_element/controller/ne_license.go b/src/modules/network_element/controller/ne_license.go index 3b4dd4ce..4ddf1ed5 100644 --- a/src/modules/network_element/controller/ne_license.go +++ b/src/modules/network_element/controller/ne_license.go @@ -15,18 +15,16 @@ import ( // 实例化控制层 NeLicenseController 结构体 var NewNeLicense = &NeLicenseController{ - neLicenseService: neService.NewNeLicenseImpl, - neInfoService: neService.NewNeInfoImpl, + neLicenseService: neService.NewNeLicense, + neInfoService: neService.NewNeInfo, } // 网元授权激活请求 // // PATH /license type NeLicenseController struct { - // 网元授权激活服务 - neLicenseService neService.INeLicense - // 网元信息服务 - neInfoService neService.INeInfo + neLicenseService *neService.NeLicense // 网元授权激活服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元授权激活列表 diff --git a/src/modules/network_element/controller/ne_software.go b/src/modules/network_element/controller/ne_software.go index fb15beb8..25c05803 100644 --- a/src/modules/network_element/controller/ne_software.go +++ b/src/modules/network_element/controller/ne_software.go @@ -15,15 +15,14 @@ import ( // 实例化控制层 NeSoftwareController 结构体 var NewNeSoftware = &NeSoftwareController{ - neSoftwareService: neService.NewNeSoftwareImpl, + neSoftwareService: neService.NewNeSoftware, } // 网元软件包请求 // // PATH /software type NeSoftwareController struct { - // 网元软件包服务 - neSoftwareService neService.INeSoftware + neSoftwareService *neService.NeSoftware // 网元软件包服务 } // 网元软件包列表 diff --git a/src/modules/network_element/controller/ne_version.go b/src/modules/network_element/controller/ne_version.go index 366e30c2..366c9891 100644 --- a/src/modules/network_element/controller/ne_version.go +++ b/src/modules/network_element/controller/ne_version.go @@ -18,8 +18,7 @@ var NewNeVersion = &NeVersionController{ // // PATH /version type NeVersionController struct { - // 网元版本服务 - neVersionService *neService.NeVersion + neVersionService *neService.NeVersion // 网元版本服务 } // 网元版本列表 diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 89cd4624..8dc59a6d 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -351,13 +351,13 @@ func Setup(router *gin.Engine) { // InitLoad 初始参数 func InitLoad() { // 启动时,清除缓存-网元类型 - service.NewNeInfoImpl.ClearNeCacheByNeType("*") - service.NewNeInfoImpl.SelectNeInfoByRmuid("") + service.NewNeInfo.ClearNeCacheByNeType("*") + service.NewNeInfo.SelectNeInfoByRmuid("") // 启动时,网元公共参数数据记录到全局变量 - if para5GMap, err := service.NewNeInfoImpl.NeConfPara5GRead(); para5GMap != nil && err == nil { - service.NewNeInfoImpl.NeConfPara5GWirte(para5GMap, nil) + if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil { + service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil) } // 启动时,清除缓存-网元参数配置可用属性值 - service.NewNeConfigImpl.ClearNeCacheByNeType("*") - service.NewNeConfigImpl.RefreshByNeTypeAndNeID("*") + service.NewNeConfig.ClearNeCacheByNeType("*") + service.NewNeConfig.RefreshByNeTypeAndNeID("*") } diff --git a/src/modules/network_element/repository/ne_config.go b/src/modules/network_element/repository/ne_config.go index 5f555b3e..29ea68f5 100644 --- a/src/modules/network_element/repository/ne_config.go +++ b/src/modules/network_element/repository/ne_config.go @@ -1,24 +1,259 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfig 网元参数配置可用属性值 数据层接口 -type INeConfig interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig +// 实例化数据层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "param_name": "ParamName", + "param_display": "ParamDisplay", + "param_type": "ParamType", + "param_json": "ParamJson", + "param_sort": "ParamSort", + "param_perms": "ParamPerms", + "update_time": "UpdateTime", + }, +} + +// NeConfig 网元参数配置可用属性值 数据层处理 +type NeConfig struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfig) convertResultRows(rows []map[string]any) []model.NeConfig { + arr := make([]model.NeConfig, 0) + for _, row := range rows { + item := model.NeConfig{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, v) + } + if v, ok := query["paramName"]; ok && v != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, v) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(id) as 'total' from ne_config" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + // 查询条件拼接 + var conditions []string + var params []any + if param.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, param.NeType) + } + if param.ParamName != "" { + conditions = append(conditions, "param_name = ?") + params = append(params, param.ParamName) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by param_sort asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectByIds(ids []string) []model.NeConfig { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfig{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + // 参数拼接 + params := make(map[string]any) + if param.NeType != "" { + params["ne_type"] = param.NeType + } + if param.ParamName != "" { + params["param_name"] = param.ParamName + } + if param.ParamDisplay != "" { + params["param_display"] = param.ParamDisplay + } + if param.ParamType != "" { + params["param_type"] = param.ParamType + } + if param.ParamJson != "" { + params["param_json"] = param.ParamJson + } + params["param_sort"] = param.ParamSort + if param.ParamPerms != "" { + params["param_perms"] = param.ParamPerms + } + params["update_time"] = time.Now().UnixMilli() + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, param.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config.impl.go b/src/modules/network_element/repository/ne_config.impl.go deleted file mode 100644 index d7a845ef..00000000 --- a/src/modules/network_element/repository/ne_config.impl.go +++ /dev/null @@ -1,259 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化数据层 -var NewNeConfigImpl = &NeConfigImpl{ - selectSql: `select id, ne_type, param_name, param_display, param_type, param_json, param_sort, param_perms, update_time from ne_config`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "param_name": "ParamName", - "param_display": "ParamDisplay", - "param_type": "ParamType", - "param_json": "ParamJson", - "param_sort": "ParamSort", - "param_perms": "ParamPerms", - "update_time": "UpdateTime", - }, -} - -// NeConfigImpl 网元参数配置可用属性值 数据层处理 -type NeConfigImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigImpl) convertResultRows(rows []map[string]any) []model.NeConfig { - arr := make([]model.NeConfig, 0) - for _, row := range rows { - item := model.NeConfig{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, v) - } - if v, ok := query["paramName"]; ok && v != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, v) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(id) as 'total' from ne_config" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - // 查询条件拼接 - var conditions []string - var params []any - if param.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, param.NeType) - } - if param.ParamName != "" { - conditions = append(conditions, "param_name = ?") - params = append(params, param.ParamName) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by param_sort asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectByIds(ids []string) []model.NeConfig { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfig{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - // 参数拼接 - params := make(map[string]any) - if param.NeType != "" { - params["ne_type"] = param.NeType - } - if param.ParamName != "" { - params["param_name"] = param.ParamName - } - if param.ParamDisplay != "" { - params["param_display"] = param.ParamDisplay - } - if param.ParamType != "" { - params["param_type"] = param.ParamType - } - if param.ParamJson != "" { - params["param_json"] = param.ParamJson - } - params["param_sort"] = param.ParamSort - if param.ParamPerms != "" { - params["param_perms"] = param.ParamPerms - } - params["update_time"] = time.Now().UnixMilli() - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, param.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_config_backup.go b/src/modules/network_element/repository/ne_config_backup.go index 131f363d..3354034d 100644 --- a/src/modules/network_element/repository/ne_config_backup.go +++ b/src/modules/network_element/repository/ne_config_backup.go @@ -1,24 +1,262 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 数据层接口 -type INeConfigBackup interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup +// 实例化数据层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + selectSql: `select + id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time + from ne_config_backup`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "name": "Name", + "path": "Path", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeConfigBackup 网元配置文件备份记录 数据层处理 +type NeConfigBackup struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeConfigBackup) convertResultRows(rows []map[string]any) []model.NeConfigBackup { + arr := make([]model.NeConfigBackup, 0) + for _, row := range rows { + item := model.NeConfigBackup{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(concat('%', ?), '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_config_backup" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + // 查询条件拼接 + var conditions []string + var params []any + if item.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, item.NeType) + } + if item.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, item.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectByIds(cmdIds []string) []model.NeConfigBackup { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeConfigBackup{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + if item.Remark != "" { + params["remark"] = item.Remark + } + if item.CreateBy != "" { + params["create_by"] = item.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + // 参数拼接 + params := make(map[string]any) + if item.NeType != "" { + params["ne_type"] = item.NeType + } + if item.NeId != "" { + params["ne_id"] = item.NeId + } + if item.Name != "" { + params["name"] = item.Name + } + if item.Path != "" { + params["path"] = item.Path + } + params["remark"] = item.Remark + if item.UpdateBy != "" { + params["update_by"] = item.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, item.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(ids)) + sql := "delete from ne_config_backup where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(ids) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_config_backup.impl.go b/src/modules/network_element/repository/ne_config_backup.impl.go deleted file mode 100644 index 17331822..00000000 --- a/src/modules/network_element/repository/ne_config_backup.impl.go +++ /dev/null @@ -1,262 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeConfigBackupImpl 结构体 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - selectSql: `select - id, ne_type, ne_id, name, path, remark, create_by, create_time, update_by, update_time - from ne_config_backup`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "name": "Name", - "path": "Path", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeConfigBackupImpl 网元配置文件备份记录 数据层处理 -type NeConfigBackupImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeConfigBackupImpl) convertResultRows(rows []map[string]any) []model.NeConfigBackup { - arr := make([]model.NeConfigBackup, 0) - for _, row := range rows { - item := model.NeConfigBackup{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_config_backup" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - // 查询条件拼接 - var conditions []string - var params []any - if item.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, item.NeType) - } - if item.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, item.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectByIds(cmdIds []string) []model.NeConfigBackup { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeConfigBackup{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - if item.Remark != "" { - params["remark"] = item.Remark - } - if item.CreateBy != "" { - params["create_by"] = item.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_config_backup (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - // 参数拼接 - params := make(map[string]any) - if item.NeType != "" { - params["ne_type"] = item.NeType - } - if item.NeId != "" { - params["ne_id"] = item.NeId - } - if item.Name != "" { - params["name"] = item.Name - } - if item.Path != "" { - params["path"] = item.Path - } - params["remark"] = item.Remark - if item.UpdateBy != "" { - params["update_by"] = item.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_config_backup set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, item.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(ids)) - sql := "delete from ne_config_backup where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(ids) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index a61fb968..ca957179 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -1,27 +1,376 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHost 网元主机连接 数据层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost +// 实例化数据层 NeHost 结构体 +var NewNeHost = &NeHost{ + selectSql: `select + host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time + from ne_host`, - // SelectByIds 通过ID查询 - SelectByIds(hostIds []string) []model.NeHost - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) int64 - - // CheckUniqueNeHost 校验主机是否唯一 - CheckUniqueNeHost(neHost model.NeHost) string + resultMap: map[string]string{ + "host_id": "HostID", + "host_type": "HostType", + "group_id": "GroupID", + "title": "Title", + "addr": "Addr", + "port": "Port", + "user": "User", + "auth_mode": "AuthMode", + "password": "Password", + "private_key": "PrivateKey", + "private_password": "PassPhrase", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHost 网元主机连接 数据层处理 +type NeHost struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHost) convertResultRows(rows []map[string]any) []model.NeHost { + arr := make([]model.NeHost, 0) + for _, row := range rows { + item := model.NeHost{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["hostType"]; ok && v != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectByIds(hostIds []string) []model.NeHost { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + querySql := r.selectSql + " where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHost{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeHost 校验主机是否唯一 +func (r *NeHost) CheckUniqueNeHost(neHost model.NeHost) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHost.HostType != "" { + conditions = append(conditions, "host_type = ?") + params = append(params, neHost.HostType) + } + if neHost.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHost.GroupID) + } + if neHost.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHost.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + if neHost.Remark != "" { + params["remark"] = neHost.Remark + } + if neHost.CreateBy != "" { + params["create_by"] = neHost.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + // 参数拼接 + params := make(map[string]any) + if neHost.HostType != "" { + params["host_type"] = neHost.HostType + } + if neHost.GroupID != "" { + params["group_id"] = neHost.GroupID + } + if neHost.Title != "" { + params["title"] = neHost.Title + } + if neHost.Addr != "" { + params["addr"] = neHost.Addr + } + if neHost.Port > 0 { + params["port"] = neHost.Port + } + if neHost.User != "" { + params["user"] = neHost.User + } + if neHost.AuthMode != "" { + params["auth_mode"] = neHost.AuthMode + } + if neHost.Password != "" { + params["password"] = neHost.Password + } + if neHost.PrivateKey != "" { + params["private_key"] = neHost.PrivateKey + } + if neHost.PassPhrase != "" { + params["pass_phrase"] = neHost.PassPhrase + } + params["remark"] = neHost.Remark + if neHost.UpdateBy != "" { + params["update_by"] = neHost.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 根据认证模式清除不必要的信息 + if neHost.AuthMode == "0" { + params["private_key"] = "" + params["pass_phrase"] = "" + } + if neHost.AuthMode == "1" { + params["password"] = "" + } + if neHost.AuthMode == "2" { + params["password"] = "" + params["private_key"] = "" + params["pass_phrase"] = "" + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" + + // 执行更新 + values = append(values, neHost.HostID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) + sql := "delete from ne_host where host_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(hostIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host.impl.go b/src/modules/network_element/repository/ne_host.impl.go deleted file mode 100644 index 5988ad94..00000000 --- a/src/modules/network_element/repository/ne_host.impl.go +++ /dev/null @@ -1,376 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - selectSql: `select - host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time - from ne_host`, - - resultMap: map[string]string{ - "host_id": "HostID", - "host_type": "HostType", - "group_id": "GroupID", - "title": "Title", - "addr": "Addr", - "port": "Port", - "user": "User", - "auth_mode": "AuthMode", - "password": "Password", - "private_key": "PrivateKey", - "private_password": "PassPhrase", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostImpl 网元主机连接 数据层处理 -type NeHostImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostImpl) convertResultRows(rows []map[string]any) []model.NeHost { - arr := make([]model.NeHost, 0) - for _, row := range rows { - item := model.NeHost{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["hostType"]; ok && v != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectByIds(hostIds []string) []model.NeHost { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - querySql := r.selectSql + " where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHost{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeHost 校验主机是否唯一 -func (r *NeHostImpl) CheckUniqueNeHost(neHost model.NeHost) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHost.HostType != "" { - conditions = append(conditions, "host_type = ?") - params = append(params, neHost.HostType) - } - if neHost.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHost.GroupID) - } - if neHost.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHost.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - if neHost.Remark != "" { - params["remark"] = neHost.Remark - } - if neHost.CreateBy != "" { - params["create_by"] = neHost.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - // 参数拼接 - params := make(map[string]any) - if neHost.HostType != "" { - params["host_type"] = neHost.HostType - } - if neHost.GroupID != "" { - params["group_id"] = neHost.GroupID - } - if neHost.Title != "" { - params["title"] = neHost.Title - } - if neHost.Addr != "" { - params["addr"] = neHost.Addr - } - if neHost.Port > 0 { - params["port"] = neHost.Port - } - if neHost.User != "" { - params["user"] = neHost.User - } - if neHost.AuthMode != "" { - params["auth_mode"] = neHost.AuthMode - } - if neHost.Password != "" { - params["password"] = neHost.Password - } - if neHost.PrivateKey != "" { - params["private_key"] = neHost.PrivateKey - } - if neHost.PassPhrase != "" { - params["pass_phrase"] = neHost.PassPhrase - } - params["remark"] = neHost.Remark - if neHost.UpdateBy != "" { - params["update_by"] = neHost.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 根据认证模式清除不必要的信息 - if neHost.AuthMode == "0" { - params["private_key"] = "" - params["pass_phrase"] = "" - } - if neHost.AuthMode == "1" { - params["password"] = "" - } - if neHost.AuthMode == "2" { - params["password"] = "" - params["private_key"] = "" - params["pass_phrase"] = "" - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host set " + strings.Join(keys, ",") + " where host_id = ?" - - // 执行更新 - values = append(values, neHost.HostID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(hostIds)) - sql := "delete from ne_host where host_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(hostIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_host_cmd.go b/src/modules/network_element/repository/ne_host_cmd.go index 170441bc..4ef57073 100644 --- a/src/modules/network_element/repository/ne_host_cmd.go +++ b/src/modules/network_element/repository/ne_host_cmd.go @@ -1,27 +1,306 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeHostCmd 网元主机命令 数据层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd +// 实例化数据层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + selectSql: `select + cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time + from ne_host_cmd`, - // SelectByIds 通过ID查询 - SelectByIds(cmdIds []string) []model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) int64 - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string + resultMap: map[string]string{ + "cmd_id": "CmdID", + "cmd_type": "CmdType", + "group_id": "GroupID", + "title": "Title", + "command": "Command", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeHostCmd 网元主机连接 数据层处理 +type NeHostCmd struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeHostCmd) convertResultRows(rows []map[string]any) []model.NeHostCmd { + arr := make([]model.NeHostCmd, 0) + for _, row := range rows { + item := model.NeHostCmd{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["cmdType"]; ok && v != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["groupId"]; ok && v != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["title"]; ok && v != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_host_cmd" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title like concat(?, '%')") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by update_time asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectByIds(cmdIds []string) []model.NeHostCmd { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeHostCmd{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { + // 查询条件拼接 + var conditions []string + var params []any + if neHostCmd.CmdType != "" { + conditions = append(conditions, "cmd_type = ?") + params = append(params, neHostCmd.CmdType) + } + if neHostCmd.GroupID != "" { + conditions = append(conditions, "group_id = ?") + params = append(params, neHostCmd.GroupID) + } + if neHostCmd.Title != "" { + conditions = append(conditions, "title = ?") + params = append(params, neHostCmd.Title) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + if neHostCmd.Remark != "" { + params["remark"] = neHostCmd.Remark + } + if neHostCmd.CreateBy != "" { + params["create_by"] = neHostCmd.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + // 参数拼接 + params := make(map[string]any) + if neHostCmd.CmdType != "" { + params["cmd_type"] = neHostCmd.CmdType + } + if neHostCmd.GroupID != "" { + params["group_id"] = neHostCmd.GroupID + } + if neHostCmd.Title != "" { + params["title"] = neHostCmd.Title + } + if neHostCmd.Command != "" { + params["command"] = neHostCmd.Command + } + params["remark"] = neHostCmd.Remark + if neHostCmd.UpdateBy != "" { + params["update_by"] = neHostCmd.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" + + // 执行更新 + values = append(values, neHostCmd.CmdID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_host_cmd.impl.go b/src/modules/network_element/repository/ne_host_cmd.impl.go deleted file mode 100644 index b4bb279e..00000000 --- a/src/modules/network_element/repository/ne_host_cmd.impl.go +++ /dev/null @@ -1,306 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - selectSql: `select - cmd_id, cmd_type, group_id, title, command, remark, create_by, create_time, update_by, update_time - from ne_host_cmd`, - - resultMap: map[string]string{ - "cmd_id": "CmdID", - "cmd_type": "CmdType", - "group_id": "GroupID", - "title": "Title", - "command": "Command", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeHostCmdImpl 网元主机连接 数据层处理 -type NeHostCmdImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeHostCmdImpl) convertResultRows(rows []map[string]any) []model.NeHostCmd { - arr := make([]model.NeHostCmd, 0) - for _, row := range rows { - item := model.NeHostCmd{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["cmdType"]; ok && v != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["groupId"]; ok && v != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["title"]; ok && v != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_host_cmd" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title like concat(?, '%')") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by update_time asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectByIds(cmdIds []string) []model.NeHostCmd { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeHostCmd{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(neHostCmd model.NeHostCmd) string { - // 查询条件拼接 - var conditions []string - var params []any - if neHostCmd.CmdType != "" { - conditions = append(conditions, "cmd_type = ?") - params = append(params, neHostCmd.CmdType) - } - if neHostCmd.GroupID != "" { - conditions = append(conditions, "group_id = ?") - params = append(params, neHostCmd.GroupID) - } - if neHostCmd.Title != "" { - conditions = append(conditions, "title = ?") - params = append(params, neHostCmd.Title) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select host_id as 'str' from ne_host " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - if neHostCmd.Remark != "" { - params["remark"] = neHostCmd.Remark - } - if neHostCmd.CreateBy != "" { - params["create_by"] = neHostCmd.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_host_cmd (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - // 参数拼接 - params := make(map[string]any) - if neHostCmd.CmdType != "" { - params["cmd_type"] = neHostCmd.CmdType - } - if neHostCmd.GroupID != "" { - params["group_id"] = neHostCmd.GroupID - } - if neHostCmd.Title != "" { - params["title"] = neHostCmd.Title - } - if neHostCmd.Command != "" { - params["command"] = neHostCmd.Command - } - params["remark"] = neHostCmd.Remark - if neHostCmd.UpdateBy != "" { - params["update_by"] = neHostCmd.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_host_cmd set " + strings.Join(keys, ",") + " where cmd_id = ?" - - // 执行更新 - values = append(values, neHostCmd.CmdID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_host_cmd where cmd_id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index c09d034a..effa5554 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -1,32 +1,405 @@ package repository import ( + "fmt" + "strings" + "time" + + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" "be.ems/src/modules/network_element/model" ) -// 网元信息 数据层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // SelectPage 根据条件分页查询 - SelectPage(query map[string]any) map[string]any - - // SelectList 查询列表 - SelectList(neInfo model.NeInfo) []model.NeInfo - - // SelectByIds 通过ID查询 - SelectByIds(infoIds []string) []model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除网元信息 - DeleteByIds(infoIds []string) int64 - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string +// neListSort 网元列表预设排序 +var neListSort = []string{ + "OMC", + "IMS", + "AMF", + "AUSF", + "UDM", + "SMF", + "PCF", + "NSSF", + "NRF", + "UPF", + "LMF", + "NEF", + "MME", + "N3IWF", + "MOCNGW", + "SMSC", + "CBC", +} + +// 实例化数据层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, + + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "rm_uid": "RmUID", + "ne_name": "NeName", + "ip": "IP", + "port": "Port", + "pv_flag": "PvFlag", + "province": "Province", + "vendor_name": "VendorName", + "dn": "Dn", + "ne_address": "NeAddress", + "host_ids": "HostIDs", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeInfo 网元信息表 数据层处理 +type NeInfo struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeInfo) convertResultRows(rows []map[string]any) []model.NeInfo { + arr := make([]model.NeInfo, 0) + for _, row := range rows { + item := model.NeInfo{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + + // 创建优先级映射 + priority := make(map[string]int) + for i, v := range neListSort { + priority[v] = i + } + // 冒泡排序 + n := len(arr) + for i := 0; i < n-1; i++ { + for j := 0; j < n-i-1; j++ { + if priority[arr[j].NeType] > priority[arr[j+1].NeType] { + // 交换元素 + arr[j], arr[j+1] = arr[j+1], arr[j] + } + } + } + + return arr +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + querySql := r.selectSql + " where ne_type = ? and ne_id = ?" + results, err := datasource.RawDB("", querySql, []any{neType, neID}) + if err != nil { + logger.Errorf("query err => %v", err) + return model.NeInfo{} + } + // 转换实体 + rows := r.convertResultRows(results) + if len(rows) > 0 { + return rows[0] + } + return model.NeInfo{} +} + +// SelectPage 根据条件分页查询 +func (r *NeInfo) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["rmUid"]; ok && v != "" { + conditions = append(conditions, "rmUid like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeInfo{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_info" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 查询列表 +func (r *NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeInfo) SelectByIds(infoIds []string) []model.NeInfo { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeInfo{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { + // 查询条件拼接 + var conditions []string + var params []any + if neInfo.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neInfo.NeType) + } + if neInfo.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neInfo.NeId) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + if neInfo.Province != "" { + params["province"] = neInfo.Province + } + if neInfo.VendorName != "" { + params["vendor_name"] = neInfo.VendorName + } + if neInfo.Dn != "" { + params["dn"] = neInfo.Dn + } + if neInfo.NeAddress != "" { + params["ne_address"] = neInfo.NeAddress + } + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.Remark != "" { + params["remark"] = neInfo.Remark + } + if neInfo.CreateBy != "" { + params["create_by"] = neInfo.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 参数拼接 + params := make(map[string]any) + if neInfo.NeType != "" { + params["ne_type"] = neInfo.NeType + } + if neInfo.NeId != "" { + params["ne_id"] = neInfo.NeId + } + if neInfo.RmUID != "" { + params["rm_uid"] = neInfo.RmUID + } + if neInfo.NeName != "" { + params["ne_name"] = neInfo.NeName + } + if neInfo.IP != "" { + params["ip"] = neInfo.IP + } + if neInfo.Port > 0 { + params["port"] = neInfo.Port + } + if neInfo.PvFlag != "" { + params["pv_flag"] = neInfo.PvFlag + } + params["province"] = neInfo.Province + params["vendor_name"] = neInfo.VendorName + params["dn"] = neInfo.Dn + params["ne_address"] = neInfo.NeAddress + if neInfo.HostIDs != "" { + params["host_ids"] = neInfo.HostIDs + } + params["remark"] = neInfo.Remark + if neInfo.Status != "" { + params["status"] = neInfo.Status + } + if neInfo.UpdateBy != "" { + params["update_by"] = neInfo.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neInfo.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除网元信息 +func (r *NeInfo) DeleteByIds(infoIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) + sql := "delete from ne_info where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(infoIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_info.impl.go b/src/modules/network_element/repository/ne_info.impl.go deleted file mode 100644 index adbc75c8..00000000 --- a/src/modules/network_element/repository/ne_info.impl.go +++ /dev/null @@ -1,405 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// neListSort 网元列表预设排序 -var neListSort = []string{ - "OMC", - "IMS", - "AMF", - "AUSF", - "UDM", - "SMF", - "PCF", - "NSSF", - "NRF", - "UPF", - "LMF", - "NEF", - "MME", - "N3IWF", - "MOCNGW", - "SMSC", - "CBC", -} - -// 实例化数据层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - selectSql: `select id, ne_type, ne_id, rm_uid, ne_name, ip, port, pv_flag, province, vendor_name, dn, ne_address, host_ids, status, remark, create_by, create_time, update_by, update_time from ne_info`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "rm_uid": "RmUID", - "ne_name": "NeName", - "ip": "IP", - "port": "Port", - "pv_flag": "PvFlag", - "province": "Province", - "vendor_name": "VendorName", - "dn": "Dn", - "ne_address": "NeAddress", - "host_ids": "HostIDs", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeInfoImpl 网元信息表 数据层处理 -type NeInfoImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeInfoImpl) convertResultRows(rows []map[string]any) []model.NeInfo { - arr := make([]model.NeInfo, 0) - for _, row := range rows { - item := model.NeInfo{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - - // 创建优先级映射 - priority := make(map[string]int) - for i, v := range neListSort { - priority[v] = i - } - // 冒泡排序 - n := len(arr) - for i := 0; i < n-1; i++ { - for j := 0; j < n-i-1; j++ { - if priority[arr[j].NeType] > priority[arr[j+1].NeType] { - // 交换元素 - arr[j], arr[j+1] = arr[j+1], arr[j] - } - } - } - - return arr -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - querySql := r.selectSql + " where ne_type = ? and ne_id = ?" - results, err := datasource.RawDB("", querySql, []any{neType, neID}) - if err != nil { - logger.Errorf("query err => %v", err) - return model.NeInfo{} - } - // 转换实体 - rows := r.convertResultRows(results) - if len(rows) > 0 { - return rows[0] - } - return model.NeInfo{} -} - -// SelectPage 根据条件分页查询 -func (r *NeInfoImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["rmUid"]; ok && v != "" { - conditions = append(conditions, "rmUid like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeInfo{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_info" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 查询列表 -func (r *NeInfoImpl) SelectList(neInfo model.NeInfo) []model.NeInfo { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by ne_type asc, ne_id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeInfoImpl) SelectByIds(infoIds []string) []model.NeInfo { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeInfo{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neInfo model.NeInfo) string { - // 查询条件拼接 - var conditions []string - var params []any - if neInfo.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neInfo.NeType) - } - if neInfo.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neInfo.NeId) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_info " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - if neInfo.Province != "" { - params["province"] = neInfo.Province - } - if neInfo.VendorName != "" { - params["vendor_name"] = neInfo.VendorName - } - if neInfo.Dn != "" { - params["dn"] = neInfo.Dn - } - if neInfo.NeAddress != "" { - params["ne_address"] = neInfo.NeAddress - } - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.Remark != "" { - params["remark"] = neInfo.Remark - } - if neInfo.CreateBy != "" { - params["create_by"] = neInfo.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_info (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 参数拼接 - params := make(map[string]any) - if neInfo.NeType != "" { - params["ne_type"] = neInfo.NeType - } - if neInfo.NeId != "" { - params["ne_id"] = neInfo.NeId - } - if neInfo.RmUID != "" { - params["rm_uid"] = neInfo.RmUID - } - if neInfo.NeName != "" { - params["ne_name"] = neInfo.NeName - } - if neInfo.IP != "" { - params["ip"] = neInfo.IP - } - if neInfo.Port > 0 { - params["port"] = neInfo.Port - } - if neInfo.PvFlag != "" { - params["pv_flag"] = neInfo.PvFlag - } - params["province"] = neInfo.Province - params["vendor_name"] = neInfo.VendorName - params["dn"] = neInfo.Dn - params["ne_address"] = neInfo.NeAddress - if neInfo.HostIDs != "" { - params["host_ids"] = neInfo.HostIDs - } - params["remark"] = neInfo.Remark - if neInfo.Status != "" { - params["status"] = neInfo.Status - } - if neInfo.UpdateBy != "" { - params["update_by"] = neInfo.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_info set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neInfo.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除网元信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(infoIds)) - sql := "delete from ne_info where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(infoIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_license.go b/src/modules/network_element/repository/ne_license.go index 83cc42ac..5aad6b32 100644 --- a/src/modules/network_element/repository/ne_license.go +++ b/src/modules/network_element/repository/ne_license.go @@ -1,24 +1,297 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "strings" + "time" -// INeLicense 网元授权激活信息 数据层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense +// 实例化数据层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + selectSql: `select + id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time + from ne_license`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "ne_id": "NeId", + "activation_request_code": "ActivationRequestCode", + "license_path": "LicensePath", + "serial_num": "SerialNum", + "expiry_date": "ExpiryDate", + "status": "Status", + "remark": "Remark", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeLicense 网元授权激活信息 数据层处理 +type NeLicense struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeLicense) convertResultRows(rows []map[string]any) []model.NeLicense { + arr := make([]model.NeLicense, 0) + for _, row := range rows { + item := model.NeLicense{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["neId"]; ok && v != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["expiryDate"]; ok && v != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["createBy"]; ok && v != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_license" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + // 查询条件拼接 + var conditions []string + var params []any + if neLicense.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neLicense.NeType) + } + if neLicense.NeId != "" { + conditions = append(conditions, "ne_id = ?") + params = append(params, neLicense.NeId) + } + if neLicense.ExpiryDate != "" { + conditions = append(conditions, "expiry_date = ?") + params = append(params, neLicense.ExpiryDate) + } + if neLicense.CreateBy != "" { + conditions = append(conditions, "create_by like concat(?, '%')") + params = append(params, neLicense.CreateBy) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id asc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectByIds(cmdIds []string) []model.NeLicense { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeLicense{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.CreateBy != "" { + params["create_by"] = neLicense.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + // 参数拼接 + params := make(map[string]any) + if neLicense.NeType != "" { + params["ne_type"] = neLicense.NeType + } + if neLicense.NeId != "" { + params["ne_id"] = neLicense.NeId + } + if neLicense.ActivationRequestCode != "" { + params["activation_request_code"] = neLicense.ActivationRequestCode + } + if neLicense.LicensePath != "" { + params["license_path"] = neLicense.LicensePath + } + if neLicense.SerialNum != "" { + params["serial_num"] = neLicense.SerialNum + } + if neLicense.ExpiryDate != "" { + params["expiry_date"] = neLicense.ExpiryDate + } + if neLicense.Status != "" { + params["status"] = neLicense.Status + } + if neLicense.Remark != "" { + params["remark"] = neLicense.Remark + } + if neLicense.UpdateBy != "" { + params["update_by"] = neLicense.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neLicense.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_license where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_license.impl.go b/src/modules/network_element/repository/ne_license.impl.go deleted file mode 100644 index 0daee946..00000000 --- a/src/modules/network_element/repository/ne_license.impl.go +++ /dev/null @@ -1,297 +0,0 @@ -package repository - -import ( - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeLicense 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - selectSql: `select - id, ne_type, ne_id, activation_request_code, license_path, serial_num, expiry_date, status, remark, create_by, create_time, update_by, update_time - from ne_license`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_id": "NeId", - "activation_request_code": "ActivationRequestCode", - "license_path": "LicensePath", - "serial_num": "SerialNum", - "expiry_date": "ExpiryDate", - "status": "Status", - "remark": "Remark", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeLicenseImpl 网元授权激活信息 数据层处理 -type NeLicenseImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeLicenseImpl) convertResultRows(rows []map[string]any) []model.NeLicense { - arr := make([]model.NeLicense, 0) - for _, row := range rows { - item := model.NeLicense{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["neId"]; ok && v != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["expiryDate"]; ok && v != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["createBy"]; ok && v != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_license" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - // 查询条件拼接 - var conditions []string - var params []any - if neLicense.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neLicense.NeType) - } - if neLicense.NeId != "" { - conditions = append(conditions, "ne_id = ?") - params = append(params, neLicense.NeId) - } - if neLicense.ExpiryDate != "" { - conditions = append(conditions, "expiry_date = ?") - params = append(params, neLicense.ExpiryDate) - } - if neLicense.CreateBy != "" { - conditions = append(conditions, "create_by like concat(?, '%')") - params = append(params, neLicense.CreateBy) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id asc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectByIds(cmdIds []string) []model.NeLicense { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeLicense{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.CreateBy != "" { - params["create_by"] = neLicense.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_license (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - // 参数拼接 - params := make(map[string]any) - if neLicense.NeType != "" { - params["ne_type"] = neLicense.NeType - } - if neLicense.NeId != "" { - params["ne_id"] = neLicense.NeId - } - if neLicense.ActivationRequestCode != "" { - params["activation_request_code"] = neLicense.ActivationRequestCode - } - if neLicense.LicensePath != "" { - params["license_path"] = neLicense.LicensePath - } - if neLicense.SerialNum != "" { - params["serial_num"] = neLicense.SerialNum - } - if neLicense.ExpiryDate != "" { - params["expiry_date"] = neLicense.ExpiryDate - } - if neLicense.Status != "" { - params["status"] = neLicense.Status - } - if neLicense.Remark != "" { - params["remark"] = neLicense.Remark - } - if neLicense.UpdateBy != "" { - params["update_by"] = neLicense.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_license set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neLicense.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_license where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/repository/ne_software.go b/src/modules/network_element/repository/ne_software.go index f6d0f23e..d039ec6d 100644 --- a/src/modules/network_element/repository/ne_software.go +++ b/src/modules/network_element/repository/ne_software.go @@ -1,27 +1,317 @@ package repository -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "strings" + "time" -// INeSoftware 网元软件包信息 数据层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/datasource" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/utils/repo" + "be.ems/src/modules/network_element/model" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware +// 实例化数据层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + selectSql: `select + id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time + from ne_software`, - // SelectByIds 通过ID查询 - SelectByIds(ids []string) []model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) int64 - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string + resultMap: map[string]string{ + "id": "ID", + "ne_type": "NeType", + "name": "Name", + "path": "Path", + "version": "Version", + "description": "Description", + "create_by": "CreateBy", + "create_time": "CreateTime", + "update_by": "UpdateBy", + "update_time": "UpdateTime", + }, +} + +// NeSoftware 网元软件包信息 数据层处理 +type NeSoftware struct { + // 查询视图对象SQL + selectSql string + // 结果字段与实体映射 + resultMap map[string]string +} + +// convertResultRows 将结果记录转实体结果组 +func (r *NeSoftware) convertResultRows(rows []map[string]any) []model.NeSoftware { + arr := make([]model.NeSoftware, 0) + for _, row := range rows { + item := model.NeSoftware{} + for key, value := range row { + if keyMapper, ok := r.resultMap[key]; ok { + repo.SetFieldValue(&item, keyMapper, value) + } + } + arr = append(arr, item) + } + return arr +} + +// SelectPage 根据条件分页查询字典类型 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + // 查询条件拼接 + var conditions []string + var params []any + if v, ok := query["neType"]; ok && v != "" { + softwareType := v.(string) + if strings.Contains(softwareType, ",") { + softwareTypeArr := strings.Split(softwareType, ",") + placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) + conditions = append(conditions, "ne_type in ("+placeholder+")") + parameters := repo.ConvertIdsSlice(softwareTypeArr) + params = append(params, parameters...) + } else { + conditions = append(conditions, "ne_type = ?") + params = append(params, strings.Trim(softwareType, " ")) + } + } + if v, ok := query["name"]; ok && v != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + if v, ok := query["version"]; ok && v != "" { + conditions = append(conditions, "version like concat(?, '%')") + params = append(params, strings.Trim(v.(string), " ")) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + result := map[string]any{ + "total": 0, + "rows": []model.NeHost{}, + } + + // 查询数量 长度为0直接返回 + totalSql := "select count(1) as 'total' from ne_software" + totalRows, err := datasource.RawDB("", totalSql+whereSql, params) + if err != nil { + logger.Errorf("total err => %v", err) + return result + } + total := parse.Number(totalRows[0]["total"]) + if total == 0 { + return result + } else { + result["total"] = total + } + + // 分页 + pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) + pageSql := " order by id desc limit ?,? " + params = append(params, pageNum*pageSize) + params = append(params, pageSize) + + // 查询数据 + querySql := r.selectSql + whereSql + pageSql + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + return result + } + + // 转换实体 + result["rows"] = r.convertResultRows(results) + return result +} + +// SelectList 根据实体查询 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Path != "" { + conditions = append(conditions, "path = ?") + params = append(params, neSoftware.Path) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name like concat(?, '%')") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } + + // 查询数据 + querySql := r.selectSql + whereSql + " order by id desc " + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err => %v", err) + } + + // 转换实体 + return r.convertResultRows(results) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectByIds(cmdIds []string) []model.NeSoftware { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + querySql := r.selectSql + " where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.RawDB("", querySql, parameters) + if err != nil { + logger.Errorf("query err => %v", err) + return []model.NeSoftware{} + } + // 转换实体 + return r.convertResultRows(results) +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { + // 查询条件拼接 + var conditions []string + var params []any + if neSoftware.NeType != "" { + conditions = append(conditions, "ne_type = ?") + params = append(params, neSoftware.NeType) + } + if neSoftware.Version != "" { + conditions = append(conditions, "version = ?") + params = append(params, neSoftware.Version) + } + if neSoftware.Name != "" { + conditions = append(conditions, "name = ?") + params = append(params, neSoftware.Name) + } + + // 构建查询条件语句 + whereSql := "" + if len(conditions) > 0 { + whereSql += " where " + strings.Join(conditions, " and ") + } else { + return "" + } + + // 查询数据 + querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" + results, err := datasource.RawDB("", querySql, params) + if err != nil { + logger.Errorf("query err %v", err) + return "" + } + if len(results) > 0 { + return fmt.Sprint(results[0]["str"]) + } + return "" +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.CreateBy != "" { + params["create_by"] = neSoftware.CreateBy + params["create_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) + sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" + + db := datasource.DefaultDB() + // 开启事务 + tx := db.Begin() + // 执行插入 + err := tx.Exec(sql, values...).Error + if err != nil { + logger.Errorf("insert row : %v", err.Error()) + tx.Rollback() + return "" + } + // 获取生成的自增 ID + var insertedID string + err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) + if err != nil { + logger.Errorf("insert last id : %v", err.Error()) + tx.Rollback() + return "" + } + // 提交事务 + tx.Commit() + return insertedID +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + // 参数拼接 + params := make(map[string]any) + if neSoftware.NeType != "" { + params["ne_type"] = neSoftware.NeType + } + if neSoftware.Name != "" { + params["name"] = neSoftware.Name + } + if neSoftware.Path != "" { + params["path"] = neSoftware.Path + } + if neSoftware.Version != "" { + params["version"] = neSoftware.Version + } + params["description"] = neSoftware.Description + if neSoftware.UpdateBy != "" { + params["update_by"] = neSoftware.UpdateBy + params["update_time"] = time.Now().UnixMilli() + } + + // 构建执行语句 + keys, values := repo.KeyValueByUpdate(params) + sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" + + // 执行更新 + values = append(values, neSoftware.ID) + rows, err := datasource.ExecDB("", sql, values) + if err != nil { + logger.Errorf("update row : %v", err.Error()) + return 0 + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(cmdIds []string) int64 { + placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) + sql := "delete from ne_software where id in (" + placeholder + ")" + parameters := repo.ConvertIdsSlice(cmdIds) + results, err := datasource.ExecDB("", sql, parameters) + if err != nil { + logger.Errorf("delete err => %v", err) + return 0 + } + return results } diff --git a/src/modules/network_element/repository/ne_software.impl.go b/src/modules/network_element/repository/ne_software.impl.go deleted file mode 100644 index 5aa8cda6..00000000 --- a/src/modules/network_element/repository/ne_software.impl.go +++ /dev/null @@ -1,317 +0,0 @@ -package repository - -import ( - "fmt" - "strings" - "time" - - "be.ems/src/framework/datasource" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/repo" - "be.ems/src/modules/network_element/model" -) - -// 实例化数据层 NewNeSoftware 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - selectSql: `select - id, ne_type, name, path, version, description, create_by, create_time, update_by, update_time - from ne_software`, - - resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "name": "Name", - "path": "Path", - "version": "Version", - "description": "Description", - "create_by": "CreateBy", - "create_time": "CreateTime", - "update_by": "UpdateBy", - "update_time": "UpdateTime", - }, -} - -// NeSoftwareImpl 网元软件包信息 数据层处理 -type NeSoftwareImpl struct { - // 查询视图对象SQL - selectSql string - // 结果字段与实体映射 - resultMap map[string]string -} - -// convertResultRows 将结果记录转实体结果组 -func (r *NeSoftwareImpl) convertResultRows(rows []map[string]any) []model.NeSoftware { - arr := make([]model.NeSoftware, 0) - for _, row := range rows { - item := model.NeSoftware{} - for key, value := range row { - if keyMapper, ok := r.resultMap[key]; ok { - repo.SetFieldValue(&item, keyMapper, value) - } - } - arr = append(arr, item) - } - return arr -} - -// SelectPage 根据条件分页查询字典类型 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - // 查询条件拼接 - var conditions []string - var params []any - if v, ok := query["neType"]; ok && v != "" { - softwareType := v.(string) - if strings.Contains(softwareType, ",") { - softwareTypeArr := strings.Split(softwareType, ",") - placeholder := repo.KeyPlaceholderByQuery(len(softwareTypeArr)) - conditions = append(conditions, "ne_type in ("+placeholder+")") - parameters := repo.ConvertIdsSlice(softwareTypeArr) - params = append(params, parameters...) - } else { - conditions = append(conditions, "ne_type = ?") - params = append(params, strings.Trim(softwareType, " ")) - } - } - if v, ok := query["name"]; ok && v != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - if v, ok := query["version"]; ok && v != "" { - conditions = append(conditions, "version like concat(?, '%')") - params = append(params, strings.Trim(v.(string), " ")) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - result := map[string]any{ - "total": 0, - "rows": []model.NeHost{}, - } - - // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ne_software" - totalRows, err := datasource.RawDB("", totalSql+whereSql, params) - if err != nil { - logger.Errorf("total err => %v", err) - return result - } - total := parse.Number(totalRows[0]["total"]) - if total == 0 { - return result - } else { - result["total"] = total - } - - // 分页 - pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) - pageSql := " order by id desc limit ?,? " - params = append(params, pageNum*pageSize) - params = append(params, pageSize) - - // 查询数据 - querySql := r.selectSql + whereSql + pageSql - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - return result - } - - // 转换实体 - result["rows"] = r.convertResultRows(results) - return result -} - -// SelectList 根据实体查询 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Path != "" { - conditions = append(conditions, "path = ?") - params = append(params, neSoftware.Path) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name like concat(?, '%')") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } - - // 查询数据 - querySql := r.selectSql + whereSql + " order by id desc " - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err => %v", err) - } - - // 转换实体 - return r.convertResultRows(results) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectByIds(cmdIds []string) []model.NeSoftware { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - querySql := r.selectSql + " where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.RawDB("", querySql, parameters) - if err != nil { - logger.Errorf("query err => %v", err) - return []model.NeSoftware{} - } - // 转换实体 - return r.convertResultRows(results) -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neSoftware model.NeSoftware) string { - // 查询条件拼接 - var conditions []string - var params []any - if neSoftware.NeType != "" { - conditions = append(conditions, "ne_type = ?") - params = append(params, neSoftware.NeType) - } - if neSoftware.Version != "" { - conditions = append(conditions, "version = ?") - params = append(params, neSoftware.Version) - } - if neSoftware.Name != "" { - conditions = append(conditions, "name = ?") - params = append(params, neSoftware.Name) - } - - // 构建查询条件语句 - whereSql := "" - if len(conditions) > 0 { - whereSql += " where " + strings.Join(conditions, " and ") - } else { - return "" - } - - // 查询数据 - querySql := "select id as 'str' from ne_software " + whereSql + " limit 1" - results, err := datasource.RawDB("", querySql, params) - if err != nil { - logger.Errorf("query err %v", err) - return "" - } - if len(results) > 0 { - return fmt.Sprint(results[0]["str"]) - } - return "" -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.CreateBy != "" { - params["create_by"] = neSoftware.CreateBy - params["create_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) - sql := "insert into ne_software (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" - - db := datasource.DefaultDB() - // 开启事务 - tx := db.Begin() - // 执行插入 - err := tx.Exec(sql, values...).Error - if err != nil { - logger.Errorf("insert row : %v", err.Error()) - tx.Rollback() - return "" - } - // 获取生成的自增 ID - var insertedID string - err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) - if err != nil { - logger.Errorf("insert last id : %v", err.Error()) - tx.Rollback() - return "" - } - // 提交事务 - tx.Commit() - return insertedID -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - // 参数拼接 - params := make(map[string]any) - if neSoftware.NeType != "" { - params["ne_type"] = neSoftware.NeType - } - if neSoftware.Name != "" { - params["name"] = neSoftware.Name - } - if neSoftware.Path != "" { - params["path"] = neSoftware.Path - } - if neSoftware.Version != "" { - params["version"] = neSoftware.Version - } - params["description"] = neSoftware.Description - if neSoftware.UpdateBy != "" { - params["update_by"] = neSoftware.UpdateBy - params["update_time"] = time.Now().UnixMilli() - } - - // 构建执行语句 - keys, values := repo.KeyValueByUpdate(params) - sql := "update ne_software set " + strings.Join(keys, ",") + " where id = ?" - - // 执行更新 - values = append(values, neSoftware.ID) - rows, err := datasource.ExecDB("", sql, values) - if err != nil { - logger.Errorf("update row : %v", err.Error()) - return 0 - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(cmdIds []string) int64 { - placeholder := repo.KeyPlaceholderByQuery(len(cmdIds)) - sql := "delete from ne_software where id in (" + placeholder + ")" - parameters := repo.ConvertIdsSlice(cmdIds) - results, err := datasource.ExecDB("", sql, parameters) - if err != nil { - logger.Errorf("delete err => %v", err) - return 0 - } - return results -} diff --git a/src/modules/network_element/service/ne_config.go b/src/modules/network_element/service/ne_config.go index e63c0b51..f607c0ab 100644 --- a/src/modules/network_element/service/ne_config.go +++ b/src/modules/network_element/service/ne_config.go @@ -1,36 +1,163 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "encoding/json" + "fmt" + "strings" -// INeConfig 网元参数配置可用属性值 服务层接口 -type INeConfig interface { - // RefreshByNeType 通过ne_type刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType string) []model.NeConfig + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/redis" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // ClearNeCacheByNeType 清除网元类型参数配置缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeConfigByNeType 查询网元类型参数配置 - SelectNeConfigByNeType(neType string) []model.NeConfig - - // SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 - SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig - - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any - - // SelectList 根据实体查询 - SelectList(param model.NeConfig) []model.NeConfig - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfig - - // Insert 新增信息 - Insert(param model.NeConfig) string - - // Update 修改信息 - Update(param model.NeConfig) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) +// 实例化服务层 NeConfig 结构体 +var NewNeConfig = &NeConfig{ + neConfigRepository: repository.NewNeConfig, +} + +// NeConfig 网元参数配置可用属性值 服务层处理 +type NeConfig struct { + neConfigRepository *repository.NeConfig // 网元参数配置可用属性值表 +} + +// RefreshByNeType 通过ne_type刷新redis中的缓存 +func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { + // 多个 + if neType == "" || neType == "*" { + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) + if len(neConfigList) > 0 { + neConfigGroup := map[string][]model.NeConfig{} + for _, v := range neConfigList { + if item, ok := neConfigGroup[v.NeType]; ok { + neConfigGroup[v.NeType] = append(item, v) + } else { + neConfigGroup[v.NeType] = []model.NeConfig{v} + } + } + for k, v := range neConfigGroup { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) + redis.Del("", key) + if len(v) > 0 { + for i, item := range v { + if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { + continue + } + v[i] = item + } + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } + } + } + return neConfigList + } + // 单个 + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + redis.Del("", key) + neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ + NeType: neType, + }) + if len(neConfigList) > 0 { + for i, v := range neConfigList { + if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { + continue + } + neConfigList[i] = v + } + values, _ := json.Marshal(neConfigList) + redis.Set("", key, string(values)) + } + return neConfigList +} + +// ClearNeCacheByNeType 清除网元类型参数配置缓存 +func (r *NeConfig) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) + if neType == "*" { + key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeConfigByNeType 查询网元类型参数配置 +func (r *NeConfig) SelectNeConfigByNeType(neType string) []model.NeConfig { + var neConfigList []model.NeConfig + key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neConfigList) + if err != nil { + neConfigList = []model.NeConfig{} + } + } else { + neConfigList = r.RefreshByNeTypeAndNeID(neType) + } + return neConfigList +} + +// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 +func (r *NeConfig) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { + neConfigList := r.SelectNeConfigByNeType(neType) + var neConfig model.NeConfig + for _, v := range neConfigList { + if v.ParamName == paramName { + neConfig = v + break + } + } + return neConfig +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfig) SelectPage(query map[string]any) map[string]any { + return r.neConfigRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfig) SelectList(param model.NeConfig) []model.NeConfig { + return r.neConfigRepository.SelectList(param) +} + +// SelectByIds 通过ID查询 +func (r *NeConfig) SelectById(id string) model.NeConfig { + if id == "" { + return model.NeConfig{} + } + neHosts := r.neConfigRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeConfig{} +} + +// Insert 新增信息 +func (r *NeConfig) Insert(param model.NeConfig) string { + return r.neConfigRepository.Insert(param) +} + +// Update 修改信息 +func (r *NeConfig) Update(param model.NeConfig) int64 { + return r.neConfigRepository.Update(param) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfig) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("param.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") } diff --git a/src/modules/network_element/service/ne_config.impl.go b/src/modules/network_element/service/ne_config.impl.go deleted file mode 100644 index 120f5bf4..00000000 --- a/src/modules/network_element/service/ne_config.impl.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "strings" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/redis" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// NewNeConfigImpl 网元参数配置可用属性值 实例化服务层 -var NewNeConfigImpl = &NeConfigImpl{ - neConfigRepository: repository.NewNeConfigImpl, -} - -// NeConfigImpl 网元参数配置可用属性值 服务层处理 -type NeConfigImpl struct { - // 网元参数配置可用属性值表 - neConfigRepository repository.INeConfig -} - -// RefreshByNeType 通过ne_type刷新redis中的缓存 -func (r *NeConfigImpl) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { - // 多个 - if neType == "" || neType == "*" { - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{}) - if len(neConfigList) > 0 { - neConfigGroup := map[string][]model.NeConfig{} - for _, v := range neConfigList { - if item, ok := neConfigGroup[v.NeType]; ok { - neConfigGroup[v.NeType] = append(item, v) - } else { - neConfigGroup[v.NeType] = []model.NeConfig{v} - } - } - for k, v := range neConfigGroup { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(k)) - redis.Del("", key) - if len(v) > 0 { - for i, item := range v { - if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { - continue - } - v[i] = item - } - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - } - } - } - return neConfigList - } - // 单个 - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - redis.Del("", key) - neConfigList := r.neConfigRepository.SelectList(model.NeConfig{ - NeType: neType, - }) - if len(neConfigList) > 0 { - for i, v := range neConfigList { - if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { - continue - } - neConfigList[i] = v - } - values, _ := json.Marshal(neConfigList) - redis.Set("", key, string(values)) - } - return neConfigList -} - -// ClearNeCacheByNeType 清除网元类型参数配置缓存 -func (r *NeConfigImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, neType) - if neType == "*" { - key = fmt.Sprintf("%sNeConfig:*", cachekey.NE_DATA_KEY) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeConfigByNeType 查询网元类型参数配置 -func (r *NeConfigImpl) SelectNeConfigByNeType(neType string) []model.NeConfig { - var neConfigList []model.NeConfig - key := fmt.Sprintf("%sNeConfig:%s", cachekey.NE_DATA_KEY, strings.ToUpper(neType)) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neConfigList) - if err != nil { - neConfigList = []model.NeConfig{} - } - } else { - neConfigList = r.RefreshByNeTypeAndNeID(neType) - } - return neConfigList -} - -// SelectNeConfigByNeTypeAndParamName 查询网元类型参数配置By参数名 -func (r *NeConfigImpl) SelectNeConfigByNeTypeAndParamName(neType, paramName string) model.NeConfig { - neConfigList := r.SelectNeConfigByNeType(neType) - var neConfig model.NeConfig - for _, v := range neConfigList { - if v.ParamName == paramName { - neConfig = v - break - } - } - return neConfig -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigImpl) SelectList(param model.NeConfig) []model.NeConfig { - return r.neConfigRepository.SelectList(param) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigImpl) SelectById(id string) model.NeConfig { - if id == "" { - return model.NeConfig{} - } - neHosts := r.neConfigRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeConfig{} -} - -// Insert 新增信息 -func (r *NeConfigImpl) Insert(param model.NeConfig) string { - return r.neConfigRepository.Insert(param) -} - -// Update 修改信息 -func (r *NeConfigImpl) Update(param model.NeConfig) int64 { - return r.neConfigRepository.Update(param) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("param.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} diff --git a/src/modules/network_element/service/ne_config_backup.go b/src/modules/network_element/service/ne_config_backup.go index 3f8239f6..9c2d6ba8 100644 --- a/src/modules/network_element/service/ne_config_backup.go +++ b/src/modules/network_element/service/ne_config_backup.go @@ -1,30 +1,201 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" + "runtime" + "strings" + "time" -// INeConfigBackup 网元配置文件备份记录 服务层接口 -type INeConfigBackup interface { - // SelectNeHostPage 分页查询列表数据 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(item model.NeConfigBackup) []model.NeConfigBackup - - // SelectByIds 通过ID查询 - SelectById(id string) model.NeConfigBackup - - // Insert 新增信息 - Insert(item model.NeConfigBackup) string - - // Update 修改信息 - Update(item model.NeConfigBackup) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // NeConfigLocalToNe 网元配置文件复制到网元端覆盖 - NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error - - // NeConfigNeToLocal 网元备份文件网元端复制到本地 - NeConfigNeToLocal(neInfo model.NeInfo) (string, error) +// 实例化服务层 NeConfigBackup 结构体 +var NewNeConfigBackup = &NeConfigBackup{ + neConfigBackupRepository: repository.NewNeConfigBackup, +} + +// NeConfigBackup 网元配置文件备份记录 服务层处理 +type NeConfigBackup struct { + neConfigBackupRepository *repository.NeConfigBackup // 网元配置文件备份记录 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeConfigBackup) SelectPage(query map[string]any) map[string]any { + return r.neConfigBackupRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeConfigBackup) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { + return r.neConfigBackupRepository.SelectList(item) +} + +// SelectByIds 通过ID查询 +func (r *NeConfigBackup) SelectById(id string) model.NeConfigBackup { + if id == "" { + return model.NeConfigBackup{} + } + arr := r.neConfigBackupRepository.SelectByIds([]string{id}) + if len(arr) > 0 { + return arr[0] + } + return model.NeConfigBackup{} +} + +// Insert 新增信息 +func (r *NeConfigBackup) Insert(item model.NeConfigBackup) string { + return r.neConfigBackupRepository.Insert(item) +} + +// Update 修改信息 +func (r *NeConfigBackup) Update(item model.NeConfigBackup) int64 { + return r.neConfigBackupRepository.Update(item) +} + +// DeleteByIds 批量删除信息 +func (r *NeConfigBackup) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + data := r.neConfigBackupRepository.SelectByIds(ids) + if len(data) <= 0 { + return 0, fmt.Errorf("neConfigBackup.noData") + } + + if len(data) == len(ids) { + rows := r.neConfigBackupRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 +func (r *NeConfigBackup) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) + if err := file.UnZip(localFile, localDirPath); err != nil { + return fmt.Errorf("unzip err") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + // 网元配置端上的临时目录 + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) + // 复制到网元端 + if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { + return fmt.Errorf("copy config to ne err") + } + + // 配置复制到网元内 + if neTypeLower == "ims" { + // ims目录 + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) + } else { + neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) + chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) + if neTypeLower == "mme" { + chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) + } + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return nil +} + +// NeConfigNeToLocal 网元备份文件网元端复制到本地 +func (r *NeConfigBackup) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.NeType, neInfo.NeId) + if err != nil { + return "", fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) + + // 网元配置文件先复制到临时目录 + sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) + if neTypeLower == "ims" { + // ims目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) + imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} + for _, v := range imsDirArr { + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) + } + // mf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) + // rtproxy目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) + // iwf目录 + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) + } else if neTypeLower == "omc" { + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) + } else { + nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) + if neTypeLower == "mme" { + nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) + } + sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) + } + + // 网元端复制到本地 + if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { + return "", fmt.Errorf("copy config err") + } + + // 压缩zip文件名 + zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) + zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) + if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { + return "", fmt.Errorf("compress zip err") + } + + _ = os.RemoveAll(localDirPath) // 删除本地临时目录 + sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 + return zipFilePath, nil } diff --git a/src/modules/network_element/service/ne_config_backup.impl.go b/src/modules/network_element/service/ne_config_backup.impl.go deleted file mode 100644 index f1eee5cb..00000000 --- a/src/modules/network_element/service/ne_config_backup.impl.go +++ /dev/null @@ -1,202 +0,0 @@ -package service - -import ( - "fmt" - "os" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// NewNeConfigBackupImpl 网元配置文件备份记录 实例化服务层 -var NewNeConfigBackupImpl = &NeConfigBackupImpl{ - neConfigBackupRepository: repository.NewNeConfigBackupImpl, -} - -// NeConfigBackupImpl 网元配置文件备份记录 服务层处理 -type NeConfigBackupImpl struct { - // 网元配置文件备份记录 - neConfigBackupRepository repository.INeConfigBackup -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeConfigBackupImpl) SelectPage(query map[string]any) map[string]any { - return r.neConfigBackupRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeConfigBackupImpl) SelectList(item model.NeConfigBackup) []model.NeConfigBackup { - return r.neConfigBackupRepository.SelectList(item) -} - -// SelectByIds 通过ID查询 -func (r *NeConfigBackupImpl) SelectById(id string) model.NeConfigBackup { - if id == "" { - return model.NeConfigBackup{} - } - arr := r.neConfigBackupRepository.SelectByIds([]string{id}) - if len(arr) > 0 { - return arr[0] - } - return model.NeConfigBackup{} -} - -// Insert 新增信息 -func (r *NeConfigBackupImpl) Insert(item model.NeConfigBackup) string { - return r.neConfigBackupRepository.Insert(item) -} - -// Update 修改信息 -func (r *NeConfigBackupImpl) Update(item model.NeConfigBackup) int64 { - return r.neConfigBackupRepository.Update(item) -} - -// DeleteByIds 批量删除信息 -func (r *NeConfigBackupImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - data := r.neConfigBackupRepository.SelectByIds(ids) - if len(data) <= 0 { - return 0, fmt.Errorf("neConfigBackup.noData") - } - - if len(data) == len(ids) { - rows := r.neConfigBackupRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// NeConfigLocalToNe 网元配置文件复制到网元端覆盖 -func (r *NeConfigBackupImpl) NeConfigLocalToNe(neInfo model.NeInfo, localFile string) error { - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeId) - if err := file.UnZip(localFile, localDirPath); err != nil { - return fmt.Errorf("unzip err") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - // 网元配置端上的临时目录 - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - sshClient.RunCMD(fmt.Sprintf("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) - // 复制到网元端 - if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { - return fmt.Errorf("copy config to ne err") - } - - // 配置复制到网元内 - if neTypeLower == "ims" { - // ims目录 - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/ims && sudo cp -rf %s/ims/%s /usr/local/etc/ims/%v && sudo chmod 755 -R /usr/local/etc/ims/%s", neDirTemp, v, v, v)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/mf && sudo cp -rf %s/mf/* /usr/local/etc/mf && sudo chmod 755 -R /usr/local/etc/mf", neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp)) - } else { - neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower) - chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath) - if neTypeLower == "mme" { - chmodFile = fmt.Sprintf("sudo chmod 755 %s/*.{yaml,conf}", neEtcPath) - } - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/* %s && %s", neDirTemp, neEtcPath, chmodFile)) - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return nil -} - -// NeConfigNeToLocal 网元备份文件网元端复制到本地 -func (r *NeConfigBackupImpl) NeConfigNeToLocal(neInfo model.NeInfo) (string, error) { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_export", omcPath, neTypeLower, neInfo.NeId) - - // 网元配置文件先复制到临时目录 - sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeId) - if neTypeLower == "ims" { - // ims目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/ims", neDirTemp)) - imsDirArr := [...]string{"bgcf", "icscf", "ismc", "mmtel", "mrf", "oam_manager.yaml", "pcscf", "scscf", "vars.cfg", "zlog"} - for _, v := range imsDirArr { - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf /usr/local/etc/ims/%s %s/ims", v, neDirTemp)) - } - // mf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/mf && sudo cp -rf /usr/local/etc/mf %s", neDirTemp, neDirTemp)) - // rtproxy目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp)) - // iwf目录 - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp)) - } else if neTypeLower == "omc" { - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp)) - } else { - nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower) - if neTypeLower == "mme" { - nePath = fmt.Sprintf("/usr/local/etc/%s/*.{yaml,conf}", neTypeLower) - } - sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf %s %s", neDirTemp, nePath, neDirTemp)) - } - - // 网元端复制到本地 - if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirPath); err != nil { - return "", fmt.Errorf("copy config err") - } - - // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeId, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) - zipFilePath := fmt.Sprintf("%s/%s/%s/backup/%s", omcPath, neTypeLower, neInfo.NeId, zipFileName) - if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { - return "", fmt.Errorf("compress zip err") - } - - _ = os.RemoveAll(localDirPath) // 删除本地临时目录 - sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", neDirTemp)) // 删除临时目录 - return zipFilePath, nil -} diff --git a/src/modules/network_element/service/ne_host.go b/src/modules/network_element/service/ne_host.go index 08f54432..c8ee1c29 100644 --- a/src/modules/network_element/service/ne_host.go +++ b/src/modules/network_element/service/ne_host.go @@ -1,30 +1,171 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" -// INeHost 网元主机连接 服务层接口 -type INeHost interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/config" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/crypto" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHost model.NeHost) []model.NeHost - - // SelectById 通过ID查询 - SelectById(hostId string) model.NeHost - - // CheckUniqueHostTitle 校验分组组和主机名称是否唯一 - CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool - - // Insert 新增信息 - Insert(neHost model.NeHost) string - - // Update 修改信息 - Update(neHost model.NeHost) int64 - - // Insert 批量添加 - Inserts(neHosts []model.NeHost) int64 - - // DeleteByIds 批量删除网元主机连接信息 - DeleteByIds(hostIds []string) (int64, error) +// 实例化服务层 NeHost 结构体 +var NewNeHost = &NeHost{ + neHostRepository: repository.NewNeHost, +} + +// NeHost 网元主机连接 服务层处理 +type NeHost struct { + neHostRepository *repository.NeHost // 网元主机连接表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHost) SelectPage(query map[string]any) map[string]any { + return r.neHostRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHost) SelectList(neHost model.NeHost) []model.NeHost { + return r.neHostRepository.SelectList(neHost) +} + +// SelectByIds 通过ID查询 +func (r *NeHost) SelectById(hostId string) model.NeHost { + neHost := model.NeHost{} + if hostId == "" { + return neHost + } + neHosts := r.neHostRepository.SelectByIds([]string{hostId}) + if len(neHosts) > 0 { + neHost := neHosts[0] + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.Password = passwordDe + } + if neHost.PrivateKey != "" { + privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PrivateKey = privateKeyDe + } + if neHost.PassPhrase != "" { + passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("select encrypt: %v", err.Error()) + return neHost + } + neHost.PassPhrase = passPhraseDe + } + return neHost + } + return model.NeHost{} +} + +// Insert 批量添加 +func (r *NeHost) Inserts(neHosts []model.NeHost) int64 { + var num int64 = 0 + for _, v := range neHosts { + hostId := r.neHostRepository.Insert(v) + if hostId != "" { + num += 1 + } + } + return num +} + +// Insert 新增信息 +func (r *NeHost) Insert(neHost model.NeHost) string { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("insert encrypt: %v", err.Error()) + return "" + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Insert(neHost) +} + +// Update 修改信息 +func (r *NeHost) Update(neHost model.NeHost) int64 { + hostKey := config.Get("aes.hostKey").(string) + if neHost.Password != "" { + passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) + if err != nil { + logger.Errorf("update password encrypt: %v", err.Error()) + return 0 + } + neHost.Password = passwordEn + } + if neHost.PrivateKey != "" { + privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) + if err != nil { + logger.Errorf("update private key encrypt: %v", err.Error()) + return 0 + } + neHost.PrivateKey = privateKeyEn + } + if neHost.PassPhrase != "" { + passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) + if err != nil { + logger.Errorf("update pass phrase encrypt: %v", err.Error()) + return 0 + } + neHost.PassPhrase = passPhraseEn + } + return r.neHostRepository.Update(neHost) +} + +// DeleteByIds 批量删除网元主机连接信息 +func (r *NeHost) DeleteByIds(hostIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostRepository.SelectByIds(hostIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHost.noData") + } + + if len(ids) == len(hostIds) { + rows := r.neHostRepository.DeleteByIds(hostIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 +func (r *NeHost) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { + uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ + HostType: hostType, + GroupID: groupId, + Title: title, + }) + if uniqueId == hostId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host.impl.go b/src/modules/network_element/service/ne_host.impl.go deleted file mode 100644 index fa5fee26..00000000 --- a/src/modules/network_element/service/ne_host.impl.go +++ /dev/null @@ -1,172 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/config" - "be.ems/src/framework/logger" - "be.ems/src/framework/utils/crypto" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostImpl 结构体 -var NewNeHostImpl = &NeHostImpl{ - neHostRepository: repository.NewNeHostImpl, -} - -// NeHostImpl 网元主机连接 服务层处理 -type NeHostImpl struct { - // 网元主机连接表 - neHostRepository repository.INeHost -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostImpl) SelectList(neHost model.NeHost) []model.NeHost { - return r.neHostRepository.SelectList(neHost) -} - -// SelectByIds 通过ID查询 -func (r *NeHostImpl) SelectById(hostId string) model.NeHost { - neHost := model.NeHost{} - if hostId == "" { - return neHost - } - neHosts := r.neHostRepository.SelectByIds([]string{hostId}) - if len(neHosts) > 0 { - neHost := neHosts[0] - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordDe, err := crypto.AESDecryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.Password = passwordDe - } - if neHost.PrivateKey != "" { - privateKeyDe, err := crypto.AESDecryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PrivateKey = privateKeyDe - } - if neHost.PassPhrase != "" { - passPhraseDe, err := crypto.AESDecryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("select encrypt: %v", err.Error()) - return neHost - } - neHost.PassPhrase = passPhraseDe - } - return neHost - } - return model.NeHost{} -} - -// Insert 批量添加 -func (r *NeHostImpl) Inserts(neHosts []model.NeHost) int64 { - var num int64 = 0 - for _, v := range neHosts { - hostId := r.neHostRepository.Insert(v) - if hostId != "" { - num += 1 - } - } - return num -} - -// Insert 新增信息 -func (r *NeHostImpl) Insert(neHost model.NeHost) string { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("insert encrypt: %v", err.Error()) - return "" - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Insert(neHost) -} - -// Update 修改信息 -func (r *NeHostImpl) Update(neHost model.NeHost) int64 { - hostKey := config.Get("aes.hostKey").(string) - if neHost.Password != "" { - passwordEn, err := crypto.AESEncryptBase64(neHost.Password, hostKey) - if err != nil { - logger.Errorf("update password encrypt: %v", err.Error()) - return 0 - } - neHost.Password = passwordEn - } - if neHost.PrivateKey != "" { - privateKeyEn, err := crypto.AESEncryptBase64(neHost.PrivateKey, hostKey) - if err != nil { - logger.Errorf("update private key encrypt: %v", err.Error()) - return 0 - } - neHost.PrivateKey = privateKeyEn - } - if neHost.PassPhrase != "" { - passPhraseEn, err := crypto.AESEncryptBase64(neHost.PassPhrase, hostKey) - if err != nil { - logger.Errorf("update pass phrase encrypt: %v", err.Error()) - return 0 - } - neHost.PassPhrase = passPhraseEn - } - return r.neHostRepository.Update(neHost) -} - -// DeleteByIds 批量删除网元主机连接信息 -func (r *NeHostImpl) DeleteByIds(hostIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostRepository.SelectByIds(hostIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHost.noData") - } - - if len(ids) == len(hostIds) { - rows := r.neHostRepository.DeleteByIds(hostIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueHostTitle 校验分组组和主机名称是否唯一 -func (r *NeHostImpl) CheckUniqueHostTitle(groupId, title, hostType, hostId string) bool { - uniqueId := r.neHostRepository.CheckUniqueNeHost(model.NeHost{ - HostType: hostType, - GroupID: groupId, - Title: title, - }) - if uniqueId == hostId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_host_cmd.go b/src/modules/network_element/service/ne_host_cmd.go index eaea5a35..1936848d 100644 --- a/src/modules/network_element/service/ne_host_cmd.go +++ b/src/modules/network_element/service/ne_host_cmd.go @@ -1,27 +1,79 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" -// INeHostCmd 网元主机命令 服务层接口 -type INeHostCmd interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd - - // SelectByIds 通过ID查询 - SelectById(cmdId string) model.NeHostCmd - - // Insert 新增信息 - Insert(neHostCmd model.NeHostCmd) string - - // Update 修改信息 - Update(neHostCmd model.NeHostCmd) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(cmdIds []string) (int64, error) - - // CheckUniqueGroupTitle 校验同类型组内是否唯一 - CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool +// 实例化服务层 NeHostCmd 结构体 +var NewNeHostCmd = &NeHostCmd{ + neHostCmdRepository: repository.NewNeHostCmd, +} + +// NeHostCmd 网元主机命令 服务层处理 +type NeHostCmd struct { + neHostCmdRepository *repository.NeHostCmd // 网元主机命令表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeHostCmd) SelectPage(query map[string]any) map[string]any { + return r.neHostCmdRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeHostCmd) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { + return r.neHostCmdRepository.SelectList(neHostCmd) +} + +// SelectByIds 通过ID查询 +func (r *NeHostCmd) SelectById(cmdId string) model.NeHostCmd { + if cmdId == "" { + return model.NeHostCmd{} + } + neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeHostCmd{} +} + +// Insert 新增信息 +func (r *NeHostCmd) Insert(neHostCmd model.NeHostCmd) string { + return r.neHostCmdRepository.Insert(neHostCmd) +} + +// Update 修改信息 +func (r *NeHostCmd) Update(neHostCmd model.NeHostCmd) int64 { + return r.neHostCmdRepository.Update(neHostCmd) +} + +// DeleteByIds 批量删除信息 +func (r *NeHostCmd) DeleteByIds(cmdIds []string) (int64, error) { + // 检查是否存在 + ids := r.neHostCmdRepository.SelectByIds(cmdIds) + if len(ids) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(ids) == len(cmdIds) { + rows := r.neHostCmdRepository.DeleteByIds(cmdIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueGroupTitle 校验同类型组内是否唯一 +func (r *NeHostCmd) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { + uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ + CmdType: cmdType, + GroupID: groupId, + Title: title, + }) + if uniqueId == cmdId { + return true + } + return uniqueId == "" } diff --git a/src/modules/network_element/service/ne_host_cmd.impl.go b/src/modules/network_element/service/ne_host_cmd.impl.go deleted file mode 100644 index a38c9ba7..00000000 --- a/src/modules/network_element/service/ne_host_cmd.impl.go +++ /dev/null @@ -1,80 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeHostCmdImpl 结构体 -var NewNeHostCmdImpl = &NeHostCmdImpl{ - neHostCmdRepository: repository.NewNeHostCmdImpl, -} - -// NeHostCmdImpl 网元主机命令 服务层处理 -type NeHostCmdImpl struct { - // 网元主机命令表 - neHostCmdRepository repository.INeHostCmd -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeHostCmdImpl) SelectPage(query map[string]any) map[string]any { - return r.neHostCmdRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeHostCmdImpl) SelectList(neHostCmd model.NeHostCmd) []model.NeHostCmd { - return r.neHostCmdRepository.SelectList(neHostCmd) -} - -// SelectByIds 通过ID查询 -func (r *NeHostCmdImpl) SelectById(cmdId string) model.NeHostCmd { - if cmdId == "" { - return model.NeHostCmd{} - } - neHosts := r.neHostCmdRepository.SelectByIds([]string{cmdId}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeHostCmd{} -} - -// Insert 新增信息 -func (r *NeHostCmdImpl) Insert(neHostCmd model.NeHostCmd) string { - return r.neHostCmdRepository.Insert(neHostCmd) -} - -// Update 修改信息 -func (r *NeHostCmdImpl) Update(neHostCmd model.NeHostCmd) int64 { - return r.neHostCmdRepository.Update(neHostCmd) -} - -// DeleteByIds 批量删除信息 -func (r *NeHostCmdImpl) DeleteByIds(cmdIds []string) (int64, error) { - // 检查是否存在 - ids := r.neHostCmdRepository.SelectByIds(cmdIds) - if len(ids) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(ids) == len(cmdIds) { - rows := r.neHostCmdRepository.DeleteByIds(cmdIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueGroupTitle 校验同类型组内是否唯一 -func (r *NeHostCmdImpl) CheckUniqueGroupTitle(groupId, title, cmdType, cmdId string) bool { - uniqueId := r.neHostCmdRepository.CheckUniqueGroupTitle(model.NeHostCmd{ - CmdType: cmdType, - GroupID: groupId, - Title: title, - }) - if uniqueId == cmdId { - return true - } - return uniqueId == "" -} diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 94e08e63..2c70a697 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -1,72 +1,918 @@ package service import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/logger" + "be.ems/src/framework/redis" "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/ssh" + neFetchlink "be.ems/src/modules/network_element/fetch_link" "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" ) -// 网元信息 服务层接口 -type INeInfo interface { - // SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 - SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo - - // RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 - RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo - - // ClearNeCacheByNeType 清除网元类型缓存 - ClearNeCacheByNeType(neType string) bool - - // SelectNeInfoByRmuid 通过rmUID查询网元信息 - SelectNeInfoByRmuid(rmUid string) model.NeInfo - - // SelectPage 根据条件分页查询 - // - // bandStatus 带状态信息 - SelectPage(query map[string]any, bandStatus bool) map[string]any - - // SelectList 查询列表 - // - // bandStatus 带状态信息 - // bandHost 带主机信息 - SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo - - // SelectByIds 通过ID查询 - // - // bandStatus 带主机信息 - SelectById(infoId string, bandHost bool) model.NeInfo - - // Insert 新增信息 - Insert(neInfo model.NeInfo) string - - // Update 修改信息 - Update(neInfo model.NeInfo) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(infoIds []string) (int64, error) - - // CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 - CheckUniqueNeTypeAndNeId(neType, neId, id string) bool - - // NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() - NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) - - // NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 - NeRunSSHCmd(neType, neId, cmd string) (string, error) - - // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() - // num 是网元主机telnet 1:4100 2:5200 - NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) - - // NeConfOAMReadSync 网元OAM配置文件读取 - NeConfOAMReadSync(neType, neId string) (map[string]any, error) - - // NeConfOAMWirteSync 网元OAM配置文件生成并同步 - NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error - - // NeConfPara5GRead 网元公共配置文件读取 - NeConfPara5GRead() (map[string]any, error) - - // NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId - NeConfPara5GWirte(content map[string]any, syncNE []string) error +// 实例化服务层 NeInfo 结构体 +var NewNeInfo = &NeInfo{ + neInfoRepository: repository.NewNeInfo, + Para5GData: map[string]string{}, +} + +// 网元信息 服务层处理 +type NeInfo struct { + // 网元信息数据信息 + neInfoRepository *repository.NeInfo + Para5GData map[string]string +} + +// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 +func (r *NeInfo) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &neInfo) + if err != nil { + neInfo = model.NeInfo{} + } + } else { + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + redis.Del("", key) + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + } + return neInfo +} + +// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 +func (r *NeInfo) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { + var neInfo model.NeInfo + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) + redis.Del("", key) + neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) + if neInfo.ID != "" && neInfo.NeId == neID { + values, _ := json.Marshal(neInfo) + redis.Set("", key, string(values)) + } + return neInfo +} + +// ClearNeCacheByNeType 清除网元类型缓存 +func (r *NeInfo) ClearNeCacheByNeType(neType string) bool { + key := fmt.Sprintf("%s*", cachekey.NE_KEY) + if neType != "*" { + key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) + } + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// SelectNeInfoByRmuid 通过rmUID查询网元信息 +func (r *NeInfo) SelectNeInfoByRmuid(rmUid string) model.NeInfo { + var neInfo model.NeInfo + cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") + if len(cacheKeys) > 0 { + for _, key := range cacheKeys { + var v model.NeInfo + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + json.Unmarshal([]byte(jsonStr), &v) + } + if v.RmUID == rmUid { + neInfo = v + break + } + } + } else { + neInfos := r.SelectList(neInfo, false, false) + for _, v := range neInfos { + key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) + redis.Del("", key) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + if v.RmUID == rmUid { + neInfo = v + } + } + } + return neInfo +} + +// SelectPage 根据条件分页查询 +// +// bandStatus 带状态信息 +func (r *NeInfo) SelectPage(query map[string]any, bandStatus bool) map[string]any { + data := r.neInfoRepository.SelectPage(query) + + // 网元直连读取网元服务状态 + if bandStatus { + rows := data["rows"].([]model.NeInfo) + r.bandNeStatus(&rows) + } + + return data +} + +// SelectList 查询列表 +// +// bandStatus 带状态信息 +// bandHost 带主机信息 +func (r *NeInfo) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { + list := r.neInfoRepository.SelectList(ne) + + // 网元直连读取网元服务状态 + if bandStatus { + r.bandNeStatus(&list) + } + + // 网元主机信息 + if bandHost { + r.bandNeHosts(&list) + } + + return list +} + +// bandNeStatus 网元列表项数据带网元服务状态 +func (r *NeInfo) bandNeStatus(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + result, err := neFetchlink.NeState(v) + if err != nil { + (*arr)[i].ServerState = map[string]any{ + "online": false, + } + // 网元状态设置为离线 + if v.Status != "0" { + v.Status = "0" + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + continue + } + result["online"] = true + (*arr)[i].ServerState = result + // 网元状态设置为在线 + if v.Status != "1" { + // 下发网管配置信息给网元 + _, err = neFetchlink.NeConfigOMC(v) + if err == nil { + v.Status = "1" + } else { + v.Status = "2" + } + (*arr)[i].Status = v.Status + r.neInfoRepository.Update(v) + } + } +} + +// bandNeHosts 网元列表项数据带网元主机信息 +func (r *NeInfo) bandNeHosts(arr *[]model.NeInfo) { + for i := range *arr { + v := (*arr)[i] + if v.HostIDs != "" { + hostIds := strings.Split(v.HostIDs, ",") + if len(hostIds) <= 1 { + continue + } + for _, hostId := range hostIds { + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + continue + } + (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) + } + } + } +} + +// SelectByIds 通过ID查询 +// +// bandHost 带主机信息 +func (r *NeInfo) SelectById(infoId string, bandHost bool) model.NeInfo { + if infoId == "" { + return model.NeInfo{} + } + neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) + if len(neInfos) > 0 { + // 带主机信息 + if neInfos[0].HostIDs != "" && bandHost { + r.bandNeHosts(&neInfos) + } + return neInfos[0] + } + return model.NeInfo{} +} + +// Insert 新增信息 +func (r *NeInfo) Insert(neInfo model.NeInfo) string { + // 主机信息新增 + if neInfo.Hosts != nil { + var hostIDs []string + for _, host := range neInfo.Hosts { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + hostId := NewNeHost.Insert(host) + if hostId != "" { + hostIDs = append(hostIDs, hostId) + } + } + neInfo.HostIDs = strings.Join(hostIDs, ",") + } + + insertId := r.neInfoRepository.Insert(neInfo) + if insertId != "" { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return insertId +} + +// Update 修改信息 +func (r *NeInfo) Update(neInfo model.NeInfo) int64 { + // 主机信息更新 + if neInfo.Hosts != nil { + for _, host := range neInfo.Hosts { + if host.HostID != "" { + host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) + host.GroupID = "1" + NewNeHost.Update(host) + } + } + } + + num := r.neInfoRepository.Update(neInfo) + if num > 0 { + // 刷新缓存 + r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) + } + return num +} + +// DeleteByIds 批量删除信息 +func (r *NeInfo) DeleteByIds(infoIds []string) (int64, error) { + // 检查是否存在 + infos := r.neInfoRepository.SelectByIds(infoIds) + if len(infos) <= 0 { + return 0, fmt.Errorf("neHostCmd.noData") + } + + if len(infos) == len(infoIds) { + for _, v := range infos { + // 主机信息删除 + if v.HostIDs != "" { + NewNeHost.DeleteByIds(strings.Split(v.HostIDs, ",")) + } + // 删除License + neLicense := NewNeLicense.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neLicense.NeId == v.NeId { + NewNeLicense.DeleteByIds([]string{neLicense.ID}) + } + // 删除Version + neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) + if neVersion.NeId == v.NeId { + NewNeVersion.DeleteByIds([]string{neVersion.ID}) + } + // 缓存信息删除 + redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) + } + rows := r.neInfoRepository.DeleteByIds(infoIds) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 +func (r *NeInfo) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { + uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ + NeType: neType, + NeId: neId, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() +func (r *NeInfo) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[0] // 网元主机ssh 0:22 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + if neHost.HostType != "ssh" { + logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) + return nil, fmt.Errorf("neinfo host type not ssh") + } + + var connSSH ssh.ConnSSH + neHost.CopyTo(&connSSH) + var client *ssh.ConnSSH + var err error + if neHost.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } + if err != nil { + logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo ssh client new err") + } + return client, nil +} + +// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 +func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return "", err + } + defer sshClient.Close() + + // 执行命令 + output, err := sshClient.RunCMD(cmd) + if err != nil { + logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) + return "", fmt.Errorf("neinfo ssh run cmd err") + } + return output, nil +} + +// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() +// num 是网元主机telnet 1:4100 2:5200 +func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + + // 创建链接Telnet客户端 + var connTelnet telnet.ConnTelnet + neHost.CopyTo(&connTelnet) + telnetClient, err := connTelnet.NewClient() + if err != nil { + logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo telnet client new err") + } + return telnetClient, nil +} + +// NeConfOAMReadSync 网元OAM配置文件读取 +func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { + oamData, err := r.neConfOAMRead(neType, neId, true) + if err != nil { + return nil, err + } + + // UPF和SMF 全小写的key + if _, ok := oamData["httpmanagecfg"]; ok { + content := map[string]any{} + // 网元HTTP服务 + // if v, ok := oamData["httpmanagecfg"]; ok { + // item := v.(map[string]any) + // } + // 对网管HTTP配置 + if v, ok := oamData["oamconfig"]; ok { + item := v.(map[string]any) + if v, ok := item["iptype"]; ok && v != "" && v != nil { + ipType := v.(string) + if ipType == "ipv6" { + content["omcIP"] = item["ipv6"] + } + if ipType == "ipv4" { + content["omcIP"] = item["ipv4"] + } + } + content["oamEnable"] = item["enable"] + content["oamPort"] = item["port"] + } + // 对网管SNMP配置 + if v, ok := oamData["snmpconfig"]; ok { + item := v.(map[string]any) + content["snmpEnable"] = item["enable"] + content["snmpPort"] = item["port"] + } + // 对网管KPI上报配置 + if v, ok := oamData["kpiconfig"]; ok { + item := v.(map[string]any) + content["kpiEnable"] = item["enable"] + content["kpiTimer"] = item["timer"] + } + + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + r.NeConfOAMWirteSync(model.NeInfo{ + NeType: neType, + NeId: neId, + }, content, false) + return r.neConfOAMRead(neType, neId, false) + } + + // NSSF和MME 配置KPIconfig名不一致时 + if v, ok := oamData["KPIconfig"]; ok && v != nil { + item := v.(map[string]any) + oamData["kpiConfig"] = item + delete(oamData, "KPIconfig") + r.neConfOAMWirte(neType, neId, oamData, false) + } + + return oamData, nil +} + +// neConfOAMData 网元OAM配置文件默认格式数据 +func (r *NeInfo) neConfOAMData() map[string]any { + return map[string]any{ + "httpManageCfg": map[string]any{ + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + }, + "oamConfig": map[string]any{ + "enable": true, + "ipType": "ipv4", + "ipv4": "172.16.5.100", // 必改 + "ipv6": "", + "port": 33030, + "scheme": "http", + // 必改 + "neConfig": map[string]any{ + "neId": "001", + "rmUid": "4400HX1XXX001", + "neName": "XXX_001", + "dn": "-", + "vendorName": "GD", + "province": "-", + "pvFlag": "PNF", + }, + }, + "snmpConfig": map[string]any{ + "enable": false, + "ipType": "ipv4", + "ipv4": "172.16.5.1", // 必改 + "ipv6": "", + "port": 4957, + }, + "kpiConfig": map[string]any{ + "enable": true, + "timer": 60, // 必改 + }, + // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 + } +} + +// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 +func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + + // 从网元端同步到本地 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return nil, fmt.Errorf("ne info ssh client err") + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return nil, fmt.Errorf("ne info sftp client err") + } + defer sftpClient.Close() + // 网元端文件路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) + // 网元端复制到本地 + if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { + return nil, fmt.Errorf("copy oam config err") + } + } + + // 读取文件内容 + bytes, err := os.ReadFile(localFilePath) + if err != nil { + // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) + // return nil, fmt.Errorf("read file error") + // 无保留文件时返回默认文件数据 + oamData := r.neConfOAMData() + r.neConfOAMWirte(neType, neId, oamData, false) + return oamData, nil + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 +func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { + neTypeLower := strings.ToLower(neType) + fileName := "oam_manager.yaml" + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_config" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) + + // 写入文件 + if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if sync { + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neType, neId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) + // 复制到网元进行覆盖 + if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + } + + return nil +} + +// NeConfOAMWirteSync 网元OAM配置文件生成并同步 +func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { + oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) + 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["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["neConfig"] = map[string]string{ + "neId": neInfo.NeId, + "rmUid": neInfo.RmUID, + "neName": neInfo.NeName, + "dn": neInfo.Dn, + "vendorName": neInfo.VendorName, + "province": neInfo.Province, + "pvFlag": neInfo.PvFlag, + } + + // 公共参数指定的OMC + 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 v, ok := content["omcIP"]; ok && v != "" && v != nil { + omcIP := v.(string) + 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) + 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) + if neInfo.NeType == "UPF" { + item["timer"] = 5 + } else { + item["timer"] = 60 + } + + 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 := r.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { + return fmt.Errorf("error wirte OAM file info") + } + return nil +} + +// NeConfPara5GRead 网元公共配置文件读取 +func (r *NeInfo) NeConfPara5GRead() (map[string]any, error) { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + // 读取文件内容 + bytes, err := os.ReadFile(omcFilePath) + if err != nil { + logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) + return nil, fmt.Errorf("read file error") + } + content := string(bytes) + + // 序列化Map + mapData, err := parse.ConvertConfigToMap("yaml", content) + if err != nil { + logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) + return nil, fmt.Errorf("content convert type error") + } + return mapData, nil +} + +// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId +func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { + // 网管本地路径 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + + if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { + return fmt.Errorf("please check if the file exists or write permissions") + } + + // 同步到网元端 + if len(syncNE) > 0 { + errMsg := []string{} + for _, neTI := range syncNE { + ti := strings.SplitN(neTI, "@", 2) + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + continue + } + defer sftpClient.Close() + + // 网元端配置路径 + neFilePath := "/usr/local/etc/conf/para5G.yaml" + neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %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)) + continue + } + } + if len(errMsg) > 0 { + return fmt.Errorf("%s", strings.Join(errMsg, "\r\n")) + } + } + + // 转换一份数据到全局 + r.Para5GData = r.neConfPara5GDataConvert(content) + return nil +} + +// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 +func (r *NeInfo) neConfPara5GDataConvert(content map[string]any) map[string]string { + defer func() { + if err := recover(); err != nil { + logger.Errorf("NeConfPara5GDataConvert panic: %v", err) + // 文件异常就删除配置 + omcFilePath := "/usr/local/etc/omc/para5G.yaml" + if runtime.GOOS == "windows" { + omcFilePath = fmt.Sprintf("C:%s", omcFilePath) + } + os.Remove(omcFilePath) + } + }() + + basic := content["basic"].(map[string]any) + external := content["external"].(map[string]any) + sbi := content["sbi"].(map[string]any) + + mcc := "460" + mnc := "01" + mncDomain := "001" + if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { + mcc = plmnId["mcc"].(string) + mnc = plmnId["mnc"].(string) + // If a user input two digit MNC, add a leading zero + if len(mnc) == 2 { + mncDomain = fmt.Sprintf("0%s", mnc) + } else { + mncDomain = mnc + } + } + + sst := "1" + sd := "000001" + if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { + sst = plmnId["sst"].(string) + sd = plmnId["sd"].(string) + } + + n3IPAmdMask := external["upfn3_ip"].(string) + n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) + n3IP := n3Arr[0] + n3Mask := "255.255.255.0" + if len(n3Arr) > 1 { + n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) + } + + n6IPAmdMask := external["upfn6_ip"].(string) + n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) + n6IP := n6Arr[0] + n6Mask := "255.255.255.0" + if len(n6Arr) > 1 { + n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) + } + + ueIPAmdMask := external["ue_pool"].(string) + ueArr := strings.SplitN(ueIPAmdMask, "/", 2) + ueIP := ueArr[0] + ueCicr := "24" + ueMask := "255.255.255.0" + if len(ueArr) > 1 { + ueCicr = ueArr[1] + ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) + } + + return map[string]string{ + // basic + "TAC": basic["tac"].(string), + "MCC": mcc, + "MNC": mnc, + "MNC_DOMAIN": mncDomain, + "SST": sst, + "SD": sd, + "DNN_DATA": basic["dnn_data"].(string), + "DNN_IMS": basic["dnn_ims"].(string), + + // external + "N2_IP": external["amfn2_ip"].(string), + "UE_POOL": external["ue_pool"].(string), + "UE_IP": ueIP, + "UE_MASK": ueMask, + "UE_CIDR": ueCicr, + "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF + "N3_IP": n3IP, + "N3_MASK": n3Mask, + "N3_GW": external["upfn3_gw"].(string), + "N3_PCI": external["upfn3_pci"].(string), + "N3_MAC": external["upfn3_mac"].(string), + "N6_IP": n6IP, + "N6_MASK": n6Mask, + "N6_GW": external["upfn6_gw"].(string), + "N6_PCI": external["upfn6_pci"].(string), + "N6_MAC": external["upfn6_mac"].(string), + + "SIP_IP": external["ims_sip_ip"].(string), + + "S1_MMEIP": external["mmes1_ip"].(string), + "S11_MMEIP": external["mmes11_ip"].(string), + "S10_MMEIP": external["mmes10_ip"].(string), + + // sbi + "OMC_IP": sbi["omc_ip"].(string), + "IMS_IP": sbi["ims_ip"].(string), + "AMF_IP": sbi["amf_ip"].(string), + "AUSF_IP": sbi["ausf_ip"].(string), + "UDM_IP": sbi["udm_ip"].(string), + "SMF_IP": sbi["smf_ip"].(string), + "PCF_IP": sbi["pcf_ip"].(string), + "NSSF_IP": sbi["nssf_ip"].(string), + "NRF_IP": sbi["nrf_ip"].(string), + "UPF_IP": sbi["upf_ip"].(string), + "LMF_IP": sbi["lmf_ip"].(string), + "NEF_IP": sbi["nef_ip"].(string), + "MME_IP": sbi["mme_ip"].(string), + "N3IWF_IP": sbi["n3iwf_ip"].(string), + "SMSC_IP": sbi["smsc_ip"].(string), + + "DB_IP": sbi["db_ip"].(string), + } } diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go deleted file mode 100644 index 9a12e47c..00000000 --- a/src/modules/network_element/service/ne_info.impl.go +++ /dev/null @@ -1,918 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/logger" - "be.ems/src/framework/redis" - "be.ems/src/framework/telnet" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/utils/ssh" - neFetchlink "be.ems/src/modules/network_element/fetch_link" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeInfoImpl 结构体 -var NewNeInfoImpl = &NeInfoImpl{ - neInfoRepository: repository.NewNeInfoImpl, - Para5GData: map[string]string{}, -} - -// 网元信息 服务层处理 -type NeInfoImpl struct { - // 网元信息数据信息 - neInfoRepository repository.INeInfo - Para5GData map[string]string -} - -// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neInfo) - if err != nil { - neInfo = model.NeInfo{} - } - } else { - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - redis.Del("", key) - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - } - return neInfo -} - -// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存 -func (r *NeInfoImpl) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(neType), neID) - redis.Del("", key) - neInfo = r.neInfoRepository.SelectNeInfoByNeTypeAndNeID(neType, neID) - if neInfo.ID != "" && neInfo.NeId == neID { - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values)) - } - return neInfo -} - -// ClearNeCacheByNeType 清除网元类型缓存 -func (r *NeInfoImpl) ClearNeCacheByNeType(neType string) bool { - key := fmt.Sprintf("%s*", cachekey.NE_KEY) - if neType != "*" { - key = fmt.Sprintf("%s%s*", cachekey.NE_KEY, neType) - } - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// SelectNeInfoByRmuid 通过rmUID查询网元信息 -func (r *NeInfoImpl) SelectNeInfoByRmuid(rmUid string) model.NeInfo { - var neInfo model.NeInfo - cacheKeys, _ := redis.GetKeys("", cachekey.NE_KEY+"*") - if len(cacheKeys) > 0 { - for _, key := range cacheKeys { - var v model.NeInfo - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - json.Unmarshal([]byte(jsonStr), &v) - } - if v.RmUID == rmUid { - neInfo = v - break - } - } - } else { - neInfos := r.SelectList(neInfo, false, false) - for _, v := range neInfos { - key := fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, strings.ToUpper(v.NeType), v.NeId) - redis.Del("", key) - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - if v.RmUID == rmUid { - neInfo = v - } - } - } - return neInfo -} - -// SelectPage 根据条件分页查询 -// -// bandStatus 带状态信息 -func (r *NeInfoImpl) SelectPage(query map[string]any, bandStatus bool) map[string]any { - data := r.neInfoRepository.SelectPage(query) - - // 网元直连读取网元服务状态 - if bandStatus { - rows := data["rows"].([]model.NeInfo) - r.bandNeStatus(&rows) - } - - return data -} - -// SelectList 查询列表 -// -// bandStatus 带状态信息 -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectList(ne model.NeInfo, bandStatus bool, bandHost bool) []model.NeInfo { - list := r.neInfoRepository.SelectList(ne) - - // 网元直连读取网元服务状态 - if bandStatus { - r.bandNeStatus(&list) - } - - // 网元主机信息 - if bandHost { - r.bandNeHosts(&list) - } - - return list -} - -// bandNeStatus 网元列表项数据带网元服务状态 -func (r *NeInfoImpl) bandNeStatus(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - result, err := neFetchlink.NeState(v) - if err != nil { - (*arr)[i].ServerState = map[string]any{ - "online": false, - } - // 网元状态设置为离线 - if v.Status != "0" { - v.Status = "0" - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - continue - } - result["online"] = true - (*arr)[i].ServerState = result - // 网元状态设置为在线 - if v.Status != "1" { - // 下发网管配置信息给网元 - _, err = neFetchlink.NeConfigOMC(v) - if err == nil { - v.Status = "1" - } else { - v.Status = "2" - } - (*arr)[i].Status = v.Status - r.neInfoRepository.Update(v) - } - } -} - -// bandNeHosts 网元列表项数据带网元主机信息 -func (r *NeInfoImpl) bandNeHosts(arr *[]model.NeInfo) { - for i := range *arr { - v := (*arr)[i] - if v.HostIDs != "" { - hostIds := strings.Split(v.HostIDs, ",") - if len(hostIds) <= 1 { - continue - } - for _, hostId := range hostIds { - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - continue - } - (*arr)[i].Hosts = append((*arr)[i].Hosts, neHost) - } - } - } -} - -// SelectByIds 通过ID查询 -// -// bandHost 带主机信息 -func (r *NeInfoImpl) SelectById(infoId string, bandHost bool) model.NeInfo { - if infoId == "" { - return model.NeInfo{} - } - neInfos := r.neInfoRepository.SelectByIds([]string{infoId}) - if len(neInfos) > 0 { - // 带主机信息 - if neInfos[0].HostIDs != "" && bandHost { - r.bandNeHosts(&neInfos) - } - return neInfos[0] - } - return model.NeInfo{} -} - -// Insert 新增信息 -func (r *NeInfoImpl) Insert(neInfo model.NeInfo) string { - // 主机信息新增 - if neInfo.Hosts != nil { - var hostIDs []string - for _, host := range neInfo.Hosts { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - hostId := NewNeHostImpl.Insert(host) - if hostId != "" { - hostIDs = append(hostIDs, hostId) - } - } - neInfo.HostIDs = strings.Join(hostIDs, ",") - } - - insertId := r.neInfoRepository.Insert(neInfo) - if insertId != "" { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return insertId -} - -// Update 修改信息 -func (r *NeInfoImpl) Update(neInfo model.NeInfo) int64 { - // 主机信息更新 - if neInfo.Hosts != nil { - for _, host := range neInfo.Hosts { - if host.HostID != "" { - host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) - host.GroupID = "1" - NewNeHostImpl.Update(host) - } - } - } - - num := r.neInfoRepository.Update(neInfo) - if num > 0 { - // 刷新缓存 - r.RefreshByNeTypeAndNeID(neInfo.NeType, neInfo.NeId) - } - return num -} - -// DeleteByIds 批量删除信息 -func (r *NeInfoImpl) DeleteByIds(infoIds []string) (int64, error) { - // 检查是否存在 - infos := r.neInfoRepository.SelectByIds(infoIds) - if len(infos) <= 0 { - return 0, fmt.Errorf("neHostCmd.noData") - } - - if len(infos) == len(infoIds) { - for _, v := range infos { - // 主机信息删除 - if v.HostIDs != "" { - NewNeHostImpl.DeleteByIds(strings.Split(v.HostIDs, ",")) - } - // 删除License - neLicense := NewNeLicenseImpl.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neLicense.NeId == v.NeId { - NewNeLicenseImpl.DeleteByIds([]string{neLicense.ID}) - } - // 删除Version - neVersion := NewNeVersion.SelectByNeTypeAndNeID(v.NeType, v.NeId) - if neVersion.NeId == v.NeId { - NewNeVersion.DeleteByIds([]string{neVersion.ID}) - } - // 缓存信息删除 - redis.Del("", fmt.Sprintf("%s%s:%s", cachekey.NE_KEY, v.NeType, v.NeId)) - } - rows := r.neInfoRepository.DeleteByIds(infoIds) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueNeTypeAndNeId 校验同类型下标识是否唯一 -func (r *NeInfoImpl) CheckUniqueNeTypeAndNeId(neType, neId, id string) bool { - uniqueId := r.neInfoRepository.CheckUniqueNeTypeAndNeId(model.NeInfo{ - NeType: neType, - NeId: neId, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() -func (r *NeInfoImpl) NeRunSSHClient(neType, neId string) (*ssh.ConnSSH, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunSSHClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[0] // 网元主机ssh 0:22 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - if neHost.HostType != "ssh" { - logger.Errorf("NeRunSSHClient Hosts first HostType %s not ssh", neHost.HostType) - return nil, fmt.Errorf("neinfo host type not ssh") - } - - var connSSH ssh.ConnSSH - neHost.CopyTo(&connSSH) - var client *ssh.ConnSSH - var err error - if neHost.AuthMode == "2" { - client, err = connSSH.NewClientByLocalPrivate() - } else { - client, err = connSSH.NewClient() - } - if err != nil { - logger.Errorf("NeRunSSHClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo ssh client new err") - } - return client, nil -} - -// NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 -func (r *NeInfoImpl) NeRunSSHCmd(neType, neId, cmd string) (string, error) { - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return "", err - } - defer sshClient.Close() - - // 执行命令 - output, err := sshClient.RunCMD(cmd) - if err != nil { - logger.Errorf("NeRunSSHCmd RunCMD %s err => %s", output, err.Error()) - return "", fmt.Errorf("neinfo ssh run cmd err") - } - return output, nil -} - -// NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() -// num 是网元主机telnet 1:4100 2:5200 -func (r *NeInfoImpl) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { - neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s not found", neType, neId) - return nil, fmt.Errorf("neinfo not found") - } - // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunTelnetClient NeType:%s NeID:%s hostId not found", neType, neId) - return nil, fmt.Errorf("neinfo hostId not found") - } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host id not found") - } - hostId := hostIds[num] // 网元主机telnet 1:4100 2:5200 - neHost := NewNeHostImpl.SelectById(hostId) - if neHost.HostID == "" || neHost.HostID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) - return nil, fmt.Errorf("neinfo host not found") - } - - // 创建链接Telnet客户端 - var connTelnet telnet.ConnTelnet - neHost.CopyTo(&connTelnet) - telnetClient, err := connTelnet.NewClient() - if err != nil { - logger.Errorf("NeRunTelnetClient NewClient err => %s", err.Error()) - return nil, fmt.Errorf("neinfo telnet client new err") - } - return telnetClient, nil -} - -// NeConfOAMReadSync 网元OAM配置文件读取 -func (r *NeInfoImpl) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { - oamData, err := r.neConfOAMRead(neType, neId, true) - if err != nil { - return nil, err - } - - // UPF和SMF 全小写的key - if _, ok := oamData["httpmanagecfg"]; ok { - content := map[string]any{} - // 网元HTTP服务 - // if v, ok := oamData["httpmanagecfg"]; ok { - // item := v.(map[string]any) - // } - // 对网管HTTP配置 - if v, ok := oamData["oamconfig"]; ok { - item := v.(map[string]any) - if v, ok := item["iptype"]; ok && v != "" && v != nil { - ipType := v.(string) - if ipType == "ipv6" { - content["omcIP"] = item["ipv6"] - } - if ipType == "ipv4" { - content["omcIP"] = item["ipv4"] - } - } - content["oamEnable"] = item["enable"] - content["oamPort"] = item["port"] - } - // 对网管SNMP配置 - if v, ok := oamData["snmpconfig"]; ok { - item := v.(map[string]any) - content["snmpEnable"] = item["enable"] - content["snmpPort"] = item["port"] - } - // 对网管KPI上报配置 - if v, ok := oamData["kpiconfig"]; ok { - item := v.(map[string]any) - content["kpiEnable"] = item["enable"] - content["kpiTimer"] = item["timer"] - } - - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - r.NeConfOAMWirteSync(model.NeInfo{ - NeType: neType, - NeId: neId, - }, content, false) - return r.neConfOAMRead(neType, neId, false) - } - - // NSSF和MME 配置KPIconfig名不一致时 - if v, ok := oamData["KPIconfig"]; ok && v != nil { - item := v.(map[string]any) - oamData["kpiConfig"] = item - delete(oamData, "KPIconfig") - r.neConfOAMWirte(neType, neId, oamData, false) - } - - return oamData, nil -} - -// neConfOAMData 网元OAM配置文件默认格式数据 -func (r *NeInfoImpl) neConfOAMData() map[string]any { - return map[string]any{ - "httpManageCfg": map[string]any{ - "ipType": "ipv4", - "ipv4": "172.16.5.1", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - }, - "oamConfig": map[string]any{ - "enable": true, - "ipType": "ipv4", - "ipv4": "172.16.5.100", // 必改 - "ipv6": "", - "port": 33030, - "scheme": "http", - // 必改 - "neConfig": map[string]any{ - "neId": "001", - "rmUid": "4400HX1XXX001", - "neName": "XXX_001", - "dn": "-", - "vendorName": "GD", - "province": "-", - "pvFlag": "PNF", - }, - }, - "snmpConfig": map[string]any{ - "enable": false, - "ipType": "ipv4", - "ipv4": "172.16.5.1", // 必改 - "ipv6": "", - "port": 4957, - }, - "kpiConfig": map[string]any{ - "enable": true, - "timer": 60, // 必改 - }, - // "pubConfigPath": "/usr/local/etc/conf/para5G.yaml", // 网元只会读一次后续会置空,建议不放 - } -} - -// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 -func (r *NeInfoImpl) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) - if runtime.GOOS == "windows" { - localFilePath = fmt.Sprintf("C:%s", localFilePath) - } - - // 从网元端同步到本地 - if sync { - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neType, neId) - if err != nil { - return nil, fmt.Errorf("ne info ssh client err") - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return nil, fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - // 网元端文件路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo touch %s && sudo chmod o+rw %s", neFilePath, neFilePath)) - // 网元端复制到本地 - if err = sftpClient.CopyFileRemoteToLocal(neFilePath, localFilePath); err != nil { - return nil, fmt.Errorf("copy oam config err") - } - } - - // 读取文件内容 - bytes, err := os.ReadFile(localFilePath) - if err != nil { - // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) - // return nil, fmt.Errorf("read file error") - // 无保留文件时返回默认文件数据 - oamData := r.neConfOAMData() - r.neConfOAMWirte(neType, neId, oamData, false) - return oamData, nil - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfOAMRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 -func (r *NeInfoImpl) neConfOAMWirte(neType, neId string, content any, sync bool) error { - neTypeLower := strings.ToLower(neType) - fileName := "oam_manager.yaml" - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_config" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neId, fileName) - - // 写入文件 - if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if sync { - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(neType, neId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := fmt.Sprintf("/usr/local/etc/%s/%s", neTypeLower, fileName) - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) - // 复制到网元进行覆盖 - if err = sftpClient.CopyFileLocalToRemote(localFilePath, neFilePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - } - - return nil -} - -// NeConfOAMWirteSync 网元OAM配置文件生成并同步 -func (r *NeInfoImpl) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { - oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) - 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["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["neConfig"] = map[string]string{ - "neId": neInfo.NeId, - "rmUid": neInfo.RmUID, - "neName": neInfo.NeName, - "dn": neInfo.Dn, - "vendorName": neInfo.VendorName, - "province": neInfo.Province, - "pvFlag": neInfo.PvFlag, - } - - // 公共参数指定的OMC - 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 v, ok := content["omcIP"]; ok && v != "" && v != nil { - omcIP := v.(string) - 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) - 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) - if neInfo.NeType == "UPF" { - item["timer"] = 5 - } else { - item["timer"] = 60 - } - - 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 { - return fmt.Errorf("error wirte OAM file info") - } - return nil -} - -// NeConfPara5GRead 网元公共配置文件读取 -func (r *NeInfoImpl) NeConfPara5GRead() (map[string]any, error) { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - // 读取文件内容 - bytes, err := os.ReadFile(omcFilePath) - if err != nil { - logger.Warnf("NeConfPara5GRead ReadFile => %s", err.Error()) - return nil, fmt.Errorf("read file error") - } - content := string(bytes) - - // 序列化Map - mapData, err := parse.ConvertConfigToMap("yaml", content) - if err != nil { - logger.Warnf("NeConfPara5GRead ConvertConfigToMap => %s", err.Error()) - return nil, fmt.Errorf("content convert type error") - } - return mapData, nil -} - -// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId -func (r *NeInfoImpl) NeConfPara5GWirte(content map[string]any, syncNE []string) error { - // 网管本地路径 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - - if err := parse.ConvertConfigToFile("yaml", omcFilePath, content); err != nil { - return fmt.Errorf("please check if the file exists or write permissions") - } - - // 同步到网元端 - if len(syncNE) > 0 { - errMsg := []string{} - for _, neTI := range syncNE { - ti := strings.SplitN(neTI, "@", 2) - // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) - continue - } - defer sftpClient.Close() - - // 网元端配置路径 - neFilePath := "/usr/local/etc/conf/para5G.yaml" - neFileDir := filepath.ToSlash(filepath.Dir(neFilePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %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)) - continue - } - } - if len(errMsg) > 0 { - return fmt.Errorf(strings.Join(errMsg, "\r\n")) - } - } - - // 转换一份数据到全局 - r.Para5GData = r.neConfPara5GDataConvert(content) - return nil -} - -// NeConfPara5GConvert 网元公共配置数据转化 content网元公共配置文件读取内容 -func (r *NeInfoImpl) neConfPara5GDataConvert(content map[string]any) map[string]string { - defer func() { - if err := recover(); err != nil { - logger.Errorf("NeConfPara5GDataConvert panic: %v", err) - // 文件异常就删除配置 - omcFilePath := "/usr/local/etc/omc/para5G.yaml" - if runtime.GOOS == "windows" { - omcFilePath = fmt.Sprintf("C:%s", omcFilePath) - } - os.Remove(omcFilePath) - } - }() - - basic := content["basic"].(map[string]any) - external := content["external"].(map[string]any) - sbi := content["sbi"].(map[string]any) - - mcc := "460" - mnc := "01" - mncDomain := "001" - if plmnId, plmnIdOk := basic["plmnId"].(map[string]any); plmnIdOk { - mcc = plmnId["mcc"].(string) - mnc = plmnId["mnc"].(string) - // If a user input two digit MNC, add a leading zero - if len(mnc) == 2 { - mncDomain = fmt.Sprintf("0%s", mnc) - } else { - mncDomain = mnc - } - } - - sst := "1" - sd := "000001" - if plmnId, plmnIdOk := basic["snssai"].(map[string]any); plmnIdOk { - sst = plmnId["sst"].(string) - sd = plmnId["sd"].(string) - } - - n3IPAmdMask := external["upfn3_ip"].(string) - n3Arr := strings.SplitN(n3IPAmdMask, "/", 2) - n3IP := n3Arr[0] - n3Mask := "255.255.255.0" - if len(n3Arr) > 1 { - n3Mask = parse.ConvertIPMask(parse.Number(n3Arr[1])) - } - - n6IPAmdMask := external["upfn6_ip"].(string) - n6Arr := strings.SplitN(n6IPAmdMask, "/", 2) - n6IP := n6Arr[0] - n6Mask := "255.255.255.0" - if len(n6Arr) > 1 { - n6Mask = parse.ConvertIPMask(parse.Number(n6Arr[1])) - } - - ueIPAmdMask := external["ue_pool"].(string) - ueArr := strings.SplitN(ueIPAmdMask, "/", 2) - ueIP := ueArr[0] - ueCicr := "24" - ueMask := "255.255.255.0" - if len(ueArr) > 1 { - ueCicr = ueArr[1] - ueMask = parse.ConvertIPMask(parse.Number(ueArr[1])) - } - - return map[string]string{ - // basic - "TAC": basic["tac"].(string), - "MCC": mcc, - "MNC": mnc, - "MNC_DOMAIN": mncDomain, - "SST": sst, - "SD": sd, - "DNN_DATA": basic["dnn_data"].(string), - "DNN_IMS": basic["dnn_ims"].(string), - - // external - "N2_IP": external["amfn2_ip"].(string), - "UE_POOL": external["ue_pool"].(string), - "UE_IP": ueIP, - "UE_MASK": ueMask, - "UE_CIDR": ueCicr, - "UPF_TYPE": external["upf_type"].(string), // StandardUPF LightUPF - "N3_IP": n3IP, - "N3_MASK": n3Mask, - "N3_GW": external["upfn3_gw"].(string), - "N3_PCI": external["upfn3_pci"].(string), - "N3_MAC": external["upfn3_mac"].(string), - "N6_IP": n6IP, - "N6_MASK": n6Mask, - "N6_GW": external["upfn6_gw"].(string), - "N6_PCI": external["upfn6_pci"].(string), - "N6_MAC": external["upfn6_mac"].(string), - - "SIP_IP": external["ims_sip_ip"].(string), - - "S1_MMEIP": external["mmes1_ip"].(string), - "S11_MMEIP": external["mmes11_ip"].(string), - "S10_MMEIP": external["mmes10_ip"].(string), - - // sbi - "OMC_IP": sbi["omc_ip"].(string), - "IMS_IP": sbi["ims_ip"].(string), - "AMF_IP": sbi["amf_ip"].(string), - "AUSF_IP": sbi["ausf_ip"].(string), - "UDM_IP": sbi["udm_ip"].(string), - "SMF_IP": sbi["smf_ip"].(string), - "PCF_IP": sbi["pcf_ip"].(string), - "NSSF_IP": sbi["nssf_ip"].(string), - "NRF_IP": sbi["nrf_ip"].(string), - "UPF_IP": sbi["upf_ip"].(string), - "LMF_IP": sbi["lmf_ip"].(string), - "NEF_IP": sbi["nef_ip"].(string), - "MME_IP": sbi["mme_ip"].(string), - "N3IWF_IP": sbi["n3iwf_ip"].(string), - "SMSC_IP": sbi["smsc_ip"].(string), - - "DB_IP": sbi["db_ip"].(string), - } -} diff --git a/src/modules/network_element/service/ne_license.go b/src/modules/network_element/service/ne_license.go index ace554d1..fa84b155 100644 --- a/src/modules/network_element/service/ne_license.go +++ b/src/modules/network_element/service/ne_license.go @@ -1,34 +1,190 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "time" -// INeLicense 网元授权激活信息 服务层接口 -type INeLicense interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neLicense model.NeLicense) []model.NeLicense - - // SelectById 通过ID查询 - SelectById(id string) model.NeLicense - - // Insert 新增信息 - Insert(neLicense model.NeLicense) string - - // Update 修改信息 - Update(neLicense model.NeLicense) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 - SelectByNeTypeAndNeID(neType, neId string) model.NeLicense - - // ReadLicenseInfo 读取授权文件信息 - // 返回激活申请码, 激活文件 - ReadLicenseInfo(neLicense model.NeLicense) (string, string) - - // UploadLicense 授权文件上传到网元主机 - UploadLicense(neLicense model.NeLicense) error +// 实例化服务层 NeLicense 结构体 +var NewNeLicense = &NeLicense{ + neLicenseRepository: repository.NewNeLicense, +} + +// NeLicense 网元授权激活信息 服务层处理 +type NeLicense struct { + neLicenseRepository *repository.NeLicense // 网元授权激活信息表 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeLicense) SelectPage(query map[string]any) map[string]any { + return r.neLicenseRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeLicense) SelectList(neLicense model.NeLicense) []model.NeLicense { + return r.neLicenseRepository.SelectList(neLicense) +} + +// SelectByIds 通过ID查询 +func (r *NeLicense) SelectById(id string) model.NeLicense { + if id == "" { + return model.NeLicense{} + } + neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// Insert 新增信息 +func (r *NeLicense) Insert(neLicense model.NeLicense) string { + return r.neLicenseRepository.Insert(neLicense) +} + +// Update 修改信息 +func (r *NeLicense) Update(neLicense model.NeLicense) int64 { + return r.neLicenseRepository.Update(neLicense) +} + +// DeleteByIds 批量删除信息 +func (r *NeLicense) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rowIds := r.neLicenseRepository.SelectByIds(ids) + if len(rowIds) <= 0 { + return 0, fmt.Errorf("neLicense.noData") + } + + if len(rowIds) == len(ids) { + rows := r.neLicenseRepository.DeleteByIds(ids) + return rows, nil + } + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// SelectByTypeAndID 通过网元类型和网元ID查询 +func (r *NeLicense) SelectByTypeAndID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 +func (r *NeLicense) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { + neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ + NeType: neType, + NeId: neId, + }) + if len(neLicenses) > 0 { + return neLicenses[0] + } + return model.NeLicense{} +} + +// ReadLicenseInfo 读取授权文件信息 +// 返回激活申请码, 激活文件 +func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { + neTypeLower := strings.ToLower(neLicense.NeType) + // 网管本地路径 + omcPath := "/usr/local/etc/omc/ne_license" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) + // 网元端授权文件路径 + nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return "", "" + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", "" + } + defer sftpClient.Close() + + // 复制授权申请码到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { + return "", "" + } + // 读取文件内容 + bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") + if err != nil { + return "", "" + } + + // 复制激活文件到本地 + licensePath := "" + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { + licensePath = omcPath + "/system.ini" + } + return strings.TrimSpace(string(bytes)), licensePath +} + +// UploadLicense 授权文件上传到网元主机 +func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { + // 检查文件是否存在 + omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) + if _, err := os.Stat(omcLicensePath); err != nil { + return fmt.Errorf("file read failure") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.NeType, neLicense.NeId) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端授权文件路径 + neTypeLower := strings.ToLower(neLicense.NeType) + neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) + neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) + + // 尝试备份授权文件 + neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) + + // 上传授权文件去覆盖 + if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + + // 重启服务 + if neLicense.Reload { + cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) + if neTypeLower == "ims" { + cmdStr = "ims-stop || true && ims-start" + } else if neTypeLower == "omc" { + cmdStr = "sudo systemctl restart restagent" + } + sshClient.RunCMD(cmdStr) + } + return nil } diff --git a/src/modules/network_element/service/ne_license.impl.go b/src/modules/network_element/service/ne_license.impl.go deleted file mode 100644 index 9d11804d..00000000 --- a/src/modules/network_element/service/ne_license.impl.go +++ /dev/null @@ -1,191 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeLicenseImpl 结构体 -var NewNeLicenseImpl = &NeLicenseImpl{ - neLicenseRepository: repository.NewNeLicenseImpl, -} - -// NeLicenseImpl 网元授权激活信息 服务层处理 -type NeLicenseImpl struct { - // 网元授权激活信息表 - neLicenseRepository repository.INeLicense -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeLicenseImpl) SelectPage(query map[string]any) map[string]any { - return r.neLicenseRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeLicenseImpl) SelectList(neLicense model.NeLicense) []model.NeLicense { - return r.neLicenseRepository.SelectList(neLicense) -} - -// SelectByIds 通过ID查询 -func (r *NeLicenseImpl) SelectById(id string) model.NeLicense { - if id == "" { - return model.NeLicense{} - } - neLicenses := r.neLicenseRepository.SelectByIds([]string{id}) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// Insert 新增信息 -func (r *NeLicenseImpl) Insert(neLicense model.NeLicense) string { - return r.neLicenseRepository.Insert(neLicense) -} - -// Update 修改信息 -func (r *NeLicenseImpl) Update(neLicense model.NeLicense) int64 { - return r.neLicenseRepository.Update(neLicense) -} - -// DeleteByIds 批量删除信息 -func (r *NeLicenseImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rowIds := r.neLicenseRepository.SelectByIds(ids) - if len(rowIds) <= 0 { - return 0, fmt.Errorf("neLicense.noData") - } - - if len(rowIds) == len(ids) { - rows := r.neLicenseRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// SelectByTypeAndID 通过网元类型和网元ID查询 -func (r *NeLicenseImpl) SelectByTypeAndID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// SelectByNeTypeAndNeID 通过ne_type和ne_id查询信息 -func (r *NeLicenseImpl) SelectByNeTypeAndNeID(neType, neId string) model.NeLicense { - neLicenses := r.neLicenseRepository.SelectList(model.NeLicense{ - NeType: neType, - NeId: neId, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// ReadLicenseInfo 读取授权文件信息 -// 返回激活申请码, 激活文件 -func (r *NeLicenseImpl) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { - neTypeLower := strings.ToLower(neLicense.NeType) - // 网管本地路径 - omcPath := "/usr/local/etc/omc/ne_license" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeId) - // 网元端授权文件路径 - nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return "", "" - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", "" - } - defer sftpClient.Close() - - // 复制授权申请码到本地 - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { - return "", "" - } - // 读取文件内容 - bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") - if err != nil { - return "", "" - } - - // 复制激活文件到本地 - licensePath := "" - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { - licensePath = omcPath + "/system.ini" - } - return strings.TrimSpace(string(bytes)), licensePath -} - -// UploadLicense 授权文件上传到网元主机 -func (r *NeLicenseImpl) UploadLicense(neLicense model.NeLicense) error { - // 检查文件是否存在 - omcLicensePath := file.ParseUploadFilePath(neLicense.LicensePath) - if _, err := os.Stat(omcLicensePath); err != nil { - return fmt.Errorf("file read failure") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neLicense.NeType, neLicense.NeId) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端授权文件路径 - neTypeLower := strings.ToLower(neLicense.NeType) - neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) - neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) - - // 尝试备份授权文件 - neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) - - // 上传授权文件去覆盖 - if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - - // 重启服务 - if neLicense.Reload { - cmdStr := fmt.Sprintf("sudo service %s restart", neTypeLower) - if neTypeLower == "ims" { - cmdStr = "ims-stop || true && ims-start" - } else if neTypeLower == "omc" { - cmdStr = "sudo systemctl restart restagent" - } - sshClient.RunCMD(cmdStr) - } - return nil -} diff --git a/src/modules/network_element/service/ne_software.go b/src/modules/network_element/service/ne_software.go index 37e9ad4a..c4910f05 100644 --- a/src/modules/network_element/service/ne_software.go +++ b/src/modules/network_element/service/ne_software.go @@ -1,30 +1,142 @@ package service -import "be.ems/src/modules/network_element/model" +import ( + "fmt" + "os" -// INeSoftware 网元软件包信息 服务层接口 -type INeSoftware interface { - // SelectPage 根据条件分页查询字典类型 - SelectPage(query map[string]any) map[string]any + "be.ems/src/framework/utils/file" + "be.ems/src/modules/network_element/model" + "be.ems/src/modules/network_element/repository" +) - // SelectList 根据实体查询 - SelectList(neSoftware model.NeSoftware) []model.NeSoftware - - // SelectById 通过ID查询 - SelectById(id string) model.NeSoftware - - // Insert 新增信息 - Insert(neSoftware model.NeSoftware) string - - // Update 修改信息 - Update(neSoftware model.NeSoftware) int64 - - // DeleteByIds 批量删除信息 - DeleteByIds(ids []string) (int64, error) - - // CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 - CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool - - // UpdateVersions 更新软件包对应网元的新版本 - UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 +// 实例化服务层 NeSoftware 结构体 +var NewNeSoftware = &NeSoftware{ + neSoftwareRepository: repository.NewNeSoftware, +} + +// NeSoftware 网元软件包信息 服务层处理 +type NeSoftware struct { + neSoftwareRepository *repository.NeSoftware // 网元软件包信息 +} + +// SelectNeHostPage 分页查询列表数据 +func (r *NeSoftware) SelectPage(query map[string]any) map[string]any { + return r.neSoftwareRepository.SelectPage(query) +} + +// SelectConfigList 查询列表 +func (r *NeSoftware) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { + return r.neSoftwareRepository.SelectList(neSoftware) +} + +// SelectByIds 通过ID查询 +func (r *NeSoftware) SelectById(id string) model.NeSoftware { + if id == "" { + return model.NeSoftware{} + } + neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) + if len(neHosts) > 0 { + return neHosts[0] + } + return model.NeSoftware{} +} + +// Insert 新增信息 +func (r *NeSoftware) Insert(neSoftware model.NeSoftware) string { + inserId := r.neSoftwareRepository.Insert(neSoftware) + if inserId != "" { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.CreateBy + NewNeVersion.Update(neVersion) + } + } + } + return inserId +} + +// Update 修改信息 +func (r *NeSoftware) Update(neSoftware model.NeSoftware) int64 { + rows := r.neSoftwareRepository.Update(neSoftware) + if rows > 0 { + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(model.NeVersion{ + NeType: neSoftware.NeType, + Status: "3", + }, false) + if len(neVersions) > 0 { + for _, neVersion := range neVersions { + neVersion.NewName = neSoftware.Name + neVersion.NewVersion = neSoftware.Version + neVersion.NewPath = neSoftware.Path + neVersion.Status = "3" + neVersion.UpdateBy = neSoftware.UpdateBy + NewNeVersion.Update(neVersion) + } + } + } + return rows +} + +// DeleteByIds 批量删除信息 +func (r *NeSoftware) DeleteByIds(ids []string) (int64, error) { + // 检查是否存在 + rows := r.neSoftwareRepository.SelectByIds(ids) + if len(rows) <= 0 { + return 0, fmt.Errorf("neSoftware.noData") + } + + if len(rows) == len(ids) { + // 遍历软件包列表进行文件删除 + for _, row := range rows { + // 检查文件是否存在 + filePath := file.ParseUploadFilePath(row.Path) + if _, err := os.Stat(filePath); err != nil { + continue + } + os.Remove(filePath) + } + rows := r.neSoftwareRepository.DeleteByIds(ids) + return rows, nil + } + + // 删除信息失败! + return 0, fmt.Errorf("delete fail") +} + +// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 +func (r *NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { + uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ + NeType: neType, + Name: name, + Version: version, + }) + if uniqueId == id { + return true + } + return uniqueId == "" +} + +// UpdateVersions 更新软件包对应网元的新版本 +func (r *NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { + var rows int64 = 0 + // 更新同类型的新包版本 + neVersions := NewNeVersion.SelectList(neVersion, false) + if len(neVersions) > 0 { + for _, v := range neVersions { + v.NewName = neSoftware.Name + v.NewVersion = neSoftware.Version + v.NewPath = neSoftware.Path + v.Status = "3" + v.UpdateBy = neVersion.UpdateBy + rows += NewNeVersion.Update(v) + } + } + return rows } diff --git a/src/modules/network_element/service/ne_software.impl.go b/src/modules/network_element/service/ne_software.impl.go deleted file mode 100644 index 326ae339..00000000 --- a/src/modules/network_element/service/ne_software.impl.go +++ /dev/null @@ -1,143 +0,0 @@ -package service - -import ( - "fmt" - "os" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/network_element/model" - "be.ems/src/modules/network_element/repository" -) - -// 实例化服务层 NeSoftwareImpl 结构体 -var NewNeSoftwareImpl = &NeSoftwareImpl{ - neSoftwareRepository: repository.NewNeSoftwareImpl, -} - -// NeSoftwareImpl 网元软件包信息 服务层处理 -type NeSoftwareImpl struct { - // 网元软件包信息 - neSoftwareRepository repository.INeSoftware -} - -// SelectNeHostPage 分页查询列表数据 -func (r *NeSoftwareImpl) SelectPage(query map[string]any) map[string]any { - return r.neSoftwareRepository.SelectPage(query) -} - -// SelectConfigList 查询列表 -func (r *NeSoftwareImpl) SelectList(neSoftware model.NeSoftware) []model.NeSoftware { - return r.neSoftwareRepository.SelectList(neSoftware) -} - -// SelectByIds 通过ID查询 -func (r *NeSoftwareImpl) SelectById(id string) model.NeSoftware { - if id == "" { - return model.NeSoftware{} - } - neHosts := r.neSoftwareRepository.SelectByIds([]string{id}) - if len(neHosts) > 0 { - return neHosts[0] - } - return model.NeSoftware{} -} - -// Insert 新增信息 -func (r *NeSoftwareImpl) Insert(neSoftware model.NeSoftware) string { - inserId := r.neSoftwareRepository.Insert(neSoftware) - if inserId != "" { - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{NeType: neSoftware.NeType}, false) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.CreateBy - NewNeVersion.Update(neVersion) - } - } - } - return inserId -} - -// Update 修改信息 -func (r *NeSoftwareImpl) Update(neSoftware model.NeSoftware) int64 { - rows := r.neSoftwareRepository.Update(neSoftware) - if rows > 0 { - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(model.NeVersion{ - NeType: neSoftware.NeType, - Status: "3", - }, false) - if len(neVersions) > 0 { - for _, neVersion := range neVersions { - neVersion.NewName = neSoftware.Name - neVersion.NewVersion = neSoftware.Version - neVersion.NewPath = neSoftware.Path - neVersion.Status = "3" - neVersion.UpdateBy = neSoftware.UpdateBy - NewNeVersion.Update(neVersion) - } - } - } - return rows -} - -// DeleteByIds 批量删除信息 -func (r *NeSoftwareImpl) DeleteByIds(ids []string) (int64, error) { - // 检查是否存在 - rows := r.neSoftwareRepository.SelectByIds(ids) - if len(rows) <= 0 { - return 0, fmt.Errorf("neSoftware.noData") - } - - if len(rows) == len(ids) { - // 遍历软件包列表进行文件删除 - for _, row := range rows { - // 检查文件是否存在 - filePath := file.ParseUploadFilePath(row.Path) - if _, err := os.Stat(filePath); err != nil { - continue - } - os.Remove(filePath) - } - rows := r.neSoftwareRepository.DeleteByIds(ids) - return rows, nil - } - - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// CheckUniqueTypeAndNameAndVersion 校验网元类型和文件名版本是否唯一 -func (r *NeSoftwareImpl) CheckUniqueTypeAndNameAndVersion(neType, name, version, id string) bool { - uniqueId := r.neSoftwareRepository.CheckUniqueTypeAndNameAndVersion(model.NeSoftware{ - NeType: neType, - Name: name, - Version: version, - }) - if uniqueId == id { - return true - } - return uniqueId == "" -} - -// UpdateVersions 更新软件包对应网元的新版本 -func (r *NeSoftwareImpl) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { - var rows int64 = 0 - // 更新同类型的新包版本 - neVersions := NewNeVersion.SelectList(neVersion, false) - if len(neVersions) > 0 { - for _, v := range neVersions { - v.NewName = neSoftware.Name - v.NewVersion = neSoftware.Version - v.NewPath = neSoftware.Path - v.Status = "3" - v.UpdateBy = neVersion.UpdateBy - rows += NewNeVersion.Update(v) - } - } - return rows -} diff --git a/src/modules/network_element/service/ne_version.go b/src/modules/network_element/service/ne_version.go index e064c70c..4b6f21d6 100644 --- a/src/modules/network_element/service/ne_version.go +++ b/src/modules/network_element/service/ne_version.go @@ -21,8 +21,7 @@ var NewNeVersion = &NeVersion{ // NeVersion 网元版本信息 服务层处理 type NeVersion struct { - // 网元版本信息表 - neVersionRepository *repository.NeVersion + neVersionRepository *repository.NeVersion // 网元版本信息表 } // SelectNeHostPage 分页查询列表数据 @@ -55,7 +54,7 @@ func (r *NeVersion) checkNeVersion(arr *[]model.NeVersion) { for i := range *arr { item := (*arr)[i] // 查询网元获取IP - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(item.NeType, item.NeId) if neInfo.NeId != item.NeId || neInfo.IP == "" { continue } @@ -136,7 +135,7 @@ func (r *NeVersion) SelectByNeTypeAndNeID(neType, neId string) model.NeVersion { // action 安装行为:install upgrade rollback func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := NewNeInfoImpl.NeRunSSHClient(neVersion.NeType, neVersion.NeId) + sshClient, err := NewNeInfo.NeRunSSHClient(neVersion.NeType, neVersion.NeId) if err != nil { return "", err } @@ -158,11 +157,11 @@ func (r *NeVersion) Operate(action string, neVersion model.NeVersion, preinput m // ========= 安装时设置 ========= if action == "install" { // 网元公共配置文件 - para5GMap, err := NewNeInfoImpl.NeConfPara5GRead() + para5GMap, err := NewNeInfo.NeConfPara5GRead() if para5GMap == nil || err != nil { return "", fmt.Errorf("error read para5G file info") } - if err := NewNeInfoImpl.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { + if err := NewNeInfo.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.NeType, neVersion.NeId)}); err != nil { return "", fmt.Errorf("error wirte para5G file info") } } @@ -271,7 +270,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) return okFlagStr, cmdStrArr, nil } else if neType == "IMS" { if action == "install" { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // 公网 PLMN地址 @@ -313,7 +312,7 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) } } else { if action == "install" { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, pkgCmdStr+" \n") // AMF配置修改 @@ -538,14 +537,14 @@ func (r *NeVersion) operateCommand(action, neType string, neFilePaths []string) if action == "install" && (neTypeLower == "ims" || neTypeLower == "udm") { // adb if strings.Contains(pkgCmdStr, "adb") { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/adb/default/adb.conf /usr/local/etc/adb/adb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/adb/adb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service adb restart \n") } // kvdb if strings.Contains(pkgCmdStr, "kvdb") { - para5GData := NewNeInfoImpl.Para5GData + para5GData := NewNeInfo.Para5GData cmdStrArr = append(cmdStrArr, "sudo cp /usr/local/etc/kvdb/default/kvdb.conf /usr/local/etc/kvdb/kvdb.conf \n") cmdStrArr = append(cmdStrArr, fmt.Sprintf("sudo sed -i \"s/bind 127.0.0.1/bind 127.0.0.1 %s/g\" /usr/local/etc/kvdb/kvdb.conf \n", para5GData["DB_IP"])) cmdStrArr = append(cmdStrArr, "sudo service kvdb restart \n") @@ -654,12 +653,12 @@ func (r *NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]strin func (r *NeVersion) operateDome(action string, neVersion model.NeVersion) error { if action == "install" { // 网元信息 - neInfo := NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) + neInfo := NewNeInfo.SelectNeInfoByNeTypeAndNeID(neVersion.NeType, neVersion.NeId) if neInfo.NeId != neVersion.NeId { return fmt.Errorf("error found neinfo") } // ========= 网元OAM配置文件 start ========== - if err := NewNeInfoImpl.NeConfOAMWirteSync(neInfo, nil, true); err != nil { + if err := NewNeInfo.NeConfOAMWirteSync(neInfo, nil, true); err != nil { return fmt.Errorf("error wirte OAM file info") } // ========= 网元OAM配置文件 end =========== diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go index c908d584..71413d6b 100644 --- a/src/modules/tool/controller/iperf.go +++ b/src/modules/tool/controller/iperf.go @@ -99,7 +99,7 @@ func (s *IPerfController) Run(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go index 7af020de..3f3f5b44 100644 --- a/src/modules/tool/controller/ping.go +++ b/src/modules/tool/controller/ping.go @@ -105,7 +105,7 @@ func (s *PingController) Run(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index ae204513..84ec00b6 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -16,20 +16,15 @@ import ( ) // 实例化服务层 IPerf 结构体 -var NewIPerf = &IPerf{ - neInfoService: neService.NewNeInfoImpl, -} +var NewIPerf = &IPerf{} // IPerf 网络性能测试工具 服务层处理 -type IPerf struct { - // 网元信息服务 - neInfoService neService.INeInfo -} +type IPerf struct{} // Version 查询版本信息 func (s *IPerf) Version(meType, neId string) (string, error) { // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) if err != nil { return "", err } @@ -46,7 +41,7 @@ func (s *IPerf) Version(meType, neId string) (string, error) { // Install 安装iperf3 func (s *IPerf) Install(meType, neId string) error { // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(meType, neId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) if err != nil { return err } diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go index 100ef9db..1ce9b016 100644 --- a/src/modules/tool/service/ping.go +++ b/src/modules/tool/service/ping.go @@ -10,22 +10,16 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/utils/ssh" "be.ems/src/framework/vo/result" - neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/model" wsModel "be.ems/src/modules/ws/model" probing "github.com/prometheus-community/pro-bing" ) // 实例化服务层 Ping 结构体 -var NewPing = &Ping{ - neInfoService: neService.NewNeInfoImpl, -} +var NewPing = &Ping{} // Ping 网络性能测试工具 服务层处理 -type Ping struct { - // 网元信息服务 - neInfoService neService.INeInfo -} +type Ping struct{} // Statistics ping基本信息 func (s *Ping) Statistics(ping model.Ping) (map[string]any, error) { diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index 9ef6fa60..03ace4da 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -16,7 +16,7 @@ import ( // 实例化控制层 TCPdumpController 结构体 var NewTCPdump = &TCPdumpController{ tcpdumpService: traceService.NewTCPdump, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 信令抓包 @@ -24,7 +24,7 @@ var NewTCPdump = &TCPdumpController{ // PATH /tcpdump type TCPdumpController struct { tcpdumpService *traceService.TCPdump // 信令抓包服务 - neInfoService neService.INeInfo // 网元信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } // 网元抓包PACP 开始 diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go index 4b659015..07acc5ba 100644 --- a/src/modules/trace/controller/trace_task_hlr.go +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -21,7 +21,7 @@ import ( // 实例化控制层 TraceTaskHlrController 结构体 var NewTraceTaskHlr = &TraceTaskHlrController{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, traceTaskHlrService: traceService.NewTraceTaskHlr, } @@ -29,10 +29,8 @@ var NewTraceTaskHlr = &TraceTaskHlrController{ // // PATH /task/hlr type TraceTaskHlrController struct { - // 网元信息服务 - neInfoService neService.INeInfo - // 跟踪_任务给HRL网元信息服务 - traceTaskHlrService *traceService.TraceTaskHlr + neInfoService *neService.NeInfo // 网元信息服务 + traceTaskHlrService *traceService.TraceTaskHlr // 跟踪_任务给HRL网元信息服务 } // 跟踪任务列表 diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index 2511736d..72c8553d 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -18,13 +18,12 @@ import ( // 实例化服务层 TCPdump 结构体 var NewTCPdump = &TCPdump{ - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // 信令抓包 服务层处理 type TCPdump struct { - // 网元信息服务 - neInfoService neService.INeInfo + neInfoService *neService.NeInfo // 网元信息服务 } // 抓包进程PID diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index bc1682c7..98e8d7c0 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -189,7 +189,7 @@ func (r *TraceTask) Insert(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -254,7 +254,7 @@ func (r *TraceTask) Update(task model.TraceTask) error { task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(task.NeType, task.NeId) if neInfo.NeId != task.NeId || neInfo.IP == "" { return fmt.Errorf("app.common.noNEInfo") } @@ -309,7 +309,7 @@ func (r *TraceTask) DeleteByIds(ids []string) (int64, error) { if len(rows) == len(ids) { // 停止任务 for _, v := range rows { - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(v.NeType, v.NeId) if neInfo.NeId != v.NeId || neInfo.IP == "" { continue } diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index 835f1c11..9eee3843 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -17,15 +17,13 @@ import ( // 实例化数据层 TraceTaskHlr 结构体 var NewTraceTaskHlr = &TraceTaskHlr{ traceTaskHlrRepository: repository.NewTraceTaskHlr, - neInfoService: neService.NewNeInfoImpl, + neInfoService: neService.NewNeInfo, } // TraceTaskHlr 跟踪_任务给HRL网元 服务层处理 type TraceTaskHlr struct { - // 跟踪_任务给HRL网元数据信息 - traceTaskHlrRepository *repository.TraceTaskHlr - // 网元信息服务 - neInfoService neService.INeInfo + traceTaskHlrRepository *repository.TraceTaskHlr // 跟踪_任务给HRL网元数据信息 + neInfoService *neService.NeInfo // 网元信息服务 } // SelectPage 根据条件分页查询 diff --git a/src/modules/ws/controller/ws_ssh.go b/src/modules/ws/controller/ws_ssh.go index d5444c44..db33b6bd 100644 --- a/src/modules/ws/controller/ws_ssh.go +++ b/src/modules/ws/controller/ws_ssh.go @@ -43,7 +43,7 @@ func (s *WSController) SSH(c *gin.Context) { return } - neHost := neService.NewNeHostImpl.SelectById(query.HostId) + neHost := neService.NewNeHost.SelectById(query.HostId) if neHost.HostID != query.HostId || neHost.HostType != "ssh" { // 没有可访问主机信息数据! c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) diff --git a/src/modules/ws/controller/ws_telnet.go b/src/modules/ws/controller/ws_telnet.go index 668d0ec4..34f52240 100644 --- a/src/modules/ws/controller/ws_telnet.go +++ b/src/modules/ws/controller/ws_telnet.go @@ -43,7 +43,7 @@ func (s *WSController) Telnet(c *gin.Context) { return } - neHost := neService.NewNeHostImpl.SelectById(query.HostId) + neHost := neService.NewNeHost.SelectById(query.HostId) if neHost.HostID != query.HostId || neHost.HostType != "telnet" { // 没有可访问主机信息数据! c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.noData"))) diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go index 56c77f89..2b2594d2 100644 --- a/src/modules/ws/controller/ws_view.go +++ b/src/modules/ws/controller/ws_view.go @@ -44,7 +44,7 @@ func (s *WSController) ShellView(c *gin.Context) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfoImpl.NeRunSSHClient(query.NeType, query.NeId) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.NeType, query.NeId) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index f7d1efff..5cfc7776 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -22,13 +22,13 @@ func GetCDRConnectByIMS(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventIMSImpl.SelectPage(query) + dataMap := neDataService.NewCDREventIMS.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -47,13 +47,13 @@ func GetCDRConnectBySMF(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMFImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -72,13 +72,13 @@ func GetCDRConnectBySMSC(requestID string, data any) ([]byte, error) { } // 查询网元信息 rmUID - neInfo := neInfoService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) + neInfo := neInfoService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(query.NeType, query.NeID) if neInfo.NeId != query.NeID || neInfo.IP == "" { return nil, fmt.Errorf("query neinfo not found") } query.RmUID = neInfo.RmUID - dataMap := neDataService.NewCDREventSMSCImpl.SelectPage(query) + dataMap := neDataService.NewCDREventSMSC.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index 64e76e72..bd4b1446 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -28,7 +28,7 @@ func GetNeState(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index bb0f6492..f6903819 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -20,7 +20,7 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventAMFImpl.SelectPage(query) + dataMap := neDataService.NewUEEventAMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, @@ -38,7 +38,7 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - dataMap := neDataService.NewUEEventMMEImpl.SelectPage(query) + dataMap := neDataService.NewUEEventMME.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, "data": dataMap, diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 9a86786a..0186dcd3 100644 --- a/src/modules/ws/processor/upf_total_flow.go +++ b/src/modules/ws/processor/upf_total_flow.go @@ -29,12 +29,12 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) { } // 查询网元获取IP - neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) if neInfo.NeId != querys.NeID || neInfo.IP == "" { return nil, fmt.Errorf("no matching network element information found") } - dataMap := neDataService.NewPerfKPIImpl.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) + dataMap := neDataService.NewPerfKPI.SelectUPFTotalFlow(neInfo.NeType, neInfo.RmUID, querys.Day) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, From 00ff6217c84cc0b54de75539c00dabbeb06f742b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 12 Oct 2024 19:46:45 +0800 Subject: [PATCH 28/69] =?UTF-8?q?sql:=20=E8=8F=9C=E5=8D=95Tool=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_menu.sql | 1 + database/upgrade/upg_sys_menu.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index da713786..030f85d1 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -49,6 +49,7 @@ CREATE TABLE `sys_menu` ( INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); INSERT INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); INSERT INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +INSERT INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, 'menu.toolsRemark'); INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index 73f92388..d94224b7 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -32,6 +32,7 @@ CREATE TABLE IF NOT EXISTS `sys_menu` ( REPLACE INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); REPLACE INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); REPLACE INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); +REPLACE INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1715413568692, 'supervisor', 1715413568692, 'menu.toolsRemark'); REPLACE INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); From 873dadf0147119e4423becdcd2fc26d1a6d23911 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 14 Oct 2024 10:51:43 +0800 Subject: [PATCH 29/69] =?UTF-8?q?style:=20=E5=8E=BB=E9=99=A4Impl=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A3=B0=E6=98=8E=E5=B1=82=E8=81=9A=E7=84=A6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/i18n/i18n.go | 4 +- .../monitor_sys_resource.go | 4 +- src/modules/monitor/controller/monitor.go | 5 +- src/modules/monitor/controller/sys_job.go | 10 +- src/modules/monitor/controller/sys_job_log.go | 12 +- .../monitor/controller/sys_user_online.go | 5 +- src/modules/monitor/controller/system_info.go | 5 +- src/modules/monitor/monitor.go | 2 +- src/modules/monitor/service/monitor.go | 278 +++++++++++++++++- src/modules/monitor/service/monitor.impl.go | 274 ----------------- src/modules/monitor/service/monitor_test.go | 22 +- src/modules/monitor/service/sys_job.go | 190 ++++++++++-- src/modules/monitor/service/sys_job.impl.go | 169 ----------- src/modules/monitor/service/sys_job_log.go | 51 +++- .../monitor/service/sys_job_log.impl.go | 42 --- .../monitor/service/sys_user_online.go | 29 +- .../monitor/service/sys_user_online.impl.go | 33 --- src/modules/monitor/service/system_info.go | 183 +++++++++++- .../monitor/service/system_info.impl.go | 177 ----------- src/modules/network_data/controller/amf.go | 6 +- src/modules/network_data/controller/ims.go | 4 +- src/modules/network_data/controller/mme.go | 6 +- .../system/controller/sys_dict_data.go | 10 +- .../system/controller/sys_dict_type.go | 5 +- src/modules/system/controller/sys_role.go | 7 +- src/modules/system/controller/sys_user.go | 7 +- .../system/repository/sys_dict_data.impl.go | 2 +- .../system/repository/sys_dict_type.impl.go | 2 +- src/modules/system/service/sys_dict_data.go | 137 +++++++-- .../system/service/sys_dict_data.impl.go | 116 -------- src/modules/system/service/sys_dict_type.go | 247 +++++++++++++--- .../system/service/sys_dict_type.impl.go | 212 ------------- src/modules/system/system.go | 2 +- 33 files changed, 1030 insertions(+), 1228 deletions(-) delete mode 100644 src/modules/monitor/service/monitor.impl.go delete mode 100644 src/modules/monitor/service/sys_job.impl.go delete mode 100644 src/modules/monitor/service/sys_job_log.impl.go delete mode 100644 src/modules/monitor/service/sys_user_online.impl.go delete mode 100644 src/modules/monitor/service/system_info.impl.go delete mode 100644 src/modules/system/service/sys_dict_data.impl.go delete mode 100644 src/modules/system/service/sys_dict_type.impl.go diff --git a/src/framework/i18n/i18n.go b/src/framework/i18n/i18n.go index 7e5c2ded..657964fa 100644 --- a/src/framework/i18n/i18n.go +++ b/src/framework/i18n/i18n.go @@ -26,7 +26,7 @@ func ClearLocaleData() { // LoadLocaleData 加载国际化数据 func LoadLocaleData(language string) []localeItem { dictType := fmt.Sprintf("i18n_%s", language) - dictTypeList := systemService.NewSysDictTypeImpl.DictDataCache(dictType) + dictTypeList := systemService.NewSysDictType.DictDataCache(dictType) localeData := []localeItem{} for _, v := range dictTypeList { localeData = append(localeData, localeItem{ @@ -58,7 +58,7 @@ func UpdateKeyValue(language, key, value string) bool { } // 更新字典数据 - sysDictDataService := systemService.NewSysDictDataImpl + sysDictDataService := systemService.NewSysDictData item := sysDictDataService.SelectDictDataByCode(code) if item.DictCode == code && item.DictLabel == key { item.DictValue = value diff --git a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go index 9b1187bf..401d0233 100644 --- a/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go +++ b/src/modules/crontask/processor/monitor_sys_resource/monitor_sys_resource.go @@ -10,7 +10,7 @@ import ( ) var NewProcessor = &MonitorSysResourceProcessor{ - monitorService: monitorService.NewMonitorImpl, + monitorService: monitorService.NewMonitor, count: 0, openDataCancel: false, } @@ -18,7 +18,7 @@ var NewProcessor = &MonitorSysResourceProcessor{ // MonitorSysResourceProcessor 系统资源CPU/IO/Netword收集 type MonitorSysResourceProcessor struct { // 服务器系统相关信息服务 - monitorService monitorService.IMonitor + monitorService *monitorService.Monitor // 执行次数 count int // 是否已经开启数据通道 diff --git a/src/modules/monitor/controller/monitor.go b/src/modules/monitor/controller/monitor.go index 67921d1a..17f44dd5 100644 --- a/src/modules/monitor/controller/monitor.go +++ b/src/modules/monitor/controller/monitor.go @@ -11,15 +11,14 @@ import ( // 实例化控制层 MonitorInfoController 结构体 var NewMonitor = &MonitorController{ - monitorService: service.NewMonitorImpl, + monitorService: service.NewMonitor, } // 服务器资源监控信息 // // PATH /monitor type MonitorController struct { - // 服务器系统相关信息服务 - monitorService service.IMonitor + monitorService *service.Monitor // 服务器系统相关信息服务 } // 资源监控信息加载 diff --git a/src/modules/monitor/controller/sys_job.go b/src/modules/monitor/controller/sys_job.go index 2420e553..07868c8b 100644 --- a/src/modules/monitor/controller/sys_job.go +++ b/src/modules/monitor/controller/sys_job.go @@ -22,18 +22,16 @@ import ( // 实例化控制层 SysJobLogController 结构体 var NewSysJob = &SysJobController{ - sysJobService: service.NewSysJobImpl, - sysDictDataService: systemService.NewSysDictDataImpl, + sysJobService: service.NewSysJob, + sysDictDataService: systemService.NewSysDictData, } // 调度任务信息 // // PATH /monitor/job type SysJobController struct { - // 调度任务服务 - sysJobService service.ISysJob - // 字典数据服务 - sysDictDataService systemService.ISysDictData + sysJobService *service.SysJob // 调度任务服务 + sysDictDataService *systemService.SysDictData // 字典数据服务 } // 调度任务列表 diff --git a/src/modules/monitor/controller/sys_job_log.go b/src/modules/monitor/controller/sys_job_log.go index 4705700e..9401a28d 100644 --- a/src/modules/monitor/controller/sys_job_log.go +++ b/src/modules/monitor/controller/sys_job_log.go @@ -21,18 +21,16 @@ import ( // 实例化控制层 SysJobLogController 结构体 var NewSysJobLog = &SysJobLogController{ - sysJobLogService: service.NewSysJobLogImpl, - sysDictDataService: systemService.NewSysDictDataImpl, + sysJobLogService: service.NewSysJobLog, + sysDictDataService: systemService.NewSysDictData, } // 调度任务日志信息 // // PATH /monitor/jobLog type SysJobLogController struct { - // 调度任务日志服务 - sysJobLogService service.ISysJobLog - // 字典数据服务 - sysDictDataService systemService.ISysDictData + sysJobLogService *service.SysJobLog // 调度任务日志服务 + sysDictDataService *systemService.SysDictData // 字典数据服务 } // 调度任务日志列表 @@ -44,7 +42,7 @@ func (s *SysJobLogController) List(c *gin.Context) { querys := ctx.QueryMap(c) // 任务ID优先级更高 if v, ok := querys["jobId"]; ok && v != nil { - jobInfo := service.NewSysJobImpl.SelectJobById(v.(string)) + jobInfo := service.NewSysJob.SelectJobById(v.(string)) querys["jobName"] = jobInfo.JobName querys["jobGroup"] = jobInfo.JobGroup } diff --git a/src/modules/monitor/controller/sys_user_online.go b/src/modules/monitor/controller/sys_user_online.go index 40a84193..072cad32 100644 --- a/src/modules/monitor/controller/sys_user_online.go +++ b/src/modules/monitor/controller/sys_user_online.go @@ -19,15 +19,14 @@ import ( // 实例化控制层 SysUserOnlineController 结构体 var NewSysUserOnline = &SysUserOnlineController{ - sysUserOnlineService: service.NewSysUserOnlineImpl, + sysUserOnlineService: service.NewSysUserOnline, } // 在线用户监控 // // PATH /monitor/online type SysUserOnlineController struct { - // 在线用户服务 - sysUserOnlineService service.ISysUserOnline + sysUserOnlineService *service.SysUserOnline // 在线用户服务 } // 在线用户列表 diff --git a/src/modules/monitor/controller/system_info.go b/src/modules/monitor/controller/system_info.go index d93e0ffa..14437dda 100644 --- a/src/modules/monitor/controller/system_info.go +++ b/src/modules/monitor/controller/system_info.go @@ -9,15 +9,14 @@ import ( // 实例化控制层 SystemInfoController 结构体 var NewSystemInfo = &SystemInfoController{ - systemInfogService: service.NewSystemInfoImpl, + systemInfogService: service.NewSystemInfo, } // 服务器监控信息 // // PATH /monitor/system-info type SystemInfoController struct { - // 服务器系统相关信息服务 - systemInfogService service.ISystemInfo + systemInfogService *service.SystemInfo // 服务器系统相关信息服务 } // 服务器信息 diff --git a/src/modules/monitor/monitor.go b/src/modules/monitor/monitor.go index 67fa63e2..b71bbfa4 100644 --- a/src/modules/monitor/monitor.go +++ b/src/modules/monitor/monitor.go @@ -165,5 +165,5 @@ func InitLoad() { // 初始化定时任务处理 processor.InitCronQueue() // 启动时,初始化调度任务 - service.NewSysJobImpl.ResetQueueJob() + service.NewSysJob.ResetQueueJob() } diff --git a/src/modules/monitor/service/monitor.go b/src/modules/monitor/service/monitor.go index 5e836cc8..285a265b 100644 --- a/src/modules/monitor/service/monitor.go +++ b/src/modules/monitor/service/monitor.go @@ -1,14 +1,274 @@ package service -// IMonitor 服务器系统相关信息 服务层接口 -type IMonitor interface { - // RunMonitor 执行资源监控 - RunMonitor() +import ( + "context" + "strconv" + "time" - // RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值 - // interval 采集的平均值(分钟) - RunMonitorDataCancel(removeBefore bool, interval float64) + "be.ems/src/framework/logger" + "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" + systemService "be.ems/src/modules/system/service" + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/disk" + "github.com/shirou/gopsutil/v4/load" + "github.com/shirou/gopsutil/v4/mem" + "github.com/shirou/gopsutil/v4/net" +) - // SelectMonitorInfo 查询监控资源信息 - SelectMonitorInfo(query map[string]any) map[string]any +// 实例化服务层 Monitor 结构体 +var NewMonitor = &Monitor{ + sysConfigService: systemService.NewSysConfigImpl, + monitorRepository: repository.NewMonitorImpl, + diskIO: make(chan []disk.IOCountersStat, 2), + netIO: make(chan []net.IOCountersStat, 2), +} + +// Monitor 服务器系统相关信息 服务层处理 +type Monitor struct { + // 参数配置服务 + sysConfigService systemService.ISysConfig + // 监控服务资源数据信息 + monitorRepository repository.IMonitor + // 磁盘网络IO 数据通道 + diskIO chan ([]disk.IOCountersStat) + netIO chan ([]net.IOCountersStat) +} + +// RunMonitor 执行资源监控 +func (s *Monitor) RunMonitor() { + var itemBase model.MonitorBase + itemBase.CreateTime = time.Now().UnixMilli() + itemBase.NeType = "#" + itemBase.NeID = "#" + loadInfo, _ := load.Avg() + itemBase.CPULoad1 = loadInfo.Load1 + itemBase.CPULoad5 = loadInfo.Load5 + itemBase.CPULoad15 = loadInfo.Load15 + totalPercent, _ := cpu.Percent(3*time.Second, false) + if len(totalPercent) > 0 { + itemBase.CPU = totalPercent[0] + } + cpuCount, _ := cpu.Counts(false) + cpuAvg := (float64(cpuCount*2) * 0.75) * 100 + itemBase.LoadUsage = 0 + if cpuAvg > 0 { + itemBase.LoadUsage = loadInfo.Load1 / cpuAvg + } + + memoryInfo, _ := mem.VirtualMemory() + itemBase.Memory = memoryInfo.UsedPercent + + if err := s.monitorRepository.CreateMonitorBase(itemBase); err != nil { + logger.Errorf("CreateMonitorBase err: %v", err) + } + + // 将当前资源发送到chan中处理保存 + s.loadDiskIO() + s.loadNetIO() + + // 监控系统资源-保留天数 + storeDays := s.sysConfigService.SelectConfigValueByKey("monitor.sysResource.storeDays") + if storeDays != "" { + storeDays, _ := strconv.Atoi(storeDays) + ltTime := time.Now().AddDate(0, 0, -storeDays).UnixMilli() + _ = s.monitorRepository.DelMonitorBase(ltTime) + _ = s.monitorRepository.DelMonitorIO(ltTime) + _ = s.monitorRepository.DelMonitorNet(ltTime) + } +} + +func (s *Monitor) loadDiskIO() { + ioStat, _ := disk.IOCounters() + var diskIOList []disk.IOCountersStat + for _, io := range ioStat { + diskIOList = append(diskIOList, io) + } + s.diskIO <- diskIOList +} + +func (s *Monitor) loadNetIO() { + netStat, _ := net.IOCounters(true) + netStatAll, _ := net.IOCounters(false) + var netList []net.IOCountersStat + netList = append(netList, netStat...) + netList = append(netList, netStatAll...) + s.netIO <- netList +} + +// monitorCancel 监控搜集IO/Network上下文 +var monitorCancel context.CancelFunc + +// RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值 +// interval 采集的平均值(分钟) +func (s *Monitor) RunMonitorDataCancel(removeBefore bool, interval float64) { + // 是否取消之前的 + if removeBefore { + monitorCancel() + } + + // 上下文控制 + ctx, cancel := context.WithCancel(context.Background()) + monitorCancel = cancel + + // chanl 通道进行存储数据 + go s.saveIODataToDB(ctx, interval) + go s.saveNetDataToDB(ctx, interval) +} + +func (s *Monitor) saveIODataToDB(ctx context.Context, interval float64) { + defer close(s.diskIO) + for { + select { + case <-ctx.Done(): + return + case ioStat := <-s.diskIO: + select { + case <-ctx.Done(): + return + case ioStat2 := <-s.diskIO: + var ioList []model.MonitorIO + timeMilli := time.Now().UnixMilli() + for _, io2 := range ioStat2 { + for _, io1 := range ioStat { + if io2.Name == io1.Name { + var itemIO model.MonitorIO + itemIO.CreateTime = timeMilli + itemIO.NeType = "#" + itemIO.NeID = "#" + itemIO.Name = io1.Name + + if io2.ReadBytes != 0 && io1.ReadBytes != 0 && io2.ReadBytes > io1.ReadBytes { + itemIO.Read = int64(float64(io2.ReadBytes-io1.ReadBytes) / interval / 60) + } + if io2.WriteBytes != 0 && io1.WriteBytes != 0 && io2.WriteBytes > io1.WriteBytes { + itemIO.Write = int64(float64(io2.WriteBytes-io1.WriteBytes) / interval / 60) + } + + if io2.ReadCount != 0 && io1.ReadCount != 0 && io2.ReadCount > io1.ReadCount { + itemIO.Count = int64(float64(io2.ReadCount-io1.ReadCount) / interval / 60) + } + writeCount := int64(0) + if io2.WriteCount != 0 && io1.WriteCount != 0 && io2.WriteCount > io1.WriteCount { + writeCount = int64(float64(io2.WriteCount-io1.WriteCount) / interval * 60) + } + if writeCount > itemIO.Count { + itemIO.Count = writeCount + } + + if io2.ReadTime != 0 && io1.ReadTime != 0 && io2.ReadTime > io1.ReadTime { + itemIO.Time = int64(float64(io2.ReadTime-io1.ReadTime) / interval / 60) + } + writeTime := int64(0) + if io2.WriteTime != 0 && io1.WriteTime != 0 && io2.WriteTime > io1.WriteTime { + writeTime = int64(float64(io2.WriteTime-io1.WriteTime) / interval / 60) + } + if writeTime > itemIO.Time { + itemIO.Time = writeTime + } + ioList = append(ioList, itemIO) + break + } + } + } + if err := s.monitorRepository.BatchCreateMonitorIO(ioList); err != nil { + logger.Errorf("BatchCreateMonitorIO err: %v", err) + } + s.diskIO <- ioStat2 + } + } + } +} + +func (s *Monitor) saveNetDataToDB(ctx context.Context, interval float64) { + defer close(s.netIO) + for { + select { + case <-ctx.Done(): + return + case netStat := <-s.netIO: + select { + case <-ctx.Done(): + return + case netStat2 := <-s.netIO: + var netList []model.MonitorNetwork + timeMilli := time.Now().UnixMilli() + for _, net2 := range netStat2 { + for _, net1 := range netStat { + if net2.Name == net1.Name { + var itemNet model.MonitorNetwork + itemNet.CreateTime = timeMilli + itemNet.NeType = "#" + itemNet.NeID = "#" + itemNet.Name = net1.Name + + if net2.BytesSent != 0 && net1.BytesSent != 0 && net2.BytesSent > net1.BytesSent { + itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / interval / 60 + } + if net2.BytesRecv != 0 && net1.BytesRecv != 0 && net2.BytesRecv > net1.BytesRecv { + itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / interval / 60 + } + netList = append(netList, itemNet) + break + } + } + } + + if err := s.monitorRepository.BatchCreateMonitorNet(netList); err != nil { + logger.Errorf("BatchCreateMonitorNet err: %v", err) + } + s.netIO <- netStat2 + } + } + } +} + +// SelectMonitorInfo 查询监控资源信息 +func (s *Monitor) SelectMonitorInfo(query map[string]any) map[string]any { + infoType := query["type"] + startTimeMilli := query["startTime"] + endTimeMilli := query["endTime"] + neType := query["neType"] + neId := query["neId"] + name := query["name"] + + // 返回数据 + backDatas := map[string]any{} + + // 基本信息 + if infoType == "all" || infoType == "load" || infoType == "cpu" || infoType == "memory" { + rows := s.monitorRepository.SelectMonitorBase(map[string]any{ + "startTime": startTimeMilli, + "endTime": endTimeMilli, + "neType": neType, + "neId": neId, + }) + backDatas["base"] = rows + } + + // 磁盘IO + if infoType == "all" || infoType == "io" { + rows := s.monitorRepository.SelectMonitorIO(map[string]any{ + "startTime": startTimeMilli, + "endTime": endTimeMilli, + "neType": neType, + "neId": neId, + "name": name, + }) + backDatas["io"] = rows + } + + // 网络 + if infoType == "all" || infoType == "network" { + rows := s.monitorRepository.SelectMonitorNetwork(map[string]any{ + "startTime": startTimeMilli, + "endTime": endTimeMilli, + "neType": neType, + "neId": neId, + "name": name, + }) + backDatas["network"] = rows + } + + return backDatas } diff --git a/src/modules/monitor/service/monitor.impl.go b/src/modules/monitor/service/monitor.impl.go deleted file mode 100644 index 4152193f..00000000 --- a/src/modules/monitor/service/monitor.impl.go +++ /dev/null @@ -1,274 +0,0 @@ -package service - -import ( - "context" - "strconv" - "time" - - "be.ems/src/framework/logger" - "be.ems/src/modules/monitor/model" - "be.ems/src/modules/monitor/repository" - systemService "be.ems/src/modules/system/service" - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/load" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/net" -) - -// 实例化服务层 MonitorImpl 结构体 -var NewMonitorImpl = &MonitorImpl{ - sysConfigService: systemService.NewSysConfigImpl, - monitorRepository: repository.NewMonitorImpl, - diskIO: make(chan []disk.IOCountersStat, 2), - netIO: make(chan []net.IOCountersStat, 2), -} - -// MonitorImpl 服务器系统相关信息 服务层处理 -type MonitorImpl struct { - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 监控服务资源数据信息 - monitorRepository repository.IMonitor - // 磁盘网络IO 数据通道 - diskIO chan ([]disk.IOCountersStat) - netIO chan ([]net.IOCountersStat) -} - -// RunMonitor 执行资源监控 -func (s *MonitorImpl) RunMonitor() { - var itemBase model.MonitorBase - itemBase.CreateTime = time.Now().UnixMilli() - itemBase.NeType = "#" - itemBase.NeID = "#" - loadInfo, _ := load.Avg() - itemBase.CPULoad1 = loadInfo.Load1 - itemBase.CPULoad5 = loadInfo.Load5 - itemBase.CPULoad15 = loadInfo.Load15 - totalPercent, _ := cpu.Percent(3*time.Second, false) - if len(totalPercent) == 1 { - itemBase.CPU = totalPercent[0] - } - cpuCount, _ := cpu.Counts(false) - cpuAvg := (float64(cpuCount*2) * 0.75) * 100 - itemBase.LoadUsage = 0 - if cpuAvg > 0 { - itemBase.LoadUsage = loadInfo.Load1 / cpuAvg - } - - memoryInfo, _ := mem.VirtualMemory() - itemBase.Memory = memoryInfo.UsedPercent - - if err := s.monitorRepository.CreateMonitorBase(itemBase); err != nil { - logger.Errorf("CreateMonitorBase err: %v", err) - } - - // 将当前资源发送到chan中处理保存 - s.loadDiskIO() - s.loadNetIO() - - // 监控系统资源-保留天数 - storeDays := s.sysConfigService.SelectConfigValueByKey("monitor.sysResource.storeDays") - if storeDays != "" { - storeDays, _ := strconv.Atoi(storeDays) - ltTime := time.Now().AddDate(0, 0, -storeDays).UnixMilli() - _ = s.monitorRepository.DelMonitorBase(ltTime) - _ = s.monitorRepository.DelMonitorIO(ltTime) - _ = s.monitorRepository.DelMonitorNet(ltTime) - } -} - -func (s *MonitorImpl) loadDiskIO() { - ioStat, _ := disk.IOCounters() - var diskIOList []disk.IOCountersStat - for _, io := range ioStat { - diskIOList = append(diskIOList, io) - } - s.diskIO <- diskIOList -} - -func (s *MonitorImpl) loadNetIO() { - netStat, _ := net.IOCounters(true) - netStatAll, _ := net.IOCounters(false) - var netList []net.IOCountersStat - netList = append(netList, netStat...) - netList = append(netList, netStatAll...) - s.netIO <- netList -} - -// monitorCancel 监控搜集IO/Network上下文 -var monitorCancel context.CancelFunc - -// RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值 -// interval 采集的平均值(分钟) -func (s *MonitorImpl) RunMonitorDataCancel(removeBefore bool, interval float64) { - // 是否取消之前的 - if removeBefore { - monitorCancel() - } - - // 上下文控制 - ctx, cancel := context.WithCancel(context.Background()) - monitorCancel = cancel - - // chanl 通道进行存储数据 - go s.saveIODataToDB(ctx, interval) - go s.saveNetDataToDB(ctx, interval) -} - -func (s *MonitorImpl) saveIODataToDB(ctx context.Context, interval float64) { - defer close(s.diskIO) - for { - select { - case <-ctx.Done(): - return - case ioStat := <-s.diskIO: - select { - case <-ctx.Done(): - return - case ioStat2 := <-s.diskIO: - var ioList []model.MonitorIO - timeMilli := time.Now().UnixMilli() - for _, io2 := range ioStat2 { - for _, io1 := range ioStat { - if io2.Name == io1.Name { - var itemIO model.MonitorIO - itemIO.CreateTime = timeMilli - itemIO.NeType = "#" - itemIO.NeID = "#" - itemIO.Name = io1.Name - - if io2.ReadBytes != 0 && io1.ReadBytes != 0 && io2.ReadBytes > io1.ReadBytes { - itemIO.Read = int64(float64(io2.ReadBytes-io1.ReadBytes) / interval / 60) - } - if io2.WriteBytes != 0 && io1.WriteBytes != 0 && io2.WriteBytes > io1.WriteBytes { - itemIO.Write = int64(float64(io2.WriteBytes-io1.WriteBytes) / interval / 60) - } - - if io2.ReadCount != 0 && io1.ReadCount != 0 && io2.ReadCount > io1.ReadCount { - itemIO.Count = int64(float64(io2.ReadCount-io1.ReadCount) / interval / 60) - } - writeCount := int64(0) - if io2.WriteCount != 0 && io1.WriteCount != 0 && io2.WriteCount > io1.WriteCount { - writeCount = int64(float64(io2.WriteCount-io1.WriteCount) / interval * 60) - } - if writeCount > itemIO.Count { - itemIO.Count = writeCount - } - - if io2.ReadTime != 0 && io1.ReadTime != 0 && io2.ReadTime > io1.ReadTime { - itemIO.Time = int64(float64(io2.ReadTime-io1.ReadTime) / interval / 60) - } - writeTime := int64(0) - if io2.WriteTime != 0 && io1.WriteTime != 0 && io2.WriteTime > io1.WriteTime { - writeTime = int64(float64(io2.WriteTime-io1.WriteTime) / interval / 60) - } - if writeTime > itemIO.Time { - itemIO.Time = writeTime - } - ioList = append(ioList, itemIO) - break - } - } - } - if err := s.monitorRepository.BatchCreateMonitorIO(ioList); err != nil { - logger.Errorf("BatchCreateMonitorIO err: %v", err) - } - s.diskIO <- ioStat2 - } - } - } -} - -func (s *MonitorImpl) saveNetDataToDB(ctx context.Context, interval float64) { - defer close(s.netIO) - for { - select { - case <-ctx.Done(): - return - case netStat := <-s.netIO: - select { - case <-ctx.Done(): - return - case netStat2 := <-s.netIO: - var netList []model.MonitorNetwork - timeMilli := time.Now().UnixMilli() - for _, net2 := range netStat2 { - for _, net1 := range netStat { - if net2.Name == net1.Name { - var itemNet model.MonitorNetwork - itemNet.CreateTime = timeMilli - itemNet.NeType = "#" - itemNet.NeID = "#" - itemNet.Name = net1.Name - - if net2.BytesSent != 0 && net1.BytesSent != 0 && net2.BytesSent > net1.BytesSent { - itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / interval / 60 - } - if net2.BytesRecv != 0 && net1.BytesRecv != 0 && net2.BytesRecv > net1.BytesRecv { - itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / interval / 60 - } - netList = append(netList, itemNet) - break - } - } - } - - if err := s.monitorRepository.BatchCreateMonitorNet(netList); err != nil { - logger.Errorf("BatchCreateMonitorNet err: %v", err) - } - s.netIO <- netStat2 - } - } - } -} - -// SelectMonitorInfo 查询监控资源信息 -func (s *MonitorImpl) SelectMonitorInfo(query map[string]any) map[string]any { - infoType := query["type"] - startTimeMilli := query["startTime"] - endTimeMilli := query["endTime"] - neType := query["neType"] - neId := query["neId"] - name := query["name"] - - // 返回数据 - backDatas := map[string]any{} - - // 基本信息 - if infoType == "all" || infoType == "load" || infoType == "cpu" || infoType == "memory" { - rows := s.monitorRepository.SelectMonitorBase(map[string]any{ - "startTime": startTimeMilli, - "endTime": endTimeMilli, - "neType": neType, - "neId": neId, - }) - backDatas["base"] = rows - } - - // 磁盘IO - if infoType == "all" || infoType == "io" { - rows := s.monitorRepository.SelectMonitorIO(map[string]any{ - "startTime": startTimeMilli, - "endTime": endTimeMilli, - "neType": neType, - "neId": neId, - "name": name, - }) - backDatas["io"] = rows - } - - // 网络 - if infoType == "all" || infoType == "network" { - rows := s.monitorRepository.SelectMonitorNetwork(map[string]any{ - "startTime": startTimeMilli, - "endTime": endTimeMilli, - "neType": neType, - "neId": neId, - "name": name, - }) - backDatas["network"] = rows - } - - return backDatas -} diff --git a/src/modules/monitor/service/monitor_test.go b/src/modules/monitor/service/monitor_test.go index 00ae73e8..44dd2a72 100644 --- a/src/modules/monitor/service/monitor_test.go +++ b/src/modules/monitor/service/monitor_test.go @@ -12,10 +12,6 @@ import ( "github.com/shirou/gopsutil/v4/net" ) -func init() { - -} - func TestInfo(t *testing.T) { s := MonitorInfo{} s.load(0.5) // 0.5 半分钟 @@ -36,17 +32,21 @@ func (m *MonitorInfo) load(interval float64) { var itemBase MonitorBase itemBase.CreateTime = time.Now().UnixMilli() - totalPercent, _ := cpu.Percent(3*time.Second, false) - if len(totalPercent) == 1 { - itemBase.CPU = totalPercent[0] - } - cpuCount, _ := cpu.Counts(false) - loadInfo, _ := load.Avg() itemBase.CPULoad1 = loadInfo.Load1 itemBase.CPULoad5 = loadInfo.Load5 itemBase.CPULoad15 = loadInfo.Load15 - itemBase.LoadUsage = loadInfo.Load1 / (float64(cpuCount*2) * 0.75) * 100 + + totalPercent, _ := cpu.Percent(3*time.Second, false) + if len(totalPercent) > 0 { + itemBase.CPU = totalPercent[0] + } + cpuCount, _ := cpu.Counts(false) + cpuAvg := (float64(cpuCount*2) * 0.75) * 100 + itemBase.LoadUsage = 0 + if cpuAvg > 0 { + itemBase.LoadUsage = loadInfo.Load1 / cpuAvg + } memoryInfo, _ := mem.VirtualMemory() itemBase.Memory = memoryInfo.UsedPercent diff --git a/src/modules/monitor/service/sys_job.go b/src/modules/monitor/service/sys_job.go index f4beb36c..af1ca91e 100644 --- a/src/modules/monitor/service/sys_job.go +++ b/src/modules/monitor/service/sys_job.go @@ -1,35 +1,169 @@ package service import ( + "fmt" + + "be.ems/src/framework/constants/common" + "be.ems/src/framework/cron" "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) -// ISysJob 调度任务信息 服务层接口 -type ISysJob interface { - // SelectJobPage 分页查询调度任务集合 - SelectJobPage(query map[string]any) map[string]any - - // SelectJobList 查询调度任务集合 - SelectJobList(sysJob model.SysJob) []model.SysJob - - // SelectJobById 通过调度ID查询调度任务信息 - SelectJobById(jobId string) model.SysJob - - // CheckUniqueJobName 校验调度任务名称和组是否唯一 - CheckUniqueJobName(jobName, jobGroup, jobId string) bool - - // InsertJob 新增调度任务信息 - InsertJob(sysJob model.SysJob) string - - // UpdateJob 修改调度任务信息 - UpdateJob(sysJob model.SysJob) int64 - - // DeleteJobByIds 批量删除调度任务信息 - DeleteJobByIds(jobIds []string) (int64, error) - - // RunQueueJob 立即运行一次调度任务 - RunQueueJob(sysJob model.SysJob) bool - - // ResetQueueJob 重置初始调度任务 - ResetQueueJob() +// 实例化服务层 SysJob 结构体 +var NewSysJob = &SysJob{ + sysJobRepository: repository.NewSysJobImpl, +} + +// SysJob 调度任务 服务层处理 +type SysJob struct { + // 调度任务数据信息 + sysJobRepository repository.ISysJob +} + +// SelectJobPage 分页查询调度任务集合 +func (r *SysJob) SelectJobPage(query map[string]any) map[string]any { + return r.sysJobRepository.SelectJobPage(query) +} + +// SelectJobList 查询调度任务集合 +func (r *SysJob) SelectJobList(sysJob model.SysJob) []model.SysJob { + return r.sysJobRepository.SelectJobList(sysJob) +} + +// SelectJobById 通过调度ID查询调度任务信息 +func (r *SysJob) SelectJobById(jobId string) model.SysJob { + if jobId == "" { + return model.SysJob{} + } + jobs := r.sysJobRepository.SelectJobByIds([]string{jobId}) + if len(jobs) > 0 { + return jobs[0] + } + return model.SysJob{} +} + +// CheckUniqueJobName 校验调度任务名称和组是否唯一 +func (r *SysJob) CheckUniqueJobName(jobName, jobGroup, jobId string) bool { + uniqueId := r.sysJobRepository.CheckUniqueJob(model.SysJob{ + JobName: jobName, + JobGroup: jobGroup, + }) + if uniqueId == jobId { + return true + } + return uniqueId == "" +} + +// InsertJob 新增调度任务信息 +func (r *SysJob) InsertJob(sysJob model.SysJob) string { + insertId := r.sysJobRepository.InsertJob(sysJob) + if insertId == "" && sysJob.Status == common.STATUS_YES { + sysJob.JobID = insertId + r.insertQueueJob(sysJob, true) + } + return insertId +} + +// UpdateJob 修改调度任务信息 +func (r *SysJob) UpdateJob(sysJob model.SysJob) int64 { + rows := r.sysJobRepository.UpdateJob(sysJob) + if rows > 0 { + //状态正常添加队列任务 + if sysJob.Status == common.STATUS_YES { + r.insertQueueJob(sysJob, true) + } + // 状态禁用删除队列任务 + if sysJob.Status == common.STATUS_NO { + r.deleteQueueJob(sysJob) + } + } + return rows +} + +// DeleteJobByIds 批量删除调度任务信息 +func (r *SysJob) DeleteJobByIds(jobIds []string) (int64, error) { + // 检查是否存在 + jobs := r.sysJobRepository.SelectJobByIds(jobIds) + if len(jobs) <= 0 { + // 没有可访问调度任务数据! + return 0, fmt.Errorf("there is no accessible scheduling task data") + } + if len(jobs) == len(jobIds) { + // 清除任务 + for _, job := range jobs { + r.deleteQueueJob(job) + } + rows := r.sysJobRepository.DeleteJobByIds(jobIds) + return rows, nil + } + // 删除调度任务信息失败! + return 0, fmt.Errorf("failed to delete scheduling task information") +} + +// ResetQueueJob 重置初始调度任务 +func (r *SysJob) ResetQueueJob() { + // 获取注册的队列名称 + queueNames := cron.QueueNames() + if len(queueNames) == 0 { + return + } + // 查询系统中定义状态为正常启用的任务 + sysJobs := r.sysJobRepository.SelectJobList(model.SysJob{ + Status: common.STATUS_YES, + }) + for _, sysJob := range sysJobs { + for _, name := range queueNames { + if name == sysJob.InvokeTarget { + r.insertQueueJob(sysJob, true) + } + } + } +} + +// RunQueueJob 立即运行一次调度任务 +func (r *SysJob) RunQueueJob(sysJob model.SysJob) bool { + return r.insertQueueJob(sysJob, false) +} + +// insertQueueJob 添加调度任务 +func (r *SysJob) insertQueueJob(sysJob model.SysJob, repeat bool) bool { + // 获取队列 Processor + queue := cron.GetQueue(sysJob.InvokeTarget) + if queue.Name != sysJob.InvokeTarget { + return false + } + + // 给执行任务数据参数 + options := cron.JobData{ + Repeat: repeat, + SysJob: sysJob, + } + + // 不是重复任务的情况,立即执行一次 + if !repeat { + // 执行单次任务 + status := queue.RunJob(options, cron.JobOptions{ + JobId: sysJob.JobID, + }) + // 执行中或等待中的都返回正常 + return status == cron.Active || status == cron.Waiting + } + + // 执行重复任务 + queue.RunJob(options, cron.JobOptions{ + JobId: sysJob.JobID, + Cron: sysJob.CronExpression, + }) + + return true +} + +// deleteQueueJob 删除调度任务 +func (r *SysJob) deleteQueueJob(sysJob model.SysJob) bool { + // 获取队列 Processor + queue := cron.GetQueue(sysJob.InvokeTarget) + if queue.Name != sysJob.InvokeTarget { + return false + } + return queue.RemoveJob(sysJob.JobID) } diff --git a/src/modules/monitor/service/sys_job.impl.go b/src/modules/monitor/service/sys_job.impl.go deleted file mode 100644 index 81fd7e7e..00000000 --- a/src/modules/monitor/service/sys_job.impl.go +++ /dev/null @@ -1,169 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/framework/constants/common" - "be.ems/src/framework/cron" - "be.ems/src/modules/monitor/model" - "be.ems/src/modules/monitor/repository" -) - -// 实例化服务层 SysJobImpl 结构体 -var NewSysJobImpl = &SysJobImpl{ - sysJobRepository: repository.NewSysJobImpl, -} - -// SysJobImpl 调度任务 服务层处理 -type SysJobImpl struct { - // 调度任务数据信息 - sysJobRepository repository.ISysJob -} - -// SelectJobPage 分页查询调度任务集合 -func (r *SysJobImpl) SelectJobPage(query map[string]any) map[string]any { - return r.sysJobRepository.SelectJobPage(query) -} - -// SelectJobList 查询调度任务集合 -func (r *SysJobImpl) SelectJobList(sysJob model.SysJob) []model.SysJob { - return r.sysJobRepository.SelectJobList(sysJob) -} - -// SelectJobById 通过调度ID查询调度任务信息 -func (r *SysJobImpl) SelectJobById(jobId string) model.SysJob { - if jobId == "" { - return model.SysJob{} - } - jobs := r.sysJobRepository.SelectJobByIds([]string{jobId}) - if len(jobs) > 0 { - return jobs[0] - } - return model.SysJob{} -} - -// CheckUniqueJobName 校验调度任务名称和组是否唯一 -func (r *SysJobImpl) CheckUniqueJobName(jobName, jobGroup, jobId string) bool { - uniqueId := r.sysJobRepository.CheckUniqueJob(model.SysJob{ - JobName: jobName, - JobGroup: jobGroup, - }) - if uniqueId == jobId { - return true - } - return uniqueId == "" -} - -// InsertJob 新增调度任务信息 -func (r *SysJobImpl) InsertJob(sysJob model.SysJob) string { - insertId := r.sysJobRepository.InsertJob(sysJob) - if insertId == "" && sysJob.Status == common.STATUS_YES { - sysJob.JobID = insertId - r.insertQueueJob(sysJob, true) - } - return insertId -} - -// UpdateJob 修改调度任务信息 -func (r *SysJobImpl) UpdateJob(sysJob model.SysJob) int64 { - rows := r.sysJobRepository.UpdateJob(sysJob) - if rows > 0 { - //状态正常添加队列任务 - if sysJob.Status == common.STATUS_YES { - r.insertQueueJob(sysJob, true) - } - // 状态禁用删除队列任务 - if sysJob.Status == common.STATUS_NO { - r.deleteQueueJob(sysJob) - } - } - return rows -} - -// DeleteJobByIds 批量删除调度任务信息 -func (r *SysJobImpl) DeleteJobByIds(jobIds []string) (int64, error) { - // 检查是否存在 - jobs := r.sysJobRepository.SelectJobByIds(jobIds) - if len(jobs) <= 0 { - // 没有可访问调度任务数据! - return 0, fmt.Errorf("there is no accessible scheduling task data") - } - if len(jobs) == len(jobIds) { - // 清除任务 - for _, job := range jobs { - r.deleteQueueJob(job) - } - rows := r.sysJobRepository.DeleteJobByIds(jobIds) - return rows, nil - } - // 删除调度任务信息失败! - return 0, fmt.Errorf("failed to delete scheduling task information") -} - -// ResetQueueJob 重置初始调度任务 -func (r *SysJobImpl) ResetQueueJob() { - // 获取注册的队列名称 - queueNames := cron.QueueNames() - if len(queueNames) == 0 { - return - } - // 查询系统中定义状态为正常启用的任务 - sysJobs := r.sysJobRepository.SelectJobList(model.SysJob{ - Status: common.STATUS_YES, - }) - for _, sysJob := range sysJobs { - for _, name := range queueNames { - if name == sysJob.InvokeTarget { - r.insertQueueJob(sysJob, true) - } - } - } -} - -// RunQueueJob 立即运行一次调度任务 -func (r *SysJobImpl) RunQueueJob(sysJob model.SysJob) bool { - return r.insertQueueJob(sysJob, false) -} - -// insertQueueJob 添加调度任务 -func (r *SysJobImpl) insertQueueJob(sysJob model.SysJob, repeat bool) bool { - // 获取队列 Processor - queue := cron.GetQueue(sysJob.InvokeTarget) - if queue.Name != sysJob.InvokeTarget { - return false - } - - // 给执行任务数据参数 - options := cron.JobData{ - Repeat: repeat, - SysJob: sysJob, - } - - // 不是重复任务的情况,立即执行一次 - if !repeat { - // 执行单次任务 - status := queue.RunJob(options, cron.JobOptions{ - JobId: sysJob.JobID, - }) - // 执行中或等待中的都返回正常 - return status == cron.Active || status == cron.Waiting - } - - // 执行重复任务 - queue.RunJob(options, cron.JobOptions{ - JobId: sysJob.JobID, - Cron: sysJob.CronExpression, - }) - - return true -} - -// deleteQueueJob 删除调度任务 -func (r *SysJobImpl) deleteQueueJob(sysJob model.SysJob) bool { - // 获取队列 Processor - queue := cron.GetQueue(sysJob.InvokeTarget) - if queue.Name != sysJob.InvokeTarget { - return false - } - return queue.RemoveJob(sysJob.JobID) -} diff --git a/src/modules/monitor/service/sys_job_log.go b/src/modules/monitor/service/sys_job_log.go index b1e227e2..185c17a0 100644 --- a/src/modules/monitor/service/sys_job_log.go +++ b/src/modules/monitor/service/sys_job_log.go @@ -2,22 +2,41 @@ package service import ( "be.ems/src/modules/monitor/model" + "be.ems/src/modules/monitor/repository" ) -// ISysJobLog 调度任务日志 服务层接口 -type ISysJobLog interface { - // SelectJobLogPage 分页查询调度任务日志集合 - SelectJobLogPage(query map[string]any) map[string]any - - // SelectJobLogList 查询调度任务日志集合 - SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog - - // SelectJobLogById 通过调度ID查询调度任务日志信息 - SelectJobLogById(jobLogId string) model.SysJobLog - - // DeleteJobLogByIds 批量删除调度任务日志信息 - DeleteJobLogByIds(jobLogIds []string) int64 - - // CleanJobLog 清空调度任务日志 - CleanJobLog() error +// 实例化服务层 SysJobLog 结构体 +var NewSysJobLog = &SysJobLog{ + sysJobLogRepository: repository.NewSysJobLogImpl, +} + +// SysJobLog 调度任务日志 服务层处理 +type SysJobLog struct { + // 调度任务日志数据信息 + sysJobLogRepository repository.ISysJobLog +} + +// SelectJobLogPage 分页查询调度任务日志集合 +func (s *SysJobLog) SelectJobLogPage(query map[string]any) map[string]any { + return s.sysJobLogRepository.SelectJobLogPage(query) +} + +// SelectJobLogList 查询调度任务日志集合 +func (s *SysJobLog) SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog { + return s.sysJobLogRepository.SelectJobLogList(sysJobLog) +} + +// SelectJobLogById 通过调度ID查询调度任务日志信息 +func (s *SysJobLog) SelectJobLogById(jobLogId string) model.SysJobLog { + return s.sysJobLogRepository.SelectJobLogById(jobLogId) +} + +// DeleteJobLogByIds 批量删除调度任务日志信息 +func (s *SysJobLog) DeleteJobLogByIds(jobLogIds []string) int64 { + return s.sysJobLogRepository.DeleteJobLogByIds(jobLogIds) +} + +// CleanJobLog 清空调度任务日志 +func (s *SysJobLog) CleanJobLog() error { + return s.sysJobLogRepository.CleanJobLog() } diff --git a/src/modules/monitor/service/sys_job_log.impl.go b/src/modules/monitor/service/sys_job_log.impl.go deleted file mode 100644 index 692d40a3..00000000 --- a/src/modules/monitor/service/sys_job_log.impl.go +++ /dev/null @@ -1,42 +0,0 @@ -package service - -import ( - "be.ems/src/modules/monitor/model" - "be.ems/src/modules/monitor/repository" -) - -// 实例化服务层 SysJobLogImpl 结构体 -var NewSysJobLogImpl = &SysJobLogImpl{ - sysJobLogRepository: repository.NewSysJobLogImpl, -} - -// SysJobLogImpl 调度任务日志 服务层处理 -type SysJobLogImpl struct { - // 调度任务日志数据信息 - sysJobLogRepository repository.ISysJobLog -} - -// SelectJobLogPage 分页查询调度任务日志集合 -func (s *SysJobLogImpl) SelectJobLogPage(query map[string]any) map[string]any { - return s.sysJobLogRepository.SelectJobLogPage(query) -} - -// SelectJobLogList 查询调度任务日志集合 -func (s *SysJobLogImpl) SelectJobLogList(sysJobLog model.SysJobLog) []model.SysJobLog { - return s.sysJobLogRepository.SelectJobLogList(sysJobLog) -} - -// SelectJobLogById 通过调度ID查询调度任务日志信息 -func (s *SysJobLogImpl) SelectJobLogById(jobLogId string) model.SysJobLog { - return s.sysJobLogRepository.SelectJobLogById(jobLogId) -} - -// DeleteJobLogByIds 批量删除调度任务日志信息 -func (s *SysJobLogImpl) DeleteJobLogByIds(jobLogIds []string) int64 { - return s.sysJobLogRepository.DeleteJobLogByIds(jobLogIds) -} - -// CleanJobLog 清空调度任务日志 -func (s *SysJobLogImpl) CleanJobLog() error { - return s.sysJobLogRepository.CleanJobLog() -} diff --git a/src/modules/monitor/service/sys_user_online.go b/src/modules/monitor/service/sys_user_online.go index c6aef2cd..1d7115d8 100644 --- a/src/modules/monitor/service/sys_user_online.go +++ b/src/modules/monitor/service/sys_user_online.go @@ -5,8 +5,29 @@ import ( "be.ems/src/modules/monitor/model" ) -// ISysUserOnline 在线用户 服务层接口 -type ISysUserOnline interface { - // LoginUserToUserOnline 设置在线用户信息 - LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline +// 实例化服务层 SysUserOnline 结构体 +var NewSysUserOnline = &SysUserOnline{} + +// SysUserOnline 在线用户 服务层处理 +type SysUserOnline struct{} + +// LoginUserToUserOnline 设置在线用户信息 +func (r *SysUserOnline) LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline { + if loginUser.UserID == "" { + return model.SysUserOnline{} + } + + sysUserOnline := model.SysUserOnline{ + TokenID: loginUser.UUID, + UserName: loginUser.User.UserName, + IPAddr: loginUser.IPAddr, + LoginLocation: loginUser.LoginLocation, + Browser: loginUser.Browser, + OS: loginUser.OS, + LoginTime: loginUser.LoginTime, + } + if loginUser.User.DeptID != "" { + sysUserOnline.DeptName = loginUser.User.Dept.DeptName + } + return sysUserOnline } diff --git a/src/modules/monitor/service/sys_user_online.impl.go b/src/modules/monitor/service/sys_user_online.impl.go deleted file mode 100644 index 99c0ec4f..00000000 --- a/src/modules/monitor/service/sys_user_online.impl.go +++ /dev/null @@ -1,33 +0,0 @@ -package service - -import ( - "be.ems/src/framework/vo" - "be.ems/src/modules/monitor/model" -) - -// 实例化服务层 SysUserOnlineImpl 结构体 -var NewSysUserOnlineImpl = &SysUserOnlineImpl{} - -// SysUserOnlineImpl 在线用户 服务层处理 -type SysUserOnlineImpl struct{} - -// LoginUserToUserOnline 设置在线用户信息 -func (r *SysUserOnlineImpl) LoginUserToUserOnline(loginUser vo.LoginUser) model.SysUserOnline { - if loginUser.UserID == "" { - return model.SysUserOnline{} - } - - sysUserOnline := model.SysUserOnline{ - TokenID: loginUser.UUID, - UserName: loginUser.User.UserName, - IPAddr: loginUser.IPAddr, - LoginLocation: loginUser.LoginLocation, - Browser: loginUser.Browser, - OS: loginUser.OS, - LoginTime: loginUser.LoginTime, - } - if loginUser.User.DeptID != "" { - sysUserOnline.DeptName = loginUser.User.Dept.DeptName - } - return sysUserOnline -} diff --git a/src/modules/monitor/service/system_info.go b/src/modules/monitor/service/system_info.go index a6e9a51d..3fda7b7b 100644 --- a/src/modules/monitor/service/system_info.go +++ b/src/modules/monitor/service/system_info.go @@ -1,22 +1,177 @@ package service -// ISystemInfo 服务器系统相关信息 服务层接口 -type ISystemInfo interface { - // SystemInfo 系统信息 - SystemInfo() map[string]any +import ( + "context" + "fmt" + "os" + "runtime" + "strings" + "time" - // TimeInfo 系统时间信息 - TimeInfo() map[string]string + "be.ems/src/framework/config" + "be.ems/src/framework/utils/parse" - // MemoryInfo 内存信息 - MemoryInfo() map[string]any + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/disk" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/mem" + "github.com/shirou/gopsutil/v4/net" +) - // CPUInfo CPU信息 - CPUInfo() map[string]any +// 实例化服务层 SystemInfo 结构体 +var NewSystemInfo = &SystemInfo{} - // NetworkInfo 网络信息 - NetworkInfo() map[string]string +// SystemInfo 服务器系统相关信息 服务层处理 +type SystemInfo struct{} - // DiskInfo 磁盘信息 - DiskInfo() []map[string]string +// SystemInfo 系统信息 +func (s *SystemInfo) SystemInfo() map[string]any { + info, err := host.Info() + if err != nil { + info.Platform = err.Error() + } + // 获取主机运行时间 + bootTime := time.Since(time.Unix(int64(info.BootTime), 0)).Seconds() + // 获取程序运行时间 + runTime := time.Since(config.RunTime()).Abs().Seconds() + return map[string]any{ + "platform": info.Platform, + "platformVersion": info.PlatformVersion, + "arch": info.KernelArch, + "archVersion": info.KernelVersion, + "os": info.OS, + "hostname": info.Hostname, + "bootTime": int64(bootTime), + "processId": os.Getpid(), + "runArch": runtime.GOARCH, + "runVersion": runtime.Version(), + "runTime": int64(runTime), + } +} + +// TimeInfo 系统时间信息 +func (s *SystemInfo) TimeInfo() map[string]string { + now := time.Now() + // 获取当前时间 + current := now.Format("2006-01-02 15:04:05") + // 获取时区 + timezone := now.Format("-0700 MST") + // 获取时区名称 + timezoneName := now.Format("MST") + + return map[string]string{ + "current": current, + "timezone": timezone, + "timezoneName": timezoneName, + } +} + +// MemoryInfo 内存信息 +func (s *SystemInfo) MemoryInfo() map[string]any { + memInfo, err := mem.VirtualMemory() + if err != nil { + memInfo.UsedPercent = 0 + memInfo.Available = 0 + memInfo.Total = 0 + } + + var memStats runtime.MemStats + runtime.ReadMemStats(&memStats) + + return map[string]any{ + "usage": fmt.Sprintf("%.2f", memInfo.UsedPercent), // 内存利用率 + "freemem": parse.Bit(float64(memInfo.Available)), // 可用内存大小(GB) + "totalmem": parse.Bit(float64(memInfo.Total)), // 总内存大小(GB) + "rss": parse.Bit(float64(memStats.Sys)), // 常驻内存大小(RSS) + "heapTotal": parse.Bit(float64(memStats.HeapSys)), // 堆总大小 + "heapUsed": parse.Bit(float64(memStats.HeapAlloc)), // 堆已使用大小 + "external": parse.Bit(float64(memStats.Sys - memStats.HeapSys)), // 外部内存大小(非堆) + } +} + +// CPUInfo CPU信息 +func (s *SystemInfo) CPUInfo() map[string]any { + var core int = 0 + var speed string = "未知" + var model string = "未知" + cpuInfo, err := cpu.Info() + if err == nil { + core = runtime.NumCPU() + speed = fmt.Sprintf("%.0fMHz", cpuInfo[0].Mhz) + model = strings.TrimSpace(cpuInfo[0].ModelName) + } + + useds := []string{} + cpuPercent, err := cpu.Percent(0, true) + if err == nil { + for _, v := range cpuPercent { + useds = append(useds, fmt.Sprintf("%.2f", v)) + } + } + + return map[string]any{ + "model": model, + "speed": speed, + "core": core, + "coreUsed": useds, + } +} + +// NetworkInfo 网络信息 +func (s *SystemInfo) NetworkInfo() map[string]string { + ipAddrs := make(map[string]string) + interfaces, err := net.Interfaces() + if err == nil { + for _, iface := range interfaces { + name := iface.Name + if name[len(name)-1] == '0' { + name = name[0 : len(name)-1] + name = strings.Trim(name, "") + } + // ignore localhost + if name == "lo" { + continue + } + var addrs []string + for _, v := range iface.Addrs { + prefix := strings.Split(v.Addr, "/")[0] + if strings.Contains(prefix, "::") { + addrs = append(addrs, fmt.Sprintf("IPv6 %s", prefix)) + } + if strings.Contains(prefix, ".") { + addrs = append(addrs, fmt.Sprintf("IPv4 %s", prefix)) + } + } + ipAddrs[name] = strings.Join(addrs, " / ") + } + } + return ipAddrs +} + +// DiskInfo 磁盘信息 +func (s *SystemInfo) DiskInfo() []map[string]string { + disks := make([]map[string]string, 0) + ctx := context.Background() + ctx, cancel := context.WithTimeout(ctx, 2*time.Second) + defer cancel() + + partitions, err := disk.PartitionsWithContext(ctx, false) + if err != nil && err != context.DeadlineExceeded { + return disks + } + + for _, partition := range partitions { + usage, err := disk.Usage(partition.Mountpoint) + if err != nil { + continue + } + disks = append(disks, map[string]string{ + "size": parse.Bit(float64(usage.Total)), + "used": parse.Bit(float64(usage.Used)), + "avail": parse.Bit(float64(usage.Free)), + "pcent": fmt.Sprintf("%.1f%%", usage.UsedPercent), + "target": partition.Device, + }) + } + return disks } diff --git a/src/modules/monitor/service/system_info.impl.go b/src/modules/monitor/service/system_info.impl.go deleted file mode 100644 index 43feba5c..00000000 --- a/src/modules/monitor/service/system_info.impl.go +++ /dev/null @@ -1,177 +0,0 @@ -package service - -import ( - "context" - "fmt" - "os" - "runtime" - "strings" - "time" - - "be.ems/src/framework/config" - "be.ems/src/framework/utils/parse" - - "github.com/shirou/gopsutil/v4/cpu" - "github.com/shirou/gopsutil/v4/disk" - "github.com/shirou/gopsutil/v4/host" - "github.com/shirou/gopsutil/v4/mem" - "github.com/shirou/gopsutil/v4/net" -) - -// 实例化服务层 SystemInfoImpl 结构体 -var NewSystemInfoImpl = &SystemInfoImpl{} - -// SystemInfoImpl 服务器系统相关信息 服务层处理 -type SystemInfoImpl struct{} - -// SystemInfo 系统信息 -func (s *SystemInfoImpl) SystemInfo() map[string]any { - info, err := host.Info() - if err != nil { - info.Platform = err.Error() - } - // 获取主机运行时间 - bootTime := time.Since(time.Unix(int64(info.BootTime), 0)).Seconds() - // 获取程序运行时间 - runTime := time.Since(config.RunTime()).Abs().Seconds() - return map[string]any{ - "platform": info.Platform, - "platformVersion": info.PlatformVersion, - "arch": info.KernelArch, - "archVersion": info.KernelVersion, - "os": info.OS, - "hostname": info.Hostname, - "bootTime": int64(bootTime), - "processId": os.Getpid(), - "runArch": runtime.GOARCH, - "runVersion": runtime.Version(), - "runTime": int64(runTime), - } -} - -// TimeInfo 系统时间信息 -func (s *SystemInfoImpl) TimeInfo() map[string]string { - now := time.Now() - // 获取当前时间 - current := now.Format("2006-01-02 15:04:05") - // 获取时区 - timezone := now.Format("-0700 MST") - // 获取时区名称 - timezoneName := now.Format("MST") - - return map[string]string{ - "current": current, - "timezone": timezone, - "timezoneName": timezoneName, - } -} - -// MemoryInfo 内存信息 -func (s *SystemInfoImpl) MemoryInfo() map[string]any { - memInfo, err := mem.VirtualMemory() - if err != nil { - memInfo.UsedPercent = 0 - memInfo.Available = 0 - memInfo.Total = 0 - } - - var memStats runtime.MemStats - runtime.ReadMemStats(&memStats) - - return map[string]any{ - "usage": fmt.Sprintf("%.2f", memInfo.UsedPercent), // 内存利用率 - "freemem": parse.Bit(float64(memInfo.Available)), // 可用内存大小(GB) - "totalmem": parse.Bit(float64(memInfo.Total)), // 总内存大小(GB) - "rss": parse.Bit(float64(memStats.Sys)), // 常驻内存大小(RSS) - "heapTotal": parse.Bit(float64(memStats.HeapSys)), // 堆总大小 - "heapUsed": parse.Bit(float64(memStats.HeapAlloc)), // 堆已使用大小 - "external": parse.Bit(float64(memStats.Sys - memStats.HeapSys)), // 外部内存大小(非堆) - } -} - -// CPUInfo CPU信息 -func (s *SystemInfoImpl) CPUInfo() map[string]any { - var core int = 0 - var speed string = "未知" - var model string = "未知" - cpuInfo, err := cpu.Info() - if err == nil { - core = runtime.NumCPU() - speed = fmt.Sprintf("%.0fMHz", cpuInfo[0].Mhz) - model = strings.TrimSpace(cpuInfo[0].ModelName) - } - - useds := []string{} - cpuPercent, err := cpu.Percent(0, true) - if err == nil { - for _, v := range cpuPercent { - useds = append(useds, fmt.Sprintf("%.2f", v)) - } - } - - return map[string]any{ - "model": model, - "speed": speed, - "core": core, - "coreUsed": useds, - } -} - -// NetworkInfo 网络信息 -func (s *SystemInfoImpl) NetworkInfo() map[string]string { - ipAddrs := make(map[string]string) - interfaces, err := net.Interfaces() - if err == nil { - for _, iface := range interfaces { - name := iface.Name - if name[len(name)-1] == '0' { - name = name[0 : len(name)-1] - name = strings.Trim(name, "") - } - // ignore localhost - if name == "lo" { - continue - } - var addrs []string - for _, v := range iface.Addrs { - prefix := strings.Split(v.Addr, "/")[0] - if strings.Contains(prefix, "::") { - addrs = append(addrs, fmt.Sprintf("IPv6 %s", prefix)) - } - if strings.Contains(prefix, ".") { - addrs = append(addrs, fmt.Sprintf("IPv4 %s", prefix)) - } - } - ipAddrs[name] = strings.Join(addrs, " / ") - } - } - return ipAddrs -} - -// DiskInfo 磁盘信息 -func (s *SystemInfoImpl) DiskInfo() []map[string]string { - disks := make([]map[string]string, 0) - ctx := context.Background() - ctx, cancel := context.WithTimeout(ctx, 2*time.Second) - defer cancel() - - partitions, err := disk.PartitionsWithContext(ctx, false) - if err != nil && err != context.DeadlineExceeded { - return disks - } - - for _, partition := range partitions { - usage, err := disk.Usage(partition.Mountpoint) - if err != nil { - continue - } - disks = append(disks, map[string]string{ - "size": parse.Bit(float64(usage.Total)), - "used": parse.Bit(float64(usage.Used)), - "avail": parse.Bit(float64(usage.Free)), - "pcent": fmt.Sprintf("%.1f%%", usage.UsedPercent), - "target": partition.Device, - }) - } - return disks -} diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index a41e95c9..746cbc3b 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -119,11 +119,11 @@ func (s *AMFController) UEExport(c *gin.Context) { "E1": "Time", } // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_type") + dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_auth_code") + dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_cm_state") + dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 051ceb1b..60aff2bb 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -130,9 +130,9 @@ func (s *IMSController) CDRExport(c *gin.Context) { "H1": "Time", } // 读取字典数据 CDR SIP响应代码类别类型 - dictCDRSipCode := sysService.NewSysDictDataImpl.SelectDictDataByType("cdr_sip_code") + dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code") // 读取字典数据 CDR 呼叫类型 - dictCDRCallType := sysService.NewSysDictDataImpl.SelectDictDataByType("cdr_call_type") + dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index 1c61daa0..ac26d60b 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -120,11 +120,11 @@ func (s *MMEController) UEExport(c *gin.Context) { "E1": "Time", } // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_type") + dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_auth_code") + dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictDataImpl.SelectDictDataByType("ue_event_cm_state") + dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { diff --git a/src/modules/system/controller/sys_dict_data.go b/src/modules/system/controller/sys_dict_data.go index 8e3d56bc..c3eec5f3 100644 --- a/src/modules/system/controller/sys_dict_data.go +++ b/src/modules/system/controller/sys_dict_data.go @@ -20,18 +20,16 @@ import ( // 实例化控制层 SysDictDataController 结构体 var NewSysDictData = &SysDictDataController{ - sysDictDataService: service.NewSysDictDataImpl, - sysDictTypeService: service.NewSysDictTypeImpl, + sysDictDataService: service.NewSysDictData, + sysDictTypeService: service.NewSysDictType, } // 字典类型对应的字典数据信息 // // PATH /system/dict/data type SysDictDataController struct { - // 字典数据服务 - sysDictDataService service.ISysDictData - // 字典类型服务 - sysDictTypeService service.ISysDictType + sysDictDataService *service.SysDictData // 字典数据服务 + sysDictTypeService *service.SysDictType // 字典类型服务 } // 字典数据列表 diff --git a/src/modules/system/controller/sys_dict_type.go b/src/modules/system/controller/sys_dict_type.go index 1af741e5..939cd3e3 100644 --- a/src/modules/system/controller/sys_dict_type.go +++ b/src/modules/system/controller/sys_dict_type.go @@ -21,15 +21,14 @@ import ( // 实例化控制层 SysDictTypeController 结构体 var NewSysDictType = &SysDictTypeController{ - sysDictTypeService: service.NewSysDictTypeImpl, + sysDictTypeService: service.NewSysDictType, } // 字典类型信息 // // PATH /system/dict/type type SysDictTypeController struct { - // 字典类型服务 - sysDictTypeService service.ISysDictType + sysDictTypeService *service.SysDictType // 字典类型服务 } // 字典类型列表 diff --git a/src/modules/system/controller/sys_role.go b/src/modules/system/controller/sys_role.go index 2300679c..c291c3fe 100644 --- a/src/modules/system/controller/sys_role.go +++ b/src/modules/system/controller/sys_role.go @@ -24,7 +24,7 @@ import ( var NewSysRole = &SysRoleController{ sysRoleService: service.NewSysRoleImpl, sysUserService: service.NewSysUserImpl, - sysDictDataService: service.NewSysDictDataImpl, + sysDictDataService: service.NewSysDictData, } // 角色信息 @@ -34,9 +34,8 @@ type SysRoleController struct { // 角色服务 sysRoleService service.ISysRole // 用户服务 - sysUserService service.ISysUser - // 字典数据服务 - sysDictDataService service.ISysDictData + sysUserService service.ISysUser + sysDictDataService *service.SysDictData // 字典数据服务 } // 角色列表 diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index 4eb2c10e..c6c521b4 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -28,7 +28,7 @@ var NewSysUser = &SysUserController{ sysUserService: service.NewSysUserImpl, sysRoleService: service.NewSysRoleImpl, sysPostService: service.NewSysPostImpl, - sysDictDataService: service.NewSysDictDataImpl, + sysDictDataService: service.NewSysDictData, sysConfigService: service.NewSysConfigImpl, } @@ -41,9 +41,8 @@ type SysUserController struct { // 角色服务 sysRoleService service.ISysRole // 岗位服务 - sysPostService service.ISysPost - // 字典数据服务 - sysDictDataService service.ISysDictData + sysPostService service.ISysPost + sysDictDataService *service.SysDictData // 字典数据服务 // 参数配置服务 sysConfigService service.ISysConfig } diff --git a/src/modules/system/repository/sys_dict_data.impl.go b/src/modules/system/repository/sys_dict_data.impl.go index 3782a14c..5231a2a6 100644 --- a/src/modules/system/repository/sys_dict_data.impl.go +++ b/src/modules/system/repository/sys_dict_data.impl.go @@ -13,7 +13,7 @@ import ( ) // 实例化数据层 SysDictDataImpl 结构体 -var NewSysDictDataImpl = &SysDictDataImpl{ +var NewSysDictData = &SysDictDataImpl{ selectSql: `select dict_code, dict_sort, dict_label, dict_value, dict_type, tag_class, tag_type, status, create_by, create_time, remark from sys_dict_data`, diff --git a/src/modules/system/repository/sys_dict_type.impl.go b/src/modules/system/repository/sys_dict_type.impl.go index 1da01121..db321360 100644 --- a/src/modules/system/repository/sys_dict_type.impl.go +++ b/src/modules/system/repository/sys_dict_type.impl.go @@ -13,7 +13,7 @@ import ( ) // 实例化数据层 SysDictTypeImpl 结构体 -var NewSysDictTypeImpl = &SysDictTypeImpl{ +var NewSysDictType = &SysDictTypeImpl{ selectSql: `select dict_id, dict_name, dict_type, status, create_by, create_time, remark from sys_dict_type`, diff --git a/src/modules/system/service/sys_dict_data.go b/src/modules/system/service/sys_dict_data.go index 716eb2ac..d5581078 100644 --- a/src/modules/system/service/sys_dict_data.go +++ b/src/modules/system/service/sys_dict_data.go @@ -1,33 +1,114 @@ package service -import "be.ems/src/modules/system/model" +import ( + "fmt" -// ISysDictData 字典类型数据 服务层接口 -type ISysDictData interface { - // SelectDictDataPage 根据条件分页查询字典数据 - SelectDictDataPage(query map[string]any) map[string]any + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectDictDataList 根据条件查询字典数据 - SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData - - // SelectDictDataByCode 根据字典数据编码查询信息 - SelectDictDataByCode(dictCode string) model.SysDictData - - // SelectDictDataByType 根据字典类型查询信息 - SelectDictDataByType(dictType string) []model.SysDictData - - // CheckUniqueDictLabel 校验字典标签是否唯一 - CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool - - // CheckUniqueDictValue 校验字典键值是否唯一 - CheckUniqueDictValue(dictType, dictValue, dictCode string) bool - - // DeleteDictDataByCodes 批量删除字典数据信息 - DeleteDictDataByCodes(dictCodes []string) (int64, error) - - // InsertDictData 新增字典数据信息 - InsertDictData(sysDictData model.SysDictData) string - - // UpdateDictData 修改字典数据信息 - UpdateDictData(sysDictData model.SysDictData) int64 +// 实例化服务层 SysDictData 结构体 +var NewSysDictData = &SysDictData{ + sysDictDataRepository: repository.NewSysDictData, + sysDictTypeService: NewSysDictType, +} + +// SysDictData 字典类型数据 服务层处理 +type SysDictData struct { + sysDictDataRepository repository.ISysDictData // 字典数据服务 + sysDictTypeService *SysDictType // 字典类型服务 +} + +// SelectDictDataPage 根据条件分页查询字典数据 +func (r *SysDictData) SelectDictDataPage(query map[string]any) map[string]any { + return r.sysDictDataRepository.SelectDictDataPage(query) +} + +// SelectDictDataList 根据条件查询字典数据 +func (r *SysDictData) SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData { + return r.sysDictDataRepository.SelectDictDataList(sysDictData) +} + +// SelectDictDataByCode 根据字典数据编码查询信息 +func (r *SysDictData) SelectDictDataByCode(dictCode string) model.SysDictData { + if dictCode == "" { + return model.SysDictData{} + } + dictCodes := r.sysDictDataRepository.SelectDictDataByCodes([]string{dictCode}) + if len(dictCodes) > 0 { + return dictCodes[0] + } + return model.SysDictData{} +} + +// SelectDictDataByType 根据字典类型查询信息 +func (r *SysDictData) SelectDictDataByType(dictType string) []model.SysDictData { + return r.sysDictTypeService.DictDataCache(dictType) +} + +// CheckUniqueDictLabel 校验字典标签是否唯一 +func (r *SysDictData) CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool { + uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ + DictType: dictType, + DictLabel: dictLabel, + }) + if uniqueId == dictCode { + return true + } + return uniqueId == "" +} + +// CheckUniqueDictValue 校验字典键值是否唯一 +func (r *SysDictData) CheckUniqueDictValue(dictType, dictValue, dictCode string) bool { + uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ + DictType: dictType, + DictValue: dictValue, + }) + if uniqueId == dictCode { + return true + } + return uniqueId == "" +} + +// DeleteDictDataByCodes 批量删除字典数据信息 +func (r *SysDictData) DeleteDictDataByCodes(dictCodes []string) (int64, error) { + // 检查是否存在 + dictDatas := r.sysDictDataRepository.SelectDictDataByCodes(dictCodes) + if len(dictDatas) <= 0 { + // 没有可访问字典编码数据! + return 0, fmt.Errorf("there is no accessible dictionary-encoded data") + } + if len(dictDatas) == len(dictCodes) { + for _, v := range dictDatas { + // 刷新缓存 + r.sysDictTypeService.ClearDictCache(v.DictType) + r.sysDictTypeService.LoadingDictCache(v.DictType) + } + rows := r.sysDictDataRepository.DeleteDictDataByCodes(dictCodes) + return rows, nil + } + // 删除字典数据信息失败! + return 0, fmt.Errorf("failed to delete dictionary data information") +} + +// InsertDictData 新增字典数据信息 +func (r *SysDictData) InsertDictData(sysDictData model.SysDictData) string { + insertId := r.sysDictDataRepository.InsertDictData(sysDictData) + if insertId != "" { + // 刷新缓存 + r.sysDictTypeService.ClearDictCache(sysDictData.DictType) + r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) + } + return insertId +} + +// UpdateDictData 修改字典数据信息 +func (r *SysDictData) UpdateDictData(sysDictData model.SysDictData) int64 { + rows := r.sysDictDataRepository.UpdateDictData(sysDictData) + if rows > 0 { + // 刷新缓存 + r.sysDictTypeService.ClearDictCache(sysDictData.DictType) + r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) + } + return rows } diff --git a/src/modules/system/service/sys_dict_data.impl.go b/src/modules/system/service/sys_dict_data.impl.go deleted file mode 100644 index 13dcf89a..00000000 --- a/src/modules/system/service/sys_dict_data.impl.go +++ /dev/null @@ -1,116 +0,0 @@ -package service - -import ( - "fmt" - - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysDictDataImpl 结构体 -var NewSysDictDataImpl = &SysDictDataImpl{ - sysDictDataRepository: repository.NewSysDictDataImpl, - sysDictTypeService: NewSysDictTypeImpl, -} - -// SysDictDataImpl 字典类型数据 服务层处理 -type SysDictDataImpl struct { - // 字典数据服务 - sysDictDataRepository repository.ISysDictData - // 字典类型服务 - sysDictTypeService ISysDictType -} - -// SelectDictDataPage 根据条件分页查询字典数据 -func (r *SysDictDataImpl) SelectDictDataPage(query map[string]any) map[string]any { - return r.sysDictDataRepository.SelectDictDataPage(query) -} - -// SelectDictDataList 根据条件查询字典数据 -func (r *SysDictDataImpl) SelectDictDataList(sysDictData model.SysDictData) []model.SysDictData { - return r.sysDictDataRepository.SelectDictDataList(sysDictData) -} - -// SelectDictDataByCode 根据字典数据编码查询信息 -func (r *SysDictDataImpl) SelectDictDataByCode(dictCode string) model.SysDictData { - if dictCode == "" { - return model.SysDictData{} - } - dictCodes := r.sysDictDataRepository.SelectDictDataByCodes([]string{dictCode}) - if len(dictCodes) > 0 { - return dictCodes[0] - } - return model.SysDictData{} -} - -// SelectDictDataByType 根据字典类型查询信息 -func (r *SysDictDataImpl) SelectDictDataByType(dictType string) []model.SysDictData { - return r.sysDictTypeService.DictDataCache(dictType) -} - -// CheckUniqueDictLabel 校验字典标签是否唯一 -func (r *SysDictDataImpl) CheckUniqueDictLabel(dictType, dictLabel, dictCode string) bool { - uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ - DictType: dictType, - DictLabel: dictLabel, - }) - if uniqueId == dictCode { - return true - } - return uniqueId == "" -} - -// CheckUniqueDictValue 校验字典键值是否唯一 -func (r *SysDictDataImpl) CheckUniqueDictValue(dictType, dictValue, dictCode string) bool { - uniqueId := r.sysDictDataRepository.CheckUniqueDictData(model.SysDictData{ - DictType: dictType, - DictValue: dictValue, - }) - if uniqueId == dictCode { - return true - } - return uniqueId == "" -} - -// DeleteDictDataByCodes 批量删除字典数据信息 -func (r *SysDictDataImpl) DeleteDictDataByCodes(dictCodes []string) (int64, error) { - // 检查是否存在 - dictDatas := r.sysDictDataRepository.SelectDictDataByCodes(dictCodes) - if len(dictDatas) <= 0 { - // 没有可访问字典编码数据! - return 0, fmt.Errorf("there is no accessible dictionary-encoded data") - } - if len(dictDatas) == len(dictCodes) { - for _, v := range dictDatas { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(v.DictType) - r.sysDictTypeService.LoadingDictCache(v.DictType) - } - rows := r.sysDictDataRepository.DeleteDictDataByCodes(dictCodes) - return rows, nil - } - // 删除字典数据信息失败! - return 0, fmt.Errorf("failed to delete dictionary data information") -} - -// InsertDictData 新增字典数据信息 -func (r *SysDictDataImpl) InsertDictData(sysDictData model.SysDictData) string { - insertId := r.sysDictDataRepository.InsertDictData(sysDictData) - if insertId != "" { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(sysDictData.DictType) - r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) - } - return insertId -} - -// UpdateDictData 修改字典数据信息 -func (r *SysDictDataImpl) UpdateDictData(sysDictData model.SysDictData) int64 { - rows := r.sysDictDataRepository.UpdateDictData(sysDictData) - if rows > 0 { - // 刷新缓存 - r.sysDictTypeService.ClearDictCache(sysDictData.DictType) - r.sysDictTypeService.LoadingDictCache(sysDictData.DictType) - } - return rows -} diff --git a/src/modules/system/service/sys_dict_type.go b/src/modules/system/service/sys_dict_type.go index 5171d22b..4008b327 100644 --- a/src/modules/system/service/sys_dict_type.go +++ b/src/modules/system/service/sys_dict_type.go @@ -1,45 +1,212 @@ package service -import "be.ems/src/modules/system/model" +import ( + "encoding/json" + "fmt" -// ISysDictType 字典类型 服务层接口 -type ISysDictType interface { - // SelectDictTypePage 根据条件分页查询字典类型 - SelectDictTypePage(query map[string]any) map[string]any + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/repository" +) - // SelectDictTypeList 根据条件查询字典类型 - SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType - - // SelectDictTypeByID 根据字典类型ID查询信息 - SelectDictTypeByID(dictID string) model.SysDictType - - // SelectDictTypeByType 根据字典类型查询信息 - SelectDictTypeByType(dictType string) model.SysDictType - - // CheckUniqueDictName 校验字典名称是否唯一 - CheckUniqueDictName(dictName, dictID string) bool - - // CheckUniqueDictType 校验字典类型是否唯一 - CheckUniqueDictType(dictType, dictID string) bool - - // InsertDictType 新增字典类型信息 - InsertDictType(sysDictType model.SysDictType) string - - // UpdateDictType 修改字典类型信息 - UpdateDictType(sysDictType model.SysDictType) int64 - - // DeleteDictTypeByIDs 批量删除字典类型信息 - DeleteDictTypeByIDs(dictIDs []string) (int64, error) - - // ResetDictCache 重置字典缓存数据 - ResetDictCache() - - // 加载字典缓存数据 - LoadingDictCache(dictType string) - - // 清空字典缓存数据 - ClearDictCache(dictType string) bool - - // DictDataCache 获取字典数据缓存数据 - DictDataCache(dictType string) []model.SysDictData +// 实例化服务层 SysDictType 结构体 +var NewSysDictType = &SysDictType{ + sysDictTypeRepository: repository.NewSysDictType, + sysDictDataRepository: repository.NewSysDictData, +} + +// SysDictType 字典类型 服务层处理 +type SysDictType struct { + // 字典类型服务 + sysDictTypeRepository repository.ISysDictType + // 字典数据服务 + sysDictDataRepository repository.ISysDictData +} + +// SelectDictTypePage 根据条件分页查询字典类型 +func (r *SysDictType) SelectDictTypePage(query map[string]any) map[string]any { + return r.sysDictTypeRepository.SelectDictTypePage(query) +} + +// SelectDictTypeList 根据条件查询字典类型 +func (r *SysDictType) SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType { + return r.sysDictTypeRepository.SelectDictTypeList(sysDictType) +} + +// SelectDictTypeByID 根据字典类型ID查询信息 +func (r *SysDictType) SelectDictTypeByID(dictID string) model.SysDictType { + if dictID == "" { + return model.SysDictType{} + } + dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{dictID}) + if len(dictTypes) > 0 { + return dictTypes[0] + } + return model.SysDictType{} +} + +// SelectDictTypeByType 根据字典类型查询信息 +func (r *SysDictType) SelectDictTypeByType(dictType string) model.SysDictType { + return r.sysDictTypeRepository.SelectDictTypeByType(dictType) +} + +// CheckUniqueDictName 校验字典名称是否唯一 +func (r *SysDictType) CheckUniqueDictName(dictName, dictID string) bool { + uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ + DictName: dictName, + }) + if uniqueId == dictID { + return true + } + return uniqueId == "" +} + +// CheckUniqueDictType 校验字典类型是否唯一 +func (r *SysDictType) CheckUniqueDictType(dictType, dictID string) bool { + uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ + DictType: dictType, + }) + if uniqueId == dictID { + return true + } + return uniqueId == "" +} + +// InsertDictType 新增字典类型信息 +func (r *SysDictType) InsertDictType(sysDictType model.SysDictType) string { + insertId := r.sysDictTypeRepository.InsertDictType(sysDictType) + if insertId != "" { + r.LoadingDictCache(sysDictType.DictType) + } + return insertId +} + +// UpdateDictType 修改字典类型信息 +func (r *SysDictType) UpdateDictType(sysDictType model.SysDictType) int64 { + data := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{sysDictType.DictID}) + if len(data) == 0 { + return 0 + } + // 修改字典类型key时同步更新其字典数据的类型key + oldDictType := data[0].DictType + rows := r.sysDictTypeRepository.UpdateDictType(sysDictType) + if rows > 0 && oldDictType != "" && oldDictType != sysDictType.DictType { + r.sysDictDataRepository.UpdateDictDataType(oldDictType, sysDictType.DictType) + } + // 刷新缓存 + r.ClearDictCache(oldDictType) + r.LoadingDictCache(sysDictType.DictType) + return rows +} + +// DeleteDictTypeByIDs 批量删除字典类型信息 +func (r *SysDictType) DeleteDictTypeByIDs(dictIDs []string) (int64, error) { + // 检查是否存在 + dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs(dictIDs) + if len(dictTypes) <= 0 { + // 没有可访问字典类型数据! + return 0, fmt.Errorf("there is no accessible dictionary type data") + } + for _, v := range dictTypes { + // 字典类型下级含有数据 + useCount := r.sysDictDataRepository.CountDictDataByType(v.DictType) + if useCount > 0 { + // 【%s】存在字典数据,不能删除 + return 0, fmt.Errorf("[%s] dictionary data exists and cannot be deleted", v.DictName) + } + // 清除缓存 + r.ClearDictCache(v.DictType) + } + if len(dictTypes) == len(dictIDs) { + rows := r.sysDictTypeRepository.DeleteDictTypeByIDs(dictIDs) + return rows, nil + } + // 删除字典数据信息失败! + return 0, fmt.Errorf("failed to delete dictionary data information") +} + +// ResetDictCache 重置字典缓存数据 +func (r *SysDictType) ResetDictCache() { + r.ClearDictCache("*") + r.LoadingDictCache("") +} + +// getCacheKey 组装缓存key +func (r *SysDictType) getDictCache(dictType string) string { + return cachekey.SYS_DICT_KEY + dictType +} + +// LoadingDictCache 加载字典缓存数据 +func (r *SysDictType) LoadingDictCache(dictType string) { + sysDictData := model.SysDictData{ + Status: common.STATUS_YES, + } + + // 指定字典类型 + if dictType != "" { + sysDictData.DictType = dictType + // 删除缓存 + key := r.getDictCache(dictType) + redis.Del("", key) + } + + sysDictDataList := r.sysDictDataRepository.SelectDictDataList(sysDictData) + if len(sysDictDataList) == 0 { + return + } + + // 将字典数据按类型分组 + m := make(map[string][]model.SysDictData, 0) + for _, v := range sysDictDataList { + key := v.DictType + if item, ok := m[key]; ok { + m[key] = append(item, v) + } else { + m[key] = []model.SysDictData{v} + } + } + + // 放入缓存 + for k, v := range m { + key := r.getDictCache(k) + values, _ := json.Marshal(v) + redis.Set("", key, string(values)) + } +} + +// ClearDictCache 清空字典缓存数据 +func (r *SysDictType) ClearDictCache(dictType string) bool { + key := r.getDictCache(dictType) + keys, err := redis.GetKeys("", key) + if err != nil { + return false + } + delOk, _ := redis.DelKeys("", keys) + return delOk +} + +// DictDataCache 获取字典数据缓存数据 +func (r *SysDictType) DictDataCache(dictType string) []model.SysDictData { + data := []model.SysDictData{} + key := r.getDictCache(dictType) + jsonStr, _ := redis.Get("", key) + if len(jsonStr) > 7 { + err := json.Unmarshal([]byte(jsonStr), &data) + if err != nil { + data = []model.SysDictData{} + } + } else { + data = r.sysDictDataRepository.SelectDictDataList(model.SysDictData{ + Status: common.STATUS_YES, + DictType: dictType, + }) + if len(data) > 0 { + redis.Del("", key) + values, _ := json.Marshal(data) + redis.Set("", key, string(values)) + } + } + return data } diff --git a/src/modules/system/service/sys_dict_type.impl.go b/src/modules/system/service/sys_dict_type.impl.go deleted file mode 100644 index 4f8c6d5c..00000000 --- a/src/modules/system/service/sys_dict_type.impl.go +++ /dev/null @@ -1,212 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/constants/common" - "be.ems/src/framework/redis" - "be.ems/src/modules/system/model" - "be.ems/src/modules/system/repository" -) - -// 实例化服务层 SysDictTypeImpl 结构体 -var NewSysDictTypeImpl = &SysDictTypeImpl{ - sysDictTypeRepository: repository.NewSysDictTypeImpl, - sysDictDataRepository: repository.NewSysDictDataImpl, -} - -// SysDictTypeImpl 字典类型 服务层处理 -type SysDictTypeImpl struct { - // 字典类型服务 - sysDictTypeRepository repository.ISysDictType - // 字典数据服务 - sysDictDataRepository repository.ISysDictData -} - -// SelectDictTypePage 根据条件分页查询字典类型 -func (r *SysDictTypeImpl) SelectDictTypePage(query map[string]any) map[string]any { - return r.sysDictTypeRepository.SelectDictTypePage(query) -} - -// SelectDictTypeList 根据条件查询字典类型 -func (r *SysDictTypeImpl) SelectDictTypeList(sysDictType model.SysDictType) []model.SysDictType { - return r.sysDictTypeRepository.SelectDictTypeList(sysDictType) -} - -// SelectDictTypeByID 根据字典类型ID查询信息 -func (r *SysDictTypeImpl) SelectDictTypeByID(dictID string) model.SysDictType { - if dictID == "" { - return model.SysDictType{} - } - dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{dictID}) - if len(dictTypes) > 0 { - return dictTypes[0] - } - return model.SysDictType{} -} - -// SelectDictTypeByType 根据字典类型查询信息 -func (r *SysDictTypeImpl) SelectDictTypeByType(dictType string) model.SysDictType { - return r.sysDictTypeRepository.SelectDictTypeByType(dictType) -} - -// CheckUniqueDictName 校验字典名称是否唯一 -func (r *SysDictTypeImpl) CheckUniqueDictName(dictName, dictID string) bool { - uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ - DictName: dictName, - }) - if uniqueId == dictID { - return true - } - return uniqueId == "" -} - -// CheckUniqueDictType 校验字典类型是否唯一 -func (r *SysDictTypeImpl) CheckUniqueDictType(dictType, dictID string) bool { - uniqueId := r.sysDictTypeRepository.CheckUniqueDictType(model.SysDictType{ - DictType: dictType, - }) - if uniqueId == dictID { - return true - } - return uniqueId == "" -} - -// InsertDictType 新增字典类型信息 -func (r *SysDictTypeImpl) InsertDictType(sysDictType model.SysDictType) string { - insertId := r.sysDictTypeRepository.InsertDictType(sysDictType) - if insertId != "" { - r.LoadingDictCache(sysDictType.DictType) - } - return insertId -} - -// UpdateDictType 修改字典类型信息 -func (r *SysDictTypeImpl) UpdateDictType(sysDictType model.SysDictType) int64 { - data := r.sysDictTypeRepository.SelectDictTypeByIDs([]string{sysDictType.DictID}) - if len(data) == 0 { - return 0 - } - // 修改字典类型key时同步更新其字典数据的类型key - oldDictType := data[0].DictType - rows := r.sysDictTypeRepository.UpdateDictType(sysDictType) - if rows > 0 && oldDictType != "" && oldDictType != sysDictType.DictType { - r.sysDictDataRepository.UpdateDictDataType(oldDictType, sysDictType.DictType) - } - // 刷新缓存 - r.ClearDictCache(oldDictType) - r.LoadingDictCache(sysDictType.DictType) - return rows -} - -// DeleteDictTypeByIDs 批量删除字典类型信息 -func (r *SysDictTypeImpl) DeleteDictTypeByIDs(dictIDs []string) (int64, error) { - // 检查是否存在 - dictTypes := r.sysDictTypeRepository.SelectDictTypeByIDs(dictIDs) - if len(dictTypes) <= 0 { - // 没有可访问字典类型数据! - return 0, fmt.Errorf("there is no accessible dictionary type data") - } - for _, v := range dictTypes { - // 字典类型下级含有数据 - useCount := r.sysDictDataRepository.CountDictDataByType(v.DictType) - if useCount > 0 { - // 【%s】存在字典数据,不能删除 - return 0, fmt.Errorf("[%s] dictionary data exists and cannot be deleted", v.DictName) - } - // 清除缓存 - r.ClearDictCache(v.DictType) - } - if len(dictTypes) == len(dictIDs) { - rows := r.sysDictTypeRepository.DeleteDictTypeByIDs(dictIDs) - return rows, nil - } - // 删除字典数据信息失败! - return 0, fmt.Errorf("failed to delete dictionary data information") -} - -// ResetDictCache 重置字典缓存数据 -func (r *SysDictTypeImpl) ResetDictCache() { - r.ClearDictCache("*") - r.LoadingDictCache("") -} - -// getCacheKey 组装缓存key -func (r *SysDictTypeImpl) getDictCache(dictType string) string { - return cachekey.SYS_DICT_KEY + dictType -} - -// LoadingDictCache 加载字典缓存数据 -func (r *SysDictTypeImpl) LoadingDictCache(dictType string) { - sysDictData := model.SysDictData{ - Status: common.STATUS_YES, - } - - // 指定字典类型 - if dictType != "" { - sysDictData.DictType = dictType - // 删除缓存 - key := r.getDictCache(dictType) - redis.Del("", key) - } - - sysDictDataList := r.sysDictDataRepository.SelectDictDataList(sysDictData) - if len(sysDictDataList) == 0 { - return - } - - // 将字典数据按类型分组 - m := make(map[string][]model.SysDictData, 0) - for _, v := range sysDictDataList { - key := v.DictType - if item, ok := m[key]; ok { - m[key] = append(item, v) - } else { - m[key] = []model.SysDictData{v} - } - } - - // 放入缓存 - for k, v := range m { - key := r.getDictCache(k) - values, _ := json.Marshal(v) - redis.Set("", key, string(values)) - } -} - -// ClearDictCache 清空字典缓存数据 -func (r *SysDictTypeImpl) ClearDictCache(dictType string) bool { - key := r.getDictCache(dictType) - keys, err := redis.GetKeys("", key) - if err != nil { - return false - } - delOk, _ := redis.DelKeys("", keys) - return delOk -} - -// DictDataCache 获取字典数据缓存数据 -func (r *SysDictTypeImpl) DictDataCache(dictType string) []model.SysDictData { - data := []model.SysDictData{} - key := r.getDictCache(dictType) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &data) - if err != nil { - data = []model.SysDictData{} - } - } else { - data = r.sysDictDataRepository.SelectDictDataList(model.SysDictData{ - Status: common.STATUS_YES, - DictType: dictType, - }) - if len(data) > 0 { - redis.Del("", key) - values, _ := json.Marshal(data) - redis.Set("", key, string(values)) - } - } - return data -} diff --git a/src/modules/system/system.go b/src/modules/system/system.go index 850f72eb..1331f83b 100644 --- a/src/modules/system/system.go +++ b/src/modules/system/system.go @@ -439,5 +439,5 @@ func InitLoad() { // 启动时,刷新缓存-参数配置 service.NewSysConfigImpl.ResetConfigCache() // 启动时,刷新缓存-字典类型数据 - service.NewSysDictTypeImpl.ResetDictCache() + service.NewSysDictType.ResetDictCache() } From 065895e1d2d0427db2478d1a02f4c96aeea2b2cc Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Oct 2024 11:43:35 +0800 Subject: [PATCH 30/69] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9=E5=AF=BC=E8=87=B4?= =?UTF-8?q?Sex/Password=E5=AD=97=E6=AE=B5=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/common/controller/account.go | 5 +- src/modules/common/controller/bootloader.go | 5 +- src/modules/common/service/account.go | 208 ++++++++++++++++-- src/modules/common/service/account.impl.go | 190 ---------------- .../system/controller/sys_log_login.go | 5 +- src/modules/system/controller/sys_profile.go | 21 +- src/modules/system/controller/sys_user.go | 20 +- 7 files changed, 224 insertions(+), 230 deletions(-) delete mode 100644 src/modules/common/service/account.impl.go diff --git a/src/modules/common/controller/account.go b/src/modules/common/controller/account.go index abfba11c..f41d38d6 100644 --- a/src/modules/common/controller/account.go +++ b/src/modules/common/controller/account.go @@ -17,7 +17,7 @@ import ( // 实例化控制层 AccountController 结构体 var NewAccount = &AccountController{ - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, sysLogLoginService: systemService.NewSysLogLoginImpl, } @@ -25,8 +25,7 @@ var NewAccount = &AccountController{ // // PATH / type AccountController struct { - // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 账号身份操作服务 // 系统登录访问 sysLogLoginService systemService.ISysLogLogin } diff --git a/src/modules/common/controller/bootloader.go b/src/modules/common/controller/bootloader.go index daa12daa..0c9f5205 100644 --- a/src/modules/common/controller/bootloader.go +++ b/src/modules/common/controller/bootloader.go @@ -18,7 +18,7 @@ import ( // 实例化控制层 BootloaderController 结构体 var NewBootloader = &BootloaderController{ - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, sysUserService: systemService.NewSysUserImpl, } @@ -26,8 +26,7 @@ var NewBootloader = &BootloaderController{ // // PATH /bootloader type BootloaderController struct { - // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 账号身份操作服务 // 用户信息服务 sysUserService systemService.ISysUser } diff --git a/src/modules/common/service/account.go b/src/modules/common/service/account.go index 48443e3b..dce06a02 100644 --- a/src/modules/common/service/account.go +++ b/src/modules/common/service/account.go @@ -1,24 +1,194 @@ package service -import "be.ems/src/framework/vo" +import ( + "fmt" + "time" -// 账号身份操作服务 服务层接口 -type IAccount interface { - // ValidateCaptcha 校验验证码 - ValidateCaptcha(code, uuid string) error + "be.ems/src/framework/config" + adminConstants "be.ems/src/framework/constants/admin" + "be.ems/src/framework/constants/cachekey" + "be.ems/src/framework/constants/common" + "be.ems/src/framework/redis" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" + "be.ems/src/framework/vo" + "be.ems/src/modules/system/model" + systemService "be.ems/src/modules/system/service" +) - // LoginByUsername 登录生成token - LoginByUsername(username, password string) (vo.LoginUser, error) - - // UpdateLoginDateAndIP 更新登录时间和IP - UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool - - // ClearLoginRecordCache 清除错误记录次数 - ClearLoginRecordCache(username string) bool - - // RoleAndMenuPerms 角色和菜单数据权限 - RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) - - // RouteMenus 前端路由所需要的菜单 - RouteMenus(userId string, isAdmin bool) []vo.Router +// 实例化服务层 Account 结构体 +var NewAccount = &Account{ + sysUserService: systemService.NewSysUserImpl, + sysConfigService: systemService.NewSysConfigImpl, + sysRoleService: systemService.NewSysRoleImpl, + sysMenuService: systemService.NewSysMenuImpl, +} + +// 账号身份操作服务 服务层处理 +type Account struct { + // 用户信息服务 + sysUserService systemService.ISysUser + // 参数配置服务 + sysConfigService systemService.ISysConfig + // 角色服务 + sysRoleService systemService.ISysRole + // 菜单服务 + sysMenuService systemService.ISysMenu +} + +// ValidateCaptcha 校验验证码 +func (s *Account) ValidateCaptcha(code, uuid string) error { + // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 + captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") + if !parse.Boolean(captchaEnabledStr) { + return nil + } + if code == "" || uuid == "" { + // 验证码信息错误 + return fmt.Errorf("captcha.err") + } + verifyKey := cachekey.CAPTCHA_CODE_KEY + uuid + captcha, _ := redis.Get("", verifyKey) + if captcha == "" { + // 验证码已失效 + return fmt.Errorf("captcha.errValid") + } + redis.Del("", verifyKey) + if captcha != code { + // 验证码错误 + return fmt.Errorf("captcha.err") + } + return nil +} + +// LoginByUsername 登录创建用户信息 +func (s *Account) LoginByUsername(username, password string) (vo.LoginUser, error) { + loginUser := vo.LoginUser{} + + // 检查密码重试次数 + retrykey, retryCount, lockTime, err := s.passwordRetryCount(username) + if err != nil { + return loginUser, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.SelectUserByUserName(username) + if sysUser.UserName != username { + return loginUser, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == common.STATUS_YES { + // 对不起,您的账号已被删除 + return loginUser, fmt.Errorf("login.errDelFlag") + } + if sysUser.Status == common.STATUS_NO { + return loginUser, fmt.Errorf("login.errStatus") + } + + // 检验用户密码 + compareBool := crypto.BcryptCompare(password, sysUser.Password) + if !compareBool { + redis.SetByExpire("", retrykey, retryCount+1, lockTime) + // 用户不存在或密码错误 + return loginUser, fmt.Errorf("login.errNameOrPasswd") + } else { + // 清除错误记录次数 + s.ClearLoginRecordCache(username) + } + + // 登录用户信息 + loginUser.UserID = sysUser.UserID + loginUser.DeptID = sysUser.DeptID + loginUser.User = sysUser + // 用户权限组标识 + isAdmin := config.IsAdmin(sysUser.UserID) + if isAdmin { + loginUser.Permissions = []string{adminConstants.PERMISSION} + } else { + perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) + loginUser.Permissions = parse.RemoveDuplicates(perms) + } + return loginUser, nil +} + +// UpdateLoginDateAndIP 更新登录时间和IP +func (s *Account) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool { + sysUser := loginUser.User + userInfo := model.SysUser{ + UserID: sysUser.UserID, + LoginIP: sysUser.LoginIP, + LoginDate: sysUser.LoginDate, + UpdateBy: sysUser.UserName, + Sex: sysUser.Sex, + PhoneNumber: sysUser.PhoneNumber, + Email: sysUser.Email, + Remark: sysUser.Remark, + } + rows := s.sysUserService.UpdateUser(userInfo) + return rows > 0 +} + +// ClearLoginRecordCache 清除错误记录次数 +func (s *Account) ClearLoginRecordCache(username string) bool { + cacheKey := cachekey.PWD_ERR_CNT_KEY + username + hasKey, _ := redis.Has("", cacheKey) + if hasKey { + delOk, _ := redis.Del("", cacheKey) + return delOk + } + return false +} + +// passwordRetryCount 密码重试次数 +func (s *Account) passwordRetryCount(username string) (string, int64, time.Duration, error) { + // 从数据库配置获取登录次数和错误锁定时间 + maxRetryCountStr := s.sysConfigService.SelectConfigValueByKey("sys.user.maxRetryCount") + lockTimeStr := s.sysConfigService.SelectConfigValueByKey("sys.user.lockTime") + + // 验证登录次数和错误锁定时间 + maxRetryCount := parse.Number(maxRetryCountStr) + lockTime := parse.Number(lockTimeStr) + // 验证缓存记录次数 + retrykey := cachekey.PWD_ERR_CNT_KEY + username + retryCount, err := redis.Get("", retrykey) + if retryCount == "" || err != nil { + retryCount = "0" + } + // 是否超过错误值 + retryCountInt64 := parse.Number(retryCount) + if retryCountInt64 >= maxRetryCount { + // 密码输入错误多次,帐户已被锁定 + errorMsg := fmt.Errorf("login.errRetryPasswd") + return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, errorMsg + } + return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil +} + +// RoleAndMenuPerms 角色和菜单数据权限 +func (s *Account) RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) { + if isAdmin { + return []string{adminConstants.ROLE_KEY}, []string{adminConstants.PERMISSION} + } else { + // 角色key + roleGroup := []string{} + roles := s.sysRoleService.SelectRoleListByUserId(userId) + for _, role := range roles { + roleGroup = append(roleGroup, role.RoleKey) + } + // 菜单权限key + perms := s.sysMenuService.SelectMenuPermsByUserId(userId) + return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) + } +} + +// RouteMenus 前端路由所需要的菜单 +func (s *Account) RouteMenus(userId string, isAdmin bool) []vo.Router { + var buildMenus []vo.Router + if isAdmin { + menus := s.sysMenuService.SelectMenuTreeByUserId("*") + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } else { + menus := s.sysMenuService.SelectMenuTreeByUserId(userId) + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } + return buildMenus } diff --git a/src/modules/common/service/account.impl.go b/src/modules/common/service/account.impl.go deleted file mode 100644 index b91c8f14..00000000 --- a/src/modules/common/service/account.impl.go +++ /dev/null @@ -1,190 +0,0 @@ -package service - -import ( - "fmt" - "time" - - "be.ems/src/framework/config" - adminConstants "be.ems/src/framework/constants/admin" - "be.ems/src/framework/constants/cachekey" - "be.ems/src/framework/constants/common" - "be.ems/src/framework/redis" - "be.ems/src/framework/utils/crypto" - "be.ems/src/framework/utils/parse" - "be.ems/src/framework/vo" - "be.ems/src/modules/system/model" - systemService "be.ems/src/modules/system/service" -) - -// 实例化服务层 AccountImpl 结构体 -var NewAccountImpl = &AccountImpl{ - sysUserService: systemService.NewSysUserImpl, - sysConfigService: systemService.NewSysConfigImpl, - sysRoleService: systemService.NewSysRoleImpl, - sysMenuService: systemService.NewSysMenuImpl, -} - -// 账号身份操作服务 服务层处理 -type AccountImpl struct { - // 用户信息服务 - sysUserService systemService.ISysUser - // 参数配置服务 - sysConfigService systemService.ISysConfig - // 角色服务 - sysRoleService systemService.ISysRole - // 菜单服务 - sysMenuService systemService.ISysMenu -} - -// ValidateCaptcha 校验验证码 -func (s *AccountImpl) ValidateCaptcha(code, uuid string) error { - // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.SelectConfigValueByKey("sys.account.captchaEnabled") - if !parse.Boolean(captchaEnabledStr) { - return nil - } - if code == "" || uuid == "" { - // 验证码信息错误 - return fmt.Errorf("captcha.err") - } - verifyKey := cachekey.CAPTCHA_CODE_KEY + uuid - captcha, _ := redis.Get("", verifyKey) - if captcha == "" { - // 验证码已失效 - return fmt.Errorf("captcha.errValid") - } - redis.Del("", verifyKey) - if captcha != code { - // 验证码错误 - return fmt.Errorf("captcha.err") - } - return nil -} - -// LoginByUsername 登录创建用户信息 -func (s *AccountImpl) LoginByUsername(username, password string) (vo.LoginUser, error) { - loginUser := vo.LoginUser{} - - // 检查密码重试次数 - retrykey, retryCount, lockTime, err := s.passwordRetryCount(username) - if err != nil { - return loginUser, err - } - - // 查询用户登录账号 - sysUser := s.sysUserService.SelectUserByUserName(username) - if sysUser.UserName != username { - return loginUser, fmt.Errorf("login.errNameOrPasswd") - } - if sysUser.DelFlag == common.STATUS_YES { - // 对不起,您的账号已被删除 - return loginUser, fmt.Errorf("login.errDelFlag") - } - if sysUser.Status == common.STATUS_NO { - return loginUser, fmt.Errorf("login.errStatus") - } - - // 检验用户密码 - compareBool := crypto.BcryptCompare(password, sysUser.Password) - if !compareBool { - redis.SetByExpire("", retrykey, retryCount+1, lockTime) - // 用户不存在或密码错误 - return loginUser, fmt.Errorf("login.errNameOrPasswd") - } else { - // 清除错误记录次数 - s.ClearLoginRecordCache(username) - } - - // 登录用户信息 - loginUser.UserID = sysUser.UserID - loginUser.DeptID = sysUser.DeptID - loginUser.User = sysUser - // 用户权限组标识 - isAdmin := config.IsAdmin(sysUser.UserID) - if isAdmin { - loginUser.Permissions = []string{adminConstants.PERMISSION} - } else { - perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID) - loginUser.Permissions = parse.RemoveDuplicates(perms) - } - return loginUser, nil -} - -// UpdateLoginDateAndIP 更新登录时间和IP -func (s *AccountImpl) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool { - sysUser := loginUser.User - userInfo := model.SysUser{ - UserID: sysUser.UserID, - LoginIP: sysUser.LoginIP, - LoginDate: sysUser.LoginDate, - UpdateBy: sysUser.UserName, - } - rows := s.sysUserService.UpdateUser(userInfo) - return rows > 0 -} - -// ClearLoginRecordCache 清除错误记录次数 -func (s *AccountImpl) ClearLoginRecordCache(username string) bool { - cacheKey := cachekey.PWD_ERR_CNT_KEY + username - hasKey, _ := redis.Has("", cacheKey) - if hasKey { - delOk, _ := redis.Del("", cacheKey) - return delOk - } - return false -} - -// passwordRetryCount 密码重试次数 -func (s *AccountImpl) passwordRetryCount(username string) (string, int64, time.Duration, error) { - // 从数据库配置获取登录次数和错误锁定时间 - maxRetryCountStr := s.sysConfigService.SelectConfigValueByKey("sys.user.maxRetryCount") - lockTimeStr := s.sysConfigService.SelectConfigValueByKey("sys.user.lockTime") - - // 验证登录次数和错误锁定时间 - maxRetryCount := parse.Number(maxRetryCountStr) - lockTime := parse.Number(lockTimeStr) - // 验证缓存记录次数 - retrykey := cachekey.PWD_ERR_CNT_KEY + username - retryCount, err := redis.Get("", retrykey) - if retryCount == "" || err != nil { - retryCount = "0" - } - // 是否超过错误值 - retryCountInt64 := parse.Number(retryCount) - if retryCountInt64 >= maxRetryCount { - // 密码输入错误多次,帐户已被锁定 - errorMsg := fmt.Errorf("login.errRetryPasswd") - return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, errorMsg - } - return retrykey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil -} - -// RoleAndMenuPerms 角色和菜单数据权限 -func (s *AccountImpl) RoleAndMenuPerms(userId string, isAdmin bool) ([]string, []string) { - if isAdmin { - return []string{adminConstants.ROLE_KEY}, []string{adminConstants.PERMISSION} - } else { - // 角色key - roleGroup := []string{} - roles := s.sysRoleService.SelectRoleListByUserId(userId) - for _, role := range roles { - roleGroup = append(roleGroup, role.RoleKey) - } - // 菜单权限key - perms := s.sysMenuService.SelectMenuPermsByUserId(userId) - return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) - } -} - -// RouteMenus 前端路由所需要的菜单 -func (s *AccountImpl) RouteMenus(userId string, isAdmin bool) []vo.Router { - var buildMenus []vo.Router - if isAdmin { - menus := s.sysMenuService.SelectMenuTreeByUserId("*") - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } else { - menus := s.sysMenuService.SelectMenuTreeByUserId(userId) - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } - return buildMenus -} diff --git a/src/modules/system/controller/sys_log_login.go b/src/modules/system/controller/sys_log_login.go index 59e9a73d..0444d327 100644 --- a/src/modules/system/controller/sys_log_login.go +++ b/src/modules/system/controller/sys_log_login.go @@ -22,7 +22,7 @@ import ( // 实例化控制层 SysLogLoginController 结构体 var NewSysLogLogin = &SysLogLoginController{ sysLogLoginService: service.NewSysLogLoginImpl, - accountService: commonService.NewAccountImpl, + accountService: commonService.NewAccount, } // 系统登录日志信息 @@ -31,8 +31,7 @@ var NewSysLogLogin = &SysLogLoginController{ type SysLogLoginController struct { // 系统登录日志服务 sysLogLoginService service.ISysLogLogin - // 账号身份操作服务 - accountService commonService.IAccount + accountService *commonService.Account // 账号身份操作服务 } // 系统登录日志列表 diff --git a/src/modules/system/controller/sys_profile.go b/src/modules/system/controller/sys_profile.go index 55095bcf..34626a2c 100644 --- a/src/modules/system/controller/sys_profile.go +++ b/src/modules/system/controller/sys_profile.go @@ -157,6 +157,7 @@ func (s *SysProfileController) UpdateProfile(c *gin.Context) { PhoneNumber: body.PhoneNumber, Email: body.Email, Sex: body.Sex, + Remark: loginUser.User.Remark, } rows := s.sysUserService.UpdateUser(sysUser) if rows > 0 { @@ -229,9 +230,13 @@ func (s *SysProfileController) UpdatePwd(c *gin.Context) { // 修改新密码 sysUser := model.SysUser{ - UserID: userId, - UpdateBy: userName, - Password: body.NewPassword, + UserID: userId, + UpdateBy: userName, + Password: body.NewPassword, + Sex: user.Sex, + PhoneNumber: user.PhoneNumber, + Email: user.Email, + Remark: user.Remark, } rows := s.sysUserService.UpdateUser(sysUser) if rows > 0 { @@ -268,9 +273,13 @@ func (s *SysProfileController) Avatar(c *gin.Context) { // 更新头像地址 sysUser := model.SysUser{ - UserID: loginUser.UserID, - UpdateBy: loginUser.User.UserName, - Avatar: filePath, + UserID: loginUser.UserID, + UpdateBy: loginUser.User.UserName, + Avatar: filePath, + Sex: loginUser.User.Sex, + PhoneNumber: loginUser.User.PhoneNumber, + Email: loginUser.User.Email, + Remark: loginUser.User.Remark, } rows := s.sysUserService.UpdateUser(sysUser) if rows > 0 { diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index c6c521b4..34f6834a 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -411,9 +411,13 @@ func (s *SysUserController) ResetPwd(c *gin.Context) { userName := ctx.LoginUserToUserName(c) info := model.SysUser{ - UserID: body.UserID, - Password: body.Password, - UpdateBy: userName, + UserID: body.UserID, + Password: body.Password, + UpdateBy: userName, + Sex: user.Sex, + PhoneNumber: user.PhoneNumber, + Email: user.Email, + Remark: user.Remark, } rows := s.sysUserService.UpdateUser(info) if rows > 0 { @@ -454,9 +458,13 @@ func (s *SysUserController) Status(c *gin.Context) { userName := ctx.LoginUserToUserName(c) info := model.SysUser{ - UserID: body.UserID, - Status: body.Status, - UpdateBy: userName, + UserID: body.UserID, + Status: body.Status, + UpdateBy: userName, + Sex: user.Sex, + PhoneNumber: user.PhoneNumber, + Email: user.Email, + Remark: user.Remark, } rows := s.sysUserService.UpdateUser(info) if rows > 0 { From 0a24e50e9dded308a407c59c18e40e8258fbd15f Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Oct 2024 11:47:25 +0800 Subject: [PATCH 31/69] =?UTF-8?q?feat:=20=E7=BD=91=E5=85=83=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=8E=8B=E7=BC=A9=E4=B8=BAZIP/=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=86=85=E5=AE=B9=E6=9F=A5=E7=9C=8Bcat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_element/controller/action.go | 114 +++++++++++++++++- .../network_element/network_element.go | 28 +++-- 2 files changed, 129 insertions(+), 13 deletions(-) diff --git a/src/modules/network_element/controller/action.go b/src/modules/network_element/controller/action.go index 7d6ebc6f..6e24c7a5 100644 --- a/src/modules/network_element/controller/action.go +++ b/src/modules/network_element/controller/action.go @@ -31,7 +31,7 @@ type NeActionController struct { neInfoService *neService.NeInfo } -// 发送文件从本地到网元 +// 从本地到网元发送文件 // // POST /pushFile func (s *NeActionController) PushFile(c *gin.Context) { @@ -88,7 +88,7 @@ func (s *NeActionController) PushFile(c *gin.Context) { c.JSON(200, result.OkData(filepath.ToSlash(neFilePath))) } -// 获取文件从网元到本地 +// 从网元到本地获取文件 // // GET /pullFile func (s *NeActionController) PullFile(c *gin.Context) { @@ -147,6 +147,116 @@ func (s *NeActionController) PullFile(c *gin.Context) { c.FileAttachment(localFilePath, fileName) } +// 从网元到本地获取目录压缩为ZIP +// +// GET /pullDirZip +func (s *NeActionController) PullDirZip(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"` + 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 := querys.Path + dirName := generate.Code(6) + localFilePath := filepath.Join("/tmp/omc/pull/", dirName) + if runtime.GOOS == "windows" { + localFilePath = fmt.Sprintf("C:%s", localFilePath) + } + // 复制到本地 + localDirFilePath := filepath.Join(localFilePath, "zip") + if err = sftpClient.CopyDirRemoteToLocal(nePath, localDirFilePath); err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + // 压缩zip文件名 + zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeId, dirName) + zipFilePath := filepath.Join(localFilePath, zipFileName) + if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + defer func() { + if querys.DelTemp { + _ = os.RemoveAll(localFilePath) + } + }() + c.FileAttachment(zipFilePath, zipFileName) +} + +// 查看网元端文件内容 +// +// GET /viewFile +func (s *NeActionController) ViewFile(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"` + } + 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() + + // 网元端文件 + nePath := filepath.ToSlash(filepath.Join(querys.Path, querys.FileName)) + // 网元端临时目录 + output, err := sshClient.RunCMD(fmt.Sprintf("cat %s", nePath)) + output = strings.TrimSpace(output) + if err != nil || strings.HasPrefix(output, "ls: ") { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "file view cat error"))) + return + } + c.JSON(200, result.OkData(output)) +} + // 网元端文件列表 // // GET /files diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 8dc59a6d..88e28069 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -17,10 +17,8 @@ func Setup(router *gin.Engine) { // 启动时需要的初始参数 InitLoad() - neGroup := router.Group("/ne") - // 网元操作处理 - neActionGroup := neGroup.Group("/action") + neActionGroup := router.Group("/ne/action") { neActionGroup.GET("/files", middleware.PreAuthorize(nil), @@ -35,6 +33,14 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neAction", collectlogs.BUSINESS_TYPE_IMPORT)), controller.NewNeAction.PushFile, ) + neActionGroup.GET("/pullDirZip", + middleware.PreAuthorize(nil), + controller.NewNeAction.PullDirZip, + ) + neActionGroup.GET("/viewFile", + middleware.PreAuthorize(nil), + controller.NewNeAction.ViewFile, + ) neActionGroup.PUT("/service", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neAction", collectlogs.BUSINESS_TYPE_OTHER)), @@ -43,7 +49,7 @@ func Setup(router *gin.Engine) { } // 网元信息 - neInfoGroup := neGroup.Group("/info") + neInfoGroup := router.Group("/ne/info") { neInfoGroup.GET("/state", middleware.PreAuthorize(nil), @@ -104,7 +110,7 @@ func Setup(router *gin.Engine) { } // 网元主机 - neHostGroup := neGroup.Group("/host") + neHostGroup := router.Group("/ne/host") { neHostGroup.GET("/list", middleware.PreAuthorize(nil), @@ -153,7 +159,7 @@ func Setup(router *gin.Engine) { } // 网元主机命令 - neHostCmdGroup := neGroup.Group("/hostCmd") + neHostCmdGroup := router.Group("/ne/hostCmd") { neHostCmdGroup.GET("/list", middleware.PreAuthorize(nil), @@ -181,7 +187,7 @@ func Setup(router *gin.Engine) { } // 网元版本信息 - neVersionGroup := neGroup.Group("/version") + neVersionGroup := router.Group("/ne/version") { neVersionGroup.GET("/list", middleware.PreAuthorize(nil), @@ -199,7 +205,7 @@ func Setup(router *gin.Engine) { } // 网元软件包信息 - neSoftwareGroup := neGroup.Group("/software") + neSoftwareGroup := router.Group("/ne/software") { neSoftwareGroup.GET("/list", middleware.PreAuthorize(nil), @@ -232,7 +238,7 @@ func Setup(router *gin.Engine) { } // 网元授权激活信息 - neLicenseGroup := neGroup.Group("/license") + neLicenseGroup := router.Group("/ne/license") { neLicenseGroup.GET("/list", middleware.PreAuthorize(nil), @@ -262,7 +268,7 @@ func Setup(router *gin.Engine) { } // 网元参数配置 - neConfigGroup := neGroup.Group("/config") + neConfigGroup := router.Group("/ne/config") { // 网元参数配置可用属性值 neConfigGroup.GET("/list", @@ -315,7 +321,7 @@ func Setup(router *gin.Engine) { } // 网元配置文件备份记录 - neConfigBackupGroup := neGroup.Group("/config/backup") + neConfigBackupGroup := router.Group("/ne/config/backup") { neConfigBackupGroup.GET("/list", middleware.PreAuthorize(nil), From 06a9a3986bddc018c6669c76b601004d6822c509 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Oct 2024 11:57:05 +0800 Subject: [PATCH 32/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0=E8=B7=9F?= =?UTF-8?q?=E8=B8=AA=E4=BB=BB=E5=8A=A1=E6=95=B0=E6=8D=AE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/trace_data.sql | 1 - database/install/trace_task.sql | 10 +++++----- database/upgrade/upg_u_sub_user.sql | 1 + 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/database/install/trace_data.sql b/database/install/trace_data.sql index 2cf29ab6..4b1d8c22 100644 --- a/database/install/trace_data.sql +++ b/database/install/trace_data.sql @@ -3,7 +3,6 @@ -- DROP TABLE IF EXISTS `trace_data`; - CREATE TABLE `trace_data` ( `id` int NOT NULL AUTO_INCREMENT, `task_id` int NOT NULL COMMENT '跟踪任务ID', diff --git a/database/install/trace_task.sql b/database/install/trace_task.sql index 1e009e1d..6f4c4668 100644 --- a/database/install/trace_task.sql +++ b/database/install/trace_task.sql @@ -1,19 +1,18 @@ - -- -- Table structure for table `trace_task` -- DROP TABLE IF EXISTS `trace_task`; - CREATE TABLE `trace_task` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '跟踪任务ID', - `trace_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '1-Interface,2-Device,3-User', + `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', + `trace_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务编号', + `trace_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '1-Interface,2-Device,3-User', `start_time` bigint DEFAULT '0' COMMENT '开始时间 毫秒', `end_time` bigint DEFAULT '0' COMMENT '结束时间 毫秒', - `ue_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '设备跟踪必须 IP', `interfaces` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '接口跟踪必须 例如 N8,N10', `imsi` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户跟踪必须', `msisdn` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户跟踪可选', + `ue_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '设备跟踪必须 IP', `src_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '源地址IP', `dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址IP', `signal_port` int DEFAULT '0' COMMENT '地址IP端口', @@ -25,6 +24,7 @@ CREATE TABLE `trace_task` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:29500', + `fetch_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '任务下发请求响应消息', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务'; diff --git a/database/upgrade/upg_u_sub_user.sql b/database/upgrade/upg_u_sub_user.sql index 618c780e..4e52b900 100644 --- a/database/upgrade/upg_u_sub_user.sql +++ b/database/upgrade/upg_u_sub_user.sql @@ -50,6 +50,7 @@ ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `mico` varchar(50) CHARACTER S ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `odb_ps` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData ODB_PS 0-all,1-hplmn,2-vplmn' AFTER `mico`; ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `group_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData GroupId' AFTER `odb_ps`; ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `apn_mum` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'EpsDat apnNum' AFTER `context_id`; +ALTER TABLE `u_sub_user` ADD COLUMN IF NOT EXISTS `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'CAG' AFTER `smf_sel`; ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData SubUeAMBRTemp' AFTER `am_dat`; ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData SubSNSSAITemp' AFTER `ambr`; ALTER TABLE `u_sub_user` MODIFY COLUMN IF EXISTS `rat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'AmData RAT 0x00:VIRTUAL 0x01:WLAN 0x02:EUTRA 0x03:NR' AFTER `nssai`; From 318fc6cc206bd2e13712c7fd56f193347451cd31 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Oct 2024 12:11:05 +0800 Subject: [PATCH 33/69] =?UTF-8?q?fix:=20=E7=BD=91=E5=85=83=E8=B7=9F?= =?UTF-8?q?=E8=B8=AA=E4=BB=BB=E5=8A=A1=E4=BC=98=E5=8C=96socket=E6=8E=A5?= =?UTF-8?q?=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/socket/tcp_server.go | 17 +++++-------- src/framework/socket/udp_server.go | 14 ++++------ src/modules/trace/service/trace_task.go | 34 ++++++++++++++++++++----- 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/framework/socket/tcp_server.go b/src/framework/socket/tcp_server.go index 857af870..0957438f 100644 --- a/src/framework/socket/tcp_server.go +++ b/src/framework/socket/tcp_server.go @@ -52,16 +52,18 @@ func (s *SocketTCP) Close() { } // Resolve 处理消息 -func (s *SocketTCP) Resolve(callback func(conn *net.Conn)) error { +func (s *SocketTCP) Resolve(callback func(conn *net.Conn, err error)) { if s.Listener == nil { - return fmt.Errorf("tcp service not created") + callback(nil, fmt.Errorf("tcp service not created")) + return } listener := *s.Listener for { select { case <-s.StopChan: - return fmt.Errorf("udp service stop") + callback(nil, fmt.Errorf("udp service stop")) + return default: conn, err := listener.Accept() if err != nil { @@ -69,14 +71,7 @@ func (s *SocketTCP) Resolve(callback func(conn *net.Conn)) error { continue } defer conn.Close() - - // 处理连接 - callback(&conn) - - // 发送响应 - if _, err = conn.Write([]byte("tcp>")); err != nil { - fmt.Println("Error sending response:", err) - } + callback(&conn, nil) } } } diff --git a/src/framework/socket/udp_server.go b/src/framework/socket/udp_server.go index 33a45a60..d93001b0 100644 --- a/src/framework/socket/udp_server.go +++ b/src/framework/socket/udp_server.go @@ -50,22 +50,18 @@ func (s *SocketUDP) Close() { } // Resolve 处理消息 -func (s *SocketUDP) Resolve(callback func(*net.UDPConn)) error { +func (s *SocketUDP) Resolve(callback func(*net.UDPConn, error)) { if s.Conn == nil { - return fmt.Errorf("udp service not created") + callback(nil, fmt.Errorf("udp service not created")) + return } for { select { case <-s.StopChan: - return fmt.Errorf("udp service stop") + callback(nil, fmt.Errorf("udp service not created")) default: - callback(s.Conn) - - // 发送响应 - if _, err := s.Conn.WriteTo([]byte("udp>"), s.Conn.RemoteAddr()); err != nil { - fmt.Println("Error sending response:", err) - } + callback(s.Conn, nil) } } } diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index 98e8d7c0..15f09976 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -60,12 +60,17 @@ func (r *TraceTask) CreateUDP() error { } // 接收处理UDP数据 - go r.udpService.Resolve(func(conn *net.UDPConn) { + go r.udpService.Resolve(func(conn *net.UDPConn, err error) { + if err != nil { + logger.Errorf("UDP Resolve %s", err.Error()) + return + } + // 读取数据 buf := make([]byte, 2048) - n, err := conn.Read(buf) + n, addr, err := conn.ReadFromUDPAddrPort(buf) if err != nil { - logger.Errorf("error reading from UDP connection: %s", err.Error()) + logger.Errorf("UDP Resolve ReadFromUDPAddrPort Error: %s", err.Error()) return } @@ -73,7 +78,7 @@ func (r *TraceTask) CreateUDP() error { // logger.Infof("socket UDP Base64: %s", base64.StdEncoding.EncodeToString(buf[:n])) mData, err := UDPDataHandler(buf, n) if err != nil { - logger.Errorf("udp resolve data fail: %s", err.Error()) + logger.Errorf("UDP Resolve UDPDataHandler Error: %s", err.Error()) return } taskId := parse.Number(mData["taskId"]) @@ -98,6 +103,11 @@ func (r *TraceTask) CreateUDP() error { logger.Infof("pcapFile: %s", v) wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId) } + + // 发送响应 + if _, err := conn.WriteToUDPAddrPort([]byte("udp>"), addr); err != nil { + logger.Errorf("UDP Resolve WriteToUDPAddrPort Error: %s", err.Error()) + } }) // ============ 测试接收网元UDP发过来的数据 @@ -107,13 +117,18 @@ func (r *TraceTask) CreateUDP() error { return err } // 接收处理TCP数据 - go tcpService.Resolve(func(conn *net.Conn) { + go tcpService.Resolve(func(conn *net.Conn, err error) { + if err != nil { + logger.Errorf("TCP Resolve %s", err.Error()) + return + } + c := (*conn) // 读取数据 buf := make([]byte, 2048) n, err := c.Read(buf) if err != nil { - logger.Errorf("error reading from TCP connection: %s", err.Error()) + logger.Errorf("TCP Resolve Read Error: %s", err.Error()) return } @@ -122,7 +137,7 @@ func (r *TraceTask) CreateUDP() error { logger.Infof("socket TCP Base64: %s", deData) mData, err := UDPDataHandler(deData, len(deData)) if err != nil { - logger.Errorf("tcp resolve data fail: %s", err.Error()) + logger.Errorf("TCP Resolve UDPDataHandler Error: %s", err.Error()) return } taskId := parse.Number(mData["taskId"]) @@ -147,6 +162,11 @@ func (r *TraceTask) CreateUDP() error { logger.Infof("pcapFile: %s", v) wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%d", wsService.GROUP_TRACE_NE, taskId), taskId) } + + // 发送响应 + if _, err = c.Write([]byte("tcp>")); err != nil { + logger.Errorf("TCP Resolve Write Error: %s", err.Error()) + } }) return nil } From 5c0a49b820c3f7ba048662465536d762b7ba1747 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Oct 2024 14:56:54 +0800 Subject: [PATCH 34/69] =?UTF-8?q?fix:=20=E6=8A=93=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E8=BF=94=E5=9B=9E=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=94=A8=E4=BA=8E=E6=9F=A5=E7=9C=8B=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/trace/controller/tcpdump.go | 37 +----------- src/modules/trace/service/tcpdump.go | 78 +++++-------------------- src/modules/trace/trace.go | 4 -- 3 files changed, 17 insertions(+), 102 deletions(-) diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index 03ace4da..0133f067 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -1,9 +1,6 @@ package controller import ( - "os" - "path/filepath" - "be.ems/src/framework/i18n" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/vo/result" @@ -67,42 +64,12 @@ func (s *TCPdumpController) DumpStop(c *gin.Context) { return } - taskLog, err := s.tcpdumpService.DumpStop(body.NeType, body.NeId, body.TaskCode) + logFiles, err := s.tcpdumpService.DumpStop(body.NeType, body.NeId, body.TaskCode) if err != nil { c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) return } - c.JSON(200, result.OkMsg(taskLog)) -} - -// 网元抓包PACP 下载 -// -// GET /download -func (s *TCPdumpController) DumpDownload(c *gin.Context) { - language := ctx.AcceptLanguage(c) - var query struct { - NeType string `form:"neType" binding:"required"` // 网元类型 - NeID string `form:"neId" binding:"required"` // 网元ID - TaskCode string `form:"taskCode" binding:"required"` // 任务码,停止任务并查看日志信息 - DelTemp bool `form:"delTemp"` // 完成后是否删除本地临时zip文件 - } - if err := c.ShouldBindQuery(&query); err != nil { - c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - zipFilePath, err := s.tcpdumpService.DumpDownload(query.NeType, query.NeID, query.TaskCode) - if err != nil { - c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - - defer func() { - if query.DelTemp { - _ = os.Remove(zipFilePath) - } - }() - c.FileAttachment(zipFilePath, filepath.Base(zipFilePath)) + c.JSON(200, result.OkData(logFiles)) } // UPF标准版内部抓包 diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index 72c8553d..b94a027d 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -2,16 +2,13 @@ package service import ( "fmt" - "os" "path/filepath" "regexp" - "runtime" "strings" "sync" "time" "be.ems/src/framework/logger" - "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/ssh" neService "be.ems/src/modules/network_element/service" ) @@ -97,16 +94,16 @@ func (s *TCPdump) DumpStart(neType, neId, cmdStr string) (string, error) { } // DumpStop 停止已存在抓包句柄 -func (s *TCPdump) DumpStop(neType, neId, taskCode string) (string, error) { +func (s *TCPdump) DumpStop(neType, neId, taskCode string) ([]string, error) { // 查询网元获取IP neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId || neInfo.IP == "" { - return "", fmt.Errorf("app.common.noNEInfo") + return []string{}, fmt.Errorf("app.common.noNEInfo") } // 网元主机的SSH客户端 sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) if err != nil { - return "", err + return []string{}, err } defer sshClient.Close() @@ -114,26 +111,28 @@ func (s *TCPdump) DumpStop(neType, neId, taskCode string) (string, error) { pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) PIDMap, ok := dumpPIDMap.Load(pidKey) if !ok || PIDMap == nil { - return "", fmt.Errorf("tcpdump is not running") + return []string{}, fmt.Errorf("tcpdump is not running") } pid, ok := PIDMap.(map[string]string)["pid"] if !ok || pid == "" { - return "", fmt.Errorf("tcpdump is not running") + return []string{}, fmt.Errorf("tcpdump is not running") } + s.logFileLastLineToFile(PIDMap.(map[string]string), sshClient) + // 存放文件目录 /tmp/omc/tcpdump/udm/001/20240817104241 neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeId, taskCode) // 命令拼装 - sendCmd := fmt.Sprintf("pids=$(pgrep -P %s) && [ -n \"$pids\" ] && sudo kill $pids;sudo timeout 2s cat %s/tcpdump.log", pid, neDirTemp) - // pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s cat tcpdump.log + sendCmd := fmt.Sprintf("pids=$(pgrep -P %s) && [ -n \"$pids\" ] && sudo kill $pids;sudo timeout 2s ls %s", pid, neDirTemp) + // pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s ls /tmp/omc/tcpdump/udm/001/20240817104241 output, err := sshClient.RunCMD(sendCmd) - if err != nil || strings.HasPrefix(output, "stderr:") { - logger.Errorf("DumpStop err: %s => %s", strings.TrimSpace(output), err.Error()) - return "", err + output = strings.TrimSpace(output) + if err != nil || strings.HasPrefix(output, "ls: ") { + logger.Errorf("DumpStop err: %s => %s", output, err.Error()) + return []string{}, err } - - s.logFileLastLineToFile(PIDMap.(map[string]string), sshClient) + files := strings.Split(output, "\n") dumpPIDMap.Delete(pidKey) - return output, nil + return files, nil } // logFileLastLine 日志文件最后行号 @@ -207,53 +206,6 @@ func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string, sshClient *ssh return nil } -// DumpDownload 抓包文件网元端复制到本地输出zip文件 -func (s *TCPdump) DumpDownload(neType, neId, taskCode string) (string, error) { - // 查询网元获取IP - neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(neType, neId) - if neInfo.NeId != neId || neInfo.IP == "" { - return "", fmt.Errorf("app.common.noNEInfo") - } - // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.NeType, neInfo.NeId) - if err != nil { - return "", err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", fmt.Errorf("ne info sftp client err") - } - defer sftpClient.Close() - - neTypeLower := strings.ToLower(neInfo.NeType) - // 网管本地路径 - localDirPath := fmt.Sprintf("/tmp/omc/tcpdump/zip/%s/%s", neTypeLower, neInfo.NeId) - if runtime.GOOS == "windows" { - localDirPath = fmt.Sprintf("C:%s", localDirPath) - } - - // 网元pcap目录 /tmp/omc/tcpdump/udm/001/20240817104241 - sshClient.RunCMD("mkdir -p /tmp/omc && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/tcpdump/%s/%s/%s", neTypeLower, neInfo.NeId, taskCode) - // 网元端复制到本地 - localDirFilePath := filepath.Join(localDirPath, taskCode) - if err = sftpClient.CopyDirRemoteToLocal(neDirTemp, localDirFilePath); err != nil { - return "", fmt.Errorf("copy tcpdump file err") - } - - // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-pcap-%s.zip", neTypeLower, neInfo.NeId, taskCode) - zipFilePath := filepath.Join(localDirPath, zipFileName) - if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil { - return "", fmt.Errorf("compress zip err") - } - - _ = os.RemoveAll(localDirFilePath) // 删除本地临时目录 - return zipFilePath, nil -} - // UPFTrace UPF标准版内部抓包 func (s *TCPdump) UPFTrace(neType, neId, cmdStr string) (string, error) { // 命令检查 diff --git a/src/modules/trace/trace.go b/src/modules/trace/trace.go index 3ffb0ab2..0fe3b742 100644 --- a/src/modules/trace/trace.go +++ b/src/modules/trace/trace.go @@ -30,10 +30,6 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.tcpdump", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewTCPdump.DumpStop, ) - tcpdumpGroup.GET("/download", - middleware.PreAuthorize(nil), - controller.NewTCPdump.DumpDownload, - ) tcpdumpGroup.POST("/upf", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.tcpdump", collectlogs.BUSINESS_TYPE_OTHER)), From 04b9038eed6f75e369291b9a855e73be986589a2 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Oct 2024 15:11:38 +0800 Subject: [PATCH 35/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=B3=BB=E7=BB=9F=E9=83=A8=E9=97=A8=E8=A1=A8=E8=AF=AF?= =?UTF-8?q?=E5=88=A0=E7=B3=BB=E7=BB=9F=E8=8F=9C=E5=8D=95=E8=A1=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/upgrade/upg_sys_dept.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/database/upgrade/upg_sys_dept.sql b/database/upgrade/upg_sys_dept.sql index 428e6c82..86192e59 100644 --- a/database/upgrade/upg_sys_dept.sql +++ b/database/upgrade/upg_sys_dept.sql @@ -1,6 +1,5 @@ SET FOREIGN_KEY_CHECKS=0; -DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE IF NOT EXISTS `sys_dept` ( `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', `parent_id` bigint(20) DEFAULT 0 COMMENT '父部门id 默认0', From af1f3c9d084d1cad3e941693d563f94d4a6fbc8f Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 15:38:16 +0800 Subject: [PATCH 36/69] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=95=B0=E6=8D=AE=E5=80=BC=E5=8F=AF=E8=83=BD=E6=98=AF?= =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/upgrade/upg_u_sub_user.sql | 2 +- src/modules/system/controller/sys_config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/database/upgrade/upg_u_sub_user.sql b/database/upgrade/upg_u_sub_user.sql index 4e52b900..588b338b 100644 --- a/database/upgrade/upg_u_sub_user.sql +++ b/database/upgrade/upg_u_sub_user.sql @@ -2,7 +2,7 @@ -- Table structure for table `u_sub_user` -- -- DROP TABLE IF EXISTS `u_sub_user`; -CREATE TABLE `u_sub_user` ( +CREATE TABLE IF NOT EXISTS `u_sub_user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', diff --git a/src/modules/system/controller/sys_config.go b/src/modules/system/controller/sys_config.go index e4a02837..5809dca6 100644 --- a/src/modules/system/controller/sys_config.go +++ b/src/modules/system/controller/sys_config.go @@ -214,7 +214,7 @@ func (s *SysConfigController) ConfigKey(c *gin.Context) { } key := s.sysConfigService.SelectConfigValueByKey(configKey) if key != "" { - c.JSON(200, result.OkData(key)) + c.JSON(200, result.OkData(i18n.TKey(language, key))) return } c.JSON(200, result.Err(nil)) From f278fac306d4a3407afd93bbfc403a13eb434baa Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 16:37:08 +0800 Subject: [PATCH 37/69] =?UTF-8?q?sql:=20=E5=88=9D=E5=A7=8B=E7=BD=91?= =?UTF-8?q?=E5=85=83=E7=9B=B8=E5=85=B3=E8=A1=A8=E5=AD=97=E6=AE=B5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/ne_host.sql | 97 +++++++++++++++-------------- database/install/ne_info.sql | 59 +++++++++--------- database/install/ne_license.sql | 25 ++++---- database/install/ne_version.sql | 35 +++++------ database/upgrade/upg_ne_host.sql | 49 +++++++++------ database/upgrade/upg_ne_info.sql | 36 +++++------ database/upgrade/upg_ne_license.sql | 22 +++---- database/upgrade/upg_ne_version.sql | 32 +++++----- 8 files changed, 181 insertions(+), 174 deletions(-) diff --git a/database/install/ne_host.sql b/database/install/ne_host.sql index 5f3b28cb..e531a7cc 100644 --- a/database/install/ne_host.sql +++ b/database/install/ne_host.sql @@ -7,57 +7,58 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_host`; - -CREATE TABLE `ne_host` ( +CREATE TABLE `ne_host` ( `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键', - `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机类型 ssh telnet', - `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', - `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '标题名称', - `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址', - `port` int NULL DEFAULT 22 COMMENT 'SSH端口', - `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机用户名', - `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', - `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证密码', - `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥', - `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥密码', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '连接类型 ssh telnet redis', + `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', + `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标题名称', + `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址', + `port` int DEFAULT '22' COMMENT '端口 22 4100 6379', + `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证用户名', + `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', + `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证密码', + `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥', + `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥密码', + `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '数据库名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`host_id`) USING BTREE, - UNIQUE INDEX `uk_type_group_title`(`host_type` ASC, `group_id` ASC, `title` ASC) USING BTREE COMMENT '同组内名称唯一' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元主机表' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_group_title` (`host_type`,`group_id`,`title`) USING BTREE COMMENT '同组内名称唯一' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元主机表'; -- 初始数据对应网元 -INSERT INTO `ne_host` VALUES (1, 'ssh', '1', 'OMC_001_22', '127.0.0.1', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (2, 'telnet', '1', 'OMC_001_4100', '127.0.0.1', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (3, 'ssh', '1', 'IMS_001_22', '172.16.5.110', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708314682742, NULL, 0); -INSERT INTO `ne_host` VALUES (4, 'telnet', '1', 'IMS_001_4100', '172.16.5.110', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (5, 'ssh', '1', 'AMF_001_22', '172.16.5.120', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708314682742, NULL, 0); -INSERT INTO `ne_host` VALUES (6, 'telnet', '1', 'AMF_001_4100', '172.16.5.120', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (7, 'ssh', '1', 'AUSF_001_22', '172.16.5.130', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (8, 'telnet', '1', 'AUSF_001_4100', '172.16.5.130', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (9, 'ssh', '1', 'UDM_001_22', '172.16.5.140', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (10, 'telnet', '1', 'UDM_001_4100', '172.16.5.140', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (11, 'ssh', '1', 'SMF_001_22', '172.16.5.150', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (12, 'telnet', '1', 'SMF_001_4100', '172.16.5.150', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (13, 'ssh', '1', 'PCF_001_22', '172.16.5.160', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (14, 'telnet', '1', 'PCF_001_4100', '172.16.5.160', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (15, 'ssh', '1', 'NSSF_001_22', '172.16.5.170', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (16, 'telnet', '1', 'NSSF_001_4100', '172.16.5.170', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (17, 'ssh', '1', 'NRF_001_22', '172.16.5.180', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (18, 'telnet', '1', 'NRF_001_4100', '172.16.5.180', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (19, 'ssh', '1', 'UPF_001_22', '172.16.5.190', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (20, 'telnet', '1', 'UPF_001_4100', '172.16.5.190', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (21, 'telnet', '1', 'UPF_001_5002', '172.16.5.190', 5002, 'admin', '0', '', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (22, 'ssh', '1', 'LMF_001_22', '172.16.5.200', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (23, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (24, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (25, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (26, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (27, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (28, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '0', 'E4Tm7TQuydT1aOXXYvjAIUnSSwqSPaeZ59Ls4qRcxZU=', '', '', '', 'admin', 1708333292882, NULL, 0); -INSERT INTO `ne_host` VALUES (29, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'gsjnG8iYpON7T9ae21l955gZi8RRsBWr2WRP31x6ENg=', '', '', '', 'admin', 1708333292882, NULL, 0); +INSERT INTO `ne_host` VALUES (1, 'ssh', '1', 'OMC_001_22', '127.0.0.1', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (2, 'telnet', '1', 'OMC_001_4100', '127.0.0.1', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (3, 'ssh', '1', 'IMS_001_22', '172.16.5.110', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (4, 'telnet', '1', 'IMS_001_4100', '172.16.5.110', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (5, 'ssh', '1', 'AMF_001_22', '172.16.5.120', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (6, 'telnet', '1', 'AMF_001_4100', '172.16.5.120', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (7, 'ssh', '1', 'AUSF_001_22', '172.16.5.130', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (8, 'telnet', '1', 'AUSF_001_4100', '172.16.5.130', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (9, 'ssh', '1', 'UDM_001_22', '172.16.5.140', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (10, 'telnet', '1', 'UDM_001_4100', '172.16.5.140', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (11, 'redis', '1', 'UDM_001_6379', '172.16.5.140', 6379, 'udmdb', '0', 'nO3fEhtuKuBkQE5ozsUhNfzn02vhnyxYTEiPn2CIlr4=', '', '', '0', '', 'supervisor', 1728989383529, 'supervisor', 1729065073516); +INSERT INTO `ne_host` VALUES (12, 'ssh', '1', 'SMF_001_22', '172.16.5.150', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (13, 'telnet', '1', 'SMF_001_4100', '172.16.5.150', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (14, 'ssh', '1', 'PCF_001_22', '172.16.5.160', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (15, 'telnet', '1', 'PCF_001_4100', '172.16.5.160', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (16, 'ssh', '1', 'NSSF_001_22', '172.16.5.170', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (17, 'telnet', '1', 'NSSF_001_4100', '172.16.5.170', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (18, 'ssh', '1', 'NRF_001_22', '172.16.5.180', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (19, 'telnet', '1', 'NRF_001_4100', '172.16.5.180', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (20, 'ssh', '1', 'UPF_001_22', '172.16.5.190', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (21, 'telnet', '1', 'UPF_001_4100', '172.16.5.190', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (22, 'telnet', '1', 'UPF_001_5002', '172.16.5.190', 5002, 'admin', '0', '', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (23, 'ssh', '1', 'LMF_001_22', '172.16.5.200', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (23, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (24, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (25, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (26, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (27, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (28, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (29, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); SET FOREIGN_KEY_CHECKS=1; diff --git a/database/install/ne_info.sql b/database/install/ne_info.sql index 797dfb07..0c295b60 100644 --- a/database/install/ne_info.sql +++ b/database/install/ne_info.sql @@ -7,47 +7,44 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_info`; - CREATE TABLE `ne_info` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `port` int NULL DEFAULT 0 COMMENT '端口', - `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'PNF' COMMENT '\'PNF\',\'VNF\'', - `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '省份地域', - `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-', - `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'MAC地址', - `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet,telnet)', - `status` int NULL DEFAULT 0 COMMENT '0离线 1在线 2配置待下发', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `port` int DEFAULT '0' COMMENT '端口', + `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'PNF' COMMENT '''PNF'',''VNF''', + `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '省份地域', + `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-', + `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'MAC地址', + `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet)-来自ne_host表', + `status` int DEFAULT '0' COMMENT '0离线 1在线 2配置待下发', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `ux_netype_neid`(`ne_type` ASC, `ne_id` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元信息表 对应一个网元版本、网元授权、网元主机' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `ux_netype_neid` (`ne_type`,`ne_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元信息表 对应一个网元版本、网元授权、网元主机'; -- 初始网元数据 INSERT INTO `ne_info` VALUES (1, 'OMC', '001', '4400HXOMC001', 'OMC_001', '172.16.5.100', 33030, 'PNF', '-', '-', '-', '-', '1,2', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (2, 'IMS', '001', '4400HXIMS001', 'IMS_001', '172.16.5.110', 33030, 'PNF', '-', '-', '-', '-', '3,4', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (3, 'AMF', '001', '4400HXAMF001', 'AMF_001', '172.16.5.120', 33030, 'PNF', '-', '-', '-', '', '5,6', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (4, 'AUSF', '001', '4400HXAUSF001', 'AUSF_001', '172.16.5.130', 33030, 'PNF', '-', '-', '-', '', '7,8', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (5, 'UDM', '001', '4400HXUDM001', 'UDM_001', '172.16.5.140', 33030, 'PNF', '-', '-', '-', '-', '9,10', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (6, 'SMF', '001', '4400HXSMF001', 'SMF_001', '172.16.5.150', 33030, 'PNF', '-', '-', '-', '-', '11,12', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (7, 'PCF', '001', '4400HXPCF001', 'PCF_001', '172.16.5.160', 33030, 'PNF', '-', '-', '-', '-', '13,14', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (8, 'NSSF', '001', '4400HXNSF001', 'NSSF_001', '172.16.5.170', 33030, 'PNF', '-', '-', '-', '-', '15,16', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (9, 'NRF', '001', '4400HXNRF001', 'NRF_001', '172.16.5.180', 33030, 'PNF', '-', '-', '-', '-', '17,18', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (10, 'UPF', '001', '4400HXUPF001', 'UPF_001', '172.16.5.190', 33030, 'PNF', '-', '-', '-', '', '19,20,21', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (11, 'LMF', '001', '4400HXLMF001', 'LMF_001', '172.16.5.200', 33030, 'PNF', '-', '-', '-', '-', '22,23', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (12, 'NEF', '001', '4400HXNEF001', 'NEF_001', '172.16.5.210', 33030, 'PNF', '-', '-', '-', '-', '24,25', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (13, 'MME', '001', '4400HXMME001', 'MME_001', '172.16.5.220', 33030, 'PNF', '-', '-', '-', '', '26,27', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (14, 'N3IWF', '001', '4400HXN3IWF001', 'N3IWF_001', '172.16.5.230', 33030, 'PNF', '-', '-', '-', '', '28,29', 0, '', '', 0, '', 0); - - +INSERT INTO `ne_info` VALUES (5, 'UDM', '001', '4400HXUDM001', 'UDM_001', '172.16.5.140', 33030, 'PNF', '-', '-', '-', '-', '9,10,11', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (6, 'SMF', '001', '4400HXSMF001', 'SMF_001', '172.16.5.150', 33030, 'PNF', '-', '-', '-', '-', '12,13', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (7, 'PCF', '001', '4400HXPCF001', 'PCF_001', '172.16.5.160', 33030, 'PNF', '-', '-', '-', '-', '14,15', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (8, 'NSSF', '001', '4400HXNSF001', 'NSSF_001', '172.16.5.170', 33030, 'PNF', '-', '-', '-', '-', '16,17', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (9, 'NRF', '001', '4400HXNRF001', 'NRF_001', '172.16.5.180', 33030, 'PNF', '-', '-', '-', '-', '18,19', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (10, 'UPF', '001', '4400HXUPF001', 'UPF_001', '172.16.5.190', 33030, 'PNF', '-', '-', '-', '', '20,21,22', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (11, 'LMF', '001', '4400HXLMF001', 'LMF_001', '172.16.5.200', 33030, 'PNF', '-', '-', '-', '-', '23,24', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (12, 'NEF', '001', '4400HXNEF001', 'NEF_001', '172.16.5.210', 33030, 'PNF', '-', '-', '-', '-', '25,26', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (13, 'MME', '001', '4400HXMME001', 'MME_001', '172.16.5.220', 33030, 'PNF', '-', '-', '-', '', '27,28', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (14, 'N3IWF', '001', '4400HXN3IWF001', 'N3IWF_001', '172.16.5.230', 33030, 'PNF', '-', '-', '-', '', '29,30', 0, '', '', 0, '', 0); SET FOREIGN_KEY_CHECKS=1; diff --git a/database/install/ne_license.sql b/database/install/ne_license.sql index 058d3a5a..9df0c78f 100644 --- a/database/install/ne_license.sql +++ b/database/install/ne_license.sql @@ -7,24 +7,23 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_license`; - -CREATE TABLE `ne_license` ( +CREATE TABLE `ne_license` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', `activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码', - `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '激活授权文件', - `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '序列号', - `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '许可证到期日期', - `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态 0无效 1有效', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件', + `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号', + `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期', + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态 0无效 1有效', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和网元ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元授权激活信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和网元ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元授权激活信息'; -- 初始数据对应网元 INSERT INTO `ne_license` VALUES (1, 'OMC', '001', '', '', '', '', '0', '', 'supervisor', 1713928436971, '', 0); diff --git a/database/install/ne_version.sql b/database/install/ne_version.sql index d3895665..a85a48d4 100644 --- a/database/install/ne_version.sql +++ b/database/install/ne_version.sql @@ -7,28 +7,27 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ne_version`; - -CREATE TABLE `ne_version` ( +CREATE TABLE `ne_version` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前包名', - `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前版本', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '当前软件包', - `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本包名', - `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本', - `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '上一版本软件包', - `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本报名', - `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本', - `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '新版软件包', - `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前包名', + `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前版本', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '当前软件包', + `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本包名', + `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本', + `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上一版本软件包', + `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本报名', + `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本', + `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '新版软件包', + `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元版本信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元版本信息'; -- 初始数据对应网元 INSERT INTO `ne_version` VALUES (1, 'OMC', '001', '', '', '', '', '', '', '', '', '', '0', 'supervisor', 1713928436957, '', 0); diff --git a/database/upgrade/upg_ne_host.sql b/database/upgrade/upg_ne_host.sql index b391a74e..5a9dffd0 100644 --- a/database/upgrade/upg_ne_host.sql +++ b/database/upgrade/upg_ne_host.sql @@ -1,24 +1,35 @@ SET FOREIGN_KEY_CHECKS=0; -CREATE TABLE IF NOT EXISTS `ne_host` ( +CREATE TABLE IF NOT EXISTS `ne_host` ( `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键', - `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机类型 ssh telnet', - `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', - `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '标题名称', - `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址', - `port` int NULL DEFAULT 22 COMMENT 'SSH端口', - `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机用户名', - `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', - `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证密码', - `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥', - `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证私钥密码', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '连接类型 ssh telnet redis', + `group_id` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '分组(0默认 1网元 2系统)', + `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标题名称', + `addr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址', + `port` int DEFAULT '22' COMMENT '端口 22 4100 6379', + `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证用户名', + `auth_mode` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '认证模式(0密码 1主机私钥 2已免密)', + `password` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证密码', + `private_key` varchar(6000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥', + `pass_phrase` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证私钥密码', + `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '数据库名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`host_id`) USING BTREE, - UNIQUE INDEX `uk_type_group_title`(`host_type` ASC, `group_id` ASC, `title` ASC) USING BTREE COMMENT '同组内名称唯一' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元主机表' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_group_title` (`host_type`,`group_id`,`title`) USING BTREE COMMENT '同组内名称唯一' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元主机表'; -SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file +-- 20241016前旧表更新 +ALTER TABLE `ne_host` ADD COLUMN IF NOT EXISTS `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '数据库名称' AFTER `pass_phrase`; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `host_id` bigint NOT NULL COMMENT '主机主键' FIRST; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '连接类型 ssh telnet redis' AFTER `host_id`; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `port` int NULL DEFAULT 22 COMMENT '端口 22 4100 6379' AFTER `addr`; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证用户名' AFTER `port`; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `create_by`; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间' AFTER `update_by`; +ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键'; + +SET FOREIGN_KEY_CHECKS=1; diff --git a/database/upgrade/upg_ne_info.sql b/database/upgrade/upg_ne_info.sql index 0647b3d8..8a552f33 100644 --- a/database/upgrade/upg_ne_info.sql +++ b/database/upgrade/upg_ne_info.sql @@ -7,25 +7,25 @@ CREATE TABLE IF NOT EXISTS `ne_info` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', - `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `port` int NULL DEFAULT 0 COMMENT '端口', - `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'PNF' COMMENT '\'PNF\',\'VNF\'', - `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '省份地域', - `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-', - `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '', - `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'MAC地址', - `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet,telnet)', - `status` int NULL DEFAULT 0 COMMENT '0离线 1在线 2配置待下发', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `rm_uid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `port` int DEFAULT '0' COMMENT '端口', + `pv_flag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'PNF' COMMENT '''PNF'',''VNF''', + `province` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '省份地域', + `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-', + `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', + `ne_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'MAC地址', + `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet)-来自ne_host表', + `status` int DEFAULT '0' COMMENT '0离线 1在线 2配置待下发', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `ux_netype_neid`(`ne_type` ASC, `ne_id` ASC) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元信息表 对应一个网元版本、网元授权、网元主机' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `ux_netype_neid` (`ne_type`,`ne_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元信息表 对应一个网元版本、网元授权、网元主机'; -- 20240511前旧表更新 ALTER TABLE `ne_info` COMMENT = '网元信息表 对应一个网元版本、网元授权、网元主机'; diff --git a/database/upgrade/upg_ne_license.sql b/database/upgrade/upg_ne_license.sql index a7f4f2ec..cf221fc6 100644 --- a/database/upgrade/upg_ne_license.sql +++ b/database/upgrade/upg_ne_license.sql @@ -8,18 +8,18 @@ CREATE TABLE IF NOT EXISTS `ne_license` ( `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', `activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码', - `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '激活授权文件', - `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '序列号', - `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '许可证到期日期', - `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态 0无效 1有效', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件', + `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号', + `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期', + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态 0无效 1有效', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和网元ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元授权激活信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和网元ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元授权激活信息'; -- 20240511前旧表更新 ALTER TABLE `ne_license` COMMENT = '网元授权激活信息'; diff --git a/database/upgrade/upg_ne_version.sql b/database/upgrade/upg_ne_version.sql index 6189fdff..850a240e 100644 --- a/database/upgrade/upg_ne_version.sql +++ b/database/upgrade/upg_ne_version.sql @@ -7,23 +7,23 @@ CREATE TABLE IF NOT EXISTS `ne_version` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元类型', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元ID', - `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前包名', - `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '当前版本', - `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '当前软件包', - `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本包名', - `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '上一版本', - `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '上一版本软件包', - `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本报名', - `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '-' COMMENT '新版本', - `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '新版软件包', - `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', - `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间', + `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前包名', + `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前版本', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '当前软件包', + `pre_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本包名', + `pre_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '上一版本', + `pre_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上一版本软件包', + `new_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本报名', + `new_version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '新版本', + `new_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '新版软件包', + `status` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '当前状态 0无 1当前版本 2上一版本 3有新版本', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_type_id`(`ne_type` ASC, `ne_id` ASC) USING BTREE COMMENT '唯一网元类型和ID' -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '网元版本信息' ROW_FORMAT = DYNAMIC; + UNIQUE KEY `uk_type_id` (`ne_type`,`ne_id`) USING BTREE COMMENT '唯一网元类型和ID' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元版本信息'; -- 20240511前旧表更新 ALTER TABLE `ne_version` COMMENT = '网元版本信息'; From 9c10b4873b0fd180f4f154253290a5b331f3ad93 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 16:38:01 +0800 Subject: [PATCH 38/69] =?UTF-8?q?sql:=20=E7=BD=91=E5=85=83=E4=B8=BB?= =?UTF-8?q?=E6=9C=BA=E8=BF=9E=E6=8E=A5=E5=8F=82=E6=95=B0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E5=A4=9A=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_dict_data1_i18n_zh.sql | 2 +- database/install/sys_dict_data2_i18n_en.sql | 2 +- database/upgrade/upg_sys_dict_data1_i18n_zh.sql | 2 +- database/upgrade/upg_sys_dict_data2_i18n_en.sql | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 63d464aa..120c4710 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -591,7 +591,7 @@ INSERT INTO `sys_dict_data` VALUES (2080, 2080, 'log.operate.title.ws', 'WS会 INSERT INTO `sys_dict_data` VALUES (2081, 2081, 'log.operate.title.neHost', '网元主机', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2082, 2082, 'neHost.noData', '没有可访问主机信息数据!', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2083, 2083, 'neHost.errKeyExists', '主机信息操作【{name}】失败,同组内名称已存在', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接主机失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2085, 2085, 'dictType.ne_host_type', '网元主机连接类型', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2086, 2086, 'dictType.ne_host_groupId', '网元主机分组', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2087, 2087, 'dictType.ne_host_authMode', '网元主机认证模式', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 99bf6c1c..5deed3df 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -591,7 +591,7 @@ INSERT INTO `sys_dict_data` VALUES (4080, 4080, 'log.operate.title.ws', 'WS Sess INSERT INTO `sys_dict_data` VALUES (4081, 4081, 'log.operate.title.neHost', 'NE Host', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4082, 4082, 'neHost.noData', 'There is no accessible host information data!', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4083, 4083, 'neHost.errKeyExists', 'Host information operation [{name}] failed, name already exists in the same group', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -INSERT INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Failed to connect to the host, please check the connection parameters and try again', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Connection Failed, Please check connection parameters and retry', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4085, 4085, 'dictType.ne_host_type', 'Network element host connection type', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4086, 4086, 'dictType.ne_host_groupId', 'Network element host grouping', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4087, 4087, 'dictType.ne_host_authMode', 'Network element host authentication mode', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index ed3447c8..b22c296e 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -598,7 +598,7 @@ REPLACE INTO `sys_dict_data` VALUES (2080, 2080, 'log.operate.title.ws', 'WS会 REPLACE INTO `sys_dict_data` VALUES (2081, 2081, 'log.operate.title.neHost', '网元主机', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2082, 2082, 'neHost.noData', '没有可访问主机信息数据!', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2083, 2083, 'neHost.errKeyExists', '主机信息操作【{name}】失败,同组内名称已存在', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -REPLACE INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接主机失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2084, 2084, 'neHost.errByHostInfo', '连接失败,请检查连接参数后重试', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2085, 2085, 'dictType.ne_host_type', '网元主机连接类型', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2086, 2086, 'dictType.ne_host_groupId', '网元主机分组', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2087, 2087, 'dictType.ne_host_authMode', '网元主机认证模式', 'i18n_zh', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index e9250b47..f26b8d59 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -593,7 +593,7 @@ REPLACE INTO `sys_dict_data` VALUES (4080, 4080, 'log.operate.title.ws', 'WS Ses REPLACE INTO `sys_dict_data` VALUES (4081, 4081, 'log.operate.title.neHost', 'NE Host', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4082, 4082, 'neHost.noData', 'There is no accessible host information data!', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4083, 4083, 'neHost.errKeyExists', 'Host information operation [{name}] failed, name already exists in the same group', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); -REPLACE INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Failed to connect to the host, please check the connection parameters and try again', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4084, 4084, 'neHost.errByHostInfo', 'Connection Failed, Please check connection parameters and retry', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4085, 4085, 'dictType.ne_host_type', 'Network element host connection type', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4086, 4086, 'dictType.ne_host_groupId', 'Network element host grouping', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4087, 4087, 'dictType.ne_host_authMode', 'Network element host authentication mode', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); From 717ee894bddb269632449348fdc2ae14e3592f25 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 16:40:11 +0800 Subject: [PATCH 39/69] =?UTF-8?q?feat:=20=E7=BD=91=E5=85=83=E4=B8=BB?= =?UTF-8?q?=E6=9C=BA=E6=94=AF=E6=8C=81redis=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/redis/conn.go | 61 +++++++++++++++++++ src/framework/redis/redis.go | 9 +++ .../network_element/controller/ne_host.go | 16 +++++ src/modules/network_element/model/ne_host.go | 9 +-- .../network_element/repository/ne_host.go | 9 ++- 5 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 src/framework/redis/conn.go diff --git a/src/framework/redis/conn.go b/src/framework/redis/conn.go new file mode 100644 index 00000000..96b83f63 --- /dev/null +++ b/src/framework/redis/conn.go @@ -0,0 +1,61 @@ +package redis + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/redis/go-redis/v9" +) + +// ConnRedis 连接redis对象 +type ConnRedis struct { + Addr string `json:"addr"` // 地址 + Port int64 `json:"port"` // 端口 + User string `json:"user"` // 用户名 + Password string `json:"password"` // 认证密码 + Database int `json:"database"` // 数据库名称 + + DialTimeOut time.Duration `json:"dialTimeOut"` // 连接超时断开 + + Client *redis.Client `json:"client"` +} + +// NewClient 创建Redis客户端 +func (c *ConnRedis) NewClient() (*ConnRedis, error) { + // IPV6地址协议 + if strings.Contains(c.Addr, ":") { + c.Addr = fmt.Sprintf("[%s]", c.Addr) + } + addr := fmt.Sprintf("%s:%d", c.Addr, c.Port) + + // 默认等待5s + if c.DialTimeOut == 0 { + c.DialTimeOut = 5 * time.Second + } + + // 连接 + rdb := redis.NewClient(&redis.Options{ + Addr: addr, + // Username: c.User, + Password: c.Password, + DB: c.Database, + DialTimeout: c.DialTimeOut, + }) + + // 测试数据库连接 + if _, err := rdb.Ping(context.Background()).Result(); err != nil { + return nil, err + } + + c.Client = rdb + return c, nil +} + +// Close 关闭当前Redis客户端 +func (c *ConnRedis) Close() { + if c.Client != nil { + c.Client.Close() + } +} diff --git a/src/framework/redis/redis.go b/src/framework/redis/redis.go index ef574de5..9306b59e 100644 --- a/src/framework/redis/redis.go +++ b/src/framework/redis/redis.go @@ -30,6 +30,15 @@ if tonumber(current) == 1 then end return tonumber(current);`) +// 连接Redis实例 +func ConnectPush(source string, rdb *redis.Client) { + if rdb == nil { + delete(rdbMap, source) + return + } + rdbMap[source] = rdb +} + // 连接Redis实例 func Connect() { ctx := context.Background() diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 3b9c1871..613a88a7 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -4,6 +4,7 @@ import ( "strings" "be.ems/src/framework/i18n" + "be.ems/src/framework/redis" "be.ems/src/framework/telnet" "be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/parse" @@ -211,6 +212,21 @@ func (s *NeHostController) Test(c *gin.Context) { } return } + + if body.HostType == "redis" { + var connRedis redis.ConnRedis + body.CopyTo(&connRedis) + + client, err := connRedis.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + c.JSON(200, result.Ok(nil)) + return + } } // 网元主机发送命令 diff --git a/src/modules/network_element/model/ne_host.go b/src/modules/network_element/model/ne_host.go index 42409328..1ff3db06 100644 --- a/src/modules/network_element/model/ne_host.go +++ b/src/modules/network_element/model/ne_host.go @@ -5,16 +5,17 @@ import "encoding/json" // NeHost 网元主机表 ne_host type NeHost struct { HostID string `json:"hostId" gorm:"column:host_id"` // 主机主键 - HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet"` // 主机类型 ssh telnet redis + HostType string `json:"hostType" gorm:"column:host_type" binding:"oneof=ssh telnet redis"` // 连接类型 ssh telnet redis GroupID string `json:"groupId" gorm:"column:group_id"` // 分组(0默认 1网元 2系统) Title string `json:"title" gorm:"column:title"` // 标题名称 Addr string `json:"addr" gorm:"column:addr" binding:"required"` // 主机地址 - Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // 主机端口 22 4100 - User string `json:"user" gorm:"column:user" binding:"required"` // 主机用户名 + Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // 端口 22 4100 6379 + User string `json:"user" gorm:"column:user" binding:"required"` // 认证用户名 AuthMode string `json:"authMode" gorm:"column:auth_mode" binding:"oneof=0 1 2"` // 认证模式(0密码 1主机私钥 2已免密) Password string `json:"password" gorm:"column:password"` // 认证密码 PrivateKey string `json:"privateKey" gorm:"column:private_key"` // 认证私钥 PassPhrase string `json:"passPhrase" gorm:"column:pass_phrase"` // 认证私钥密码 + DBName string `json:"dbName" gorm:"column:db_name"` // 数据库名称 Remark string `json:"remark" gorm:"column:remark"` // 备注 CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 @@ -23,7 +24,7 @@ type NeHost struct { } // TableName 表名称 -func (NeHost) TableName() string { +func (*NeHost) TableName() string { return "ne_host" } diff --git a/src/modules/network_element/repository/ne_host.go b/src/modules/network_element/repository/ne_host.go index ca957179..27919785 100644 --- a/src/modules/network_element/repository/ne_host.go +++ b/src/modules/network_element/repository/ne_host.go @@ -15,7 +15,7 @@ import ( // 实例化数据层 NeHost 结构体 var NewNeHost = &NeHost{ selectSql: `select - host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, remark, create_by, create_time, update_by, update_time + host_id, host_type, group_id, title, addr, port, user, auth_mode, password, private_key, pass_phrase, db_name, remark, create_by, create_time, update_by, update_time from ne_host`, resultMap: map[string]string{ @@ -30,6 +30,7 @@ var NewNeHost = &NeHost{ "password": "Password", "private_key": "PrivateKey", "private_password": "PassPhrase", + "db_name": "DBName", "remark": "Remark", "create_by": "CreateBy", "create_time": "CreateTime", @@ -245,6 +246,9 @@ func (r *NeHost) Insert(neHost model.NeHost) string { if neHost.PassPhrase != "" { params["pass_phrase"] = neHost.PassPhrase } + if neHost.DBName != "" { + params["db_name"] = neHost.DBName + } if neHost.Remark != "" { params["remark"] = neHost.Remark } @@ -328,6 +332,9 @@ func (r *NeHost) Update(neHost model.NeHost) int64 { if neHost.PassPhrase != "" { params["pass_phrase"] = neHost.PassPhrase } + if neHost.DBName != "" { + params["db_name"] = neHost.DBName + } params["remark"] = neHost.Remark if neHost.UpdateBy != "" { params["update_by"] = neHost.UpdateBy From 87836c7adc35c45d8c9ea1785a94738a67249d12 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 16:41:57 +0800 Subject: [PATCH 40/69] =?UTF-8?q?fix:=20UDM=E6=95=B0=E6=8D=AE=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=E9=80=9A=E8=BF=87=E7=BD=91=E5=85=83=E4=B8=BB=E6=9C=BA?= =?UTF-8?q?=E7=9A=84Redis=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/controller/udm_auth.go | 12 +----- .../network_data/controller/udm_sub.go | 13 +----- .../network_data/repository/udm_auth.go | 3 +- .../network_data/repository/udm_sub.go | 5 ++- src/modules/network_data/service/udm_auth.go | 18 +++++++- src/modules/network_data/service/udm_sub.go | 24 ++++++++--- .../network_element/service/ne_info.go | 43 +++++++++++++++++-- 7 files changed, 83 insertions(+), 35 deletions(-) diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index dbaeb3ec..e4dd1fe1 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -46,7 +46,6 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { return } - neId = "" data := s.udmAuthService.ResetData(neId) c.JSON(200, result.OkData(data)) } @@ -56,7 +55,6 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { // GET /list func (s *UDMAuthController) List(c *gin.Context) { querys := ctx.QueryMap(c) - querys["neId"] = "" data := s.udmAuthService.SelectPage(querys) c.JSON(200, result.Ok(data)) } @@ -100,7 +98,6 @@ func (s *UDMAuthController) Info(c *gin.Context) { return } - neId = "" // 解析返回的数据 u := s.udmAuthService.ParseInfo(imsi, neId, data) s.udmAuthService.Insert(neId, u) @@ -150,7 +147,6 @@ func (s *UDMAuthController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" s.udmAuthService.Insert(neId, body) } c.JSON(200, result.OkData(data)) @@ -200,8 +196,7 @@ func (s *UDMAuthController) Adds(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.LoadData(neId, body.IMSI, num) + s.udmAuthService.LoadData(neId, body.IMSI, num) } c.JSON(200, result.OkData(data)) } @@ -249,7 +244,6 @@ func (s *UDMAuthController) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" s.udmAuthService.Insert(neId, body) } c.JSON(200, result.OkData(data)) @@ -300,7 +294,6 @@ func (s *UDMAuthController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - neId = "" s.udmAuthService.Delete(imsi, neId) } resultData[imsi] = data @@ -346,8 +339,7 @@ func (s *UDMAuthController) Removes(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmAuthService.LoadData(neId, imsi, num) + s.udmAuthService.LoadData(neId, imsi, num) } c.JSON(200, result.OkData(data)) } diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index cec49570..10718b2d 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -45,7 +45,6 @@ func (s *UDMSubController) ResetData(c *gin.Context) { return } - neId = "" data := s.udmSubService.ResetData(neId) c.JSON(200, result.OkData(data)) } @@ -55,7 +54,6 @@ func (s *UDMSubController) ResetData(c *gin.Context) { // 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)) } @@ -99,7 +97,6 @@ func (s *UDMSubController) Info(c *gin.Context) { return } - neId = "" // 解析返回的数据 u := s.udmSubService.ParseInfo(imsi, neId, data) s.udmSubService.Insert(neId, u) @@ -149,7 +146,6 @@ func (s *UDMSubController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" body.NeId = neId s.udmSubService.Insert(neId, body) } @@ -204,8 +200,7 @@ func (s *UDMSubController) Adds(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.LoadData(neId, body.IMSI, num, body.Remark) + s.udmSubService.LoadData(neId, body.IMSI, num, body.Remark) } c.JSON(200, result.OkData(data)) } @@ -253,7 +248,6 @@ func (s *UDMSubController) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" body.NeId = neId s.udmSubService.Insert(neId, body) } @@ -305,7 +299,6 @@ func (s *UDMSubController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - neId = "" s.udmSubService.Delete(neId, imsi) } resultData[imsi] = data @@ -351,9 +344,7 @@ func (s *UDMSubController) Removes(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - neId = "" - go s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-") - + s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-") } c.JSON(200, result.OkData(data)) } diff --git a/src/modules/network_data/repository/udm_auth.go b/src/modules/network_data/repository/udm_auth.go index 25f46684..b1429a4b 100644 --- a/src/modules/network_data/repository/udm_auth.go +++ b/src/modules/network_data/repository/udm_auth.go @@ -53,7 +53,8 @@ func (r *UDMAuthUser) convertResultRows(rows []map[string]any) []model.UDMAuthUs // ClearAndInsert 清空ne_id后新增实体 func (r *UDMAuthUser) ClearAndInsert(neId string, uArr []model.UDMAuthUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 - _, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil) + // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil) + _, err := datasource.ExecDB("", "DELETE FROM u_auth_user WHERE ne_id = ?", []any{neId}) if err != nil { logger.Errorf("TRUNCATE err => %v", err) } diff --git a/src/modules/network_data/repository/udm_sub.go b/src/modules/network_data/repository/udm_sub.go index 72e6ed26..d1025a33 100644 --- a/src/modules/network_data/repository/udm_sub.go +++ b/src/modules/network_data/repository/udm_sub.go @@ -82,9 +82,10 @@ func (r *UDMSubUser) convertResultRows(rows []map[string]any) []model.UDMSubUser } // ClearAndInsert 清空ne_id后新增实体 -func (r *UDMSubUser) ClearAndInsert(neID string, u []model.UDMSubUser) int64 { +func (r *UDMSubUser) ClearAndInsert(neId string, u []model.UDMSubUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 - _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) + // _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil) + _, err := datasource.ExecDB("", "DELETE FROM u_sub_user WHERE ne_id = ?", []any{neId}) if err != nil { logger.Errorf("TRUNCATE err => %v", err) } diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index 7b11e62b..069c6730 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -8,6 +8,7 @@ import ( "be.ems/src/framework/redis" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" ) // 实例化服务层 UDMAuthUser 结构体 @@ -25,12 +26,25 @@ type UDMAuthUser struct { func (r *UDMAuthUser) dataByRedis(imsi, neId string) []model.UDMAuthUser { arr := []model.UDMAuthUser{} key := fmt.Sprintf("ausf:%s", imsi) - ausfArr, err := redis.GetKeys("udmuser", key) + source := fmt.Sprintf("UDM_%s", neId) + + // 网元主机的Redis客户端 + redisClient, err := neService.NewNeInfo.NeRunRedisClient("UDM", neId) + if err != nil { + return arr + } + defer func() { + redisClient.Close() + redis.ConnectPush(source, nil) + }() + redis.ConnectPush(source, redisClient.Client) + + ausfArr, err := redis.GetKeys(source, key) if err != nil { return arr } for _, key := range ausfArr { - m, err := redis.GetHash("udmuser", key) + m, err := redis.GetHash(source, key) if err != nil { continue } diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 2f217cb2..ce97cf72 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -8,6 +8,7 @@ import ( "be.ems/src/framework/redis" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" + neService "be.ems/src/modules/network_element/service" ) // 实例化服务层 UDMSubUser 结构体 @@ -18,22 +19,33 @@ var NewUDMSub = &UDMSubUser{ // UDM签约信息 服务层处理 type UDMSubUser struct { - // UDM签约信息数据信息 - udmSubRepository *repository.UDMSubUser - // UDM用户IMSI信息数据信息 - udmUserInfoRepository *repository.UDMUserInfo + udmSubRepository *repository.UDMSubUser // UDM签约信息数据信息 + udmUserInfoRepository *repository.UDMUserInfo // UDM用户IMSI信息数据信息 } // dataByRedis UDM签约用户 db:0 中 udm-sd:* func (r *UDMSubUser) dataByRedis(imsi, neId string) []model.UDMSubUser { arr := []model.UDMSubUser{} key := fmt.Sprintf("udm-sd:%s", imsi) - udmsdArr, err := redis.GetKeys("udmuser", key) + source := fmt.Sprintf("UDM_%s", neId) + + // 网元主机的Redis客户端 + redisClient, err := neService.NewNeInfo.NeRunRedisClient("UDM", neId) + if err != nil { + return arr + } + defer func() { + redisClient.Close() + redis.ConnectPush(source, nil) + }() + redis.ConnectPush(source, redisClient.Client) + + udmsdArr, err := redis.GetKeys(source, key) if err != nil { return arr } for _, key := range udmsdArr { - m, err := redis.GetHash("udmuser", key) + m, err := redis.GetHash(source, key) if err != nil { continue } diff --git a/src/modules/network_element/service/ne_info.go b/src/modules/network_element/service/ne_info.go index 2c70a697..cdde10e1 100644 --- a/src/modules/network_element/service/ne_info.go +++ b/src/modules/network_element/service/ne_info.go @@ -27,8 +27,7 @@ var NewNeInfo = &NeInfo{ // 网元信息 服务层处理 type NeInfo struct { - // 网元信息数据信息 - neInfoRepository *repository.NeInfo + neInfoRepository *repository.NeInfo // 网元信息数据信息 Para5GData map[string]string } @@ -226,6 +225,7 @@ func (r *NeInfo) Insert(neInfo model.NeInfo) string { for _, host := range neInfo.Hosts { host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) host.GroupID = "1" + host.CreateBy = neInfo.CreateBy hostId := NewNeHost.Insert(host) if hostId != "" { hostIDs = append(hostIDs, hostId) @@ -250,6 +250,7 @@ func (r *NeInfo) Update(neInfo model.NeInfo) int64 { if host.HostID != "" { host.Title = fmt.Sprintf("%s_%s_%d", strings.ToUpper(neInfo.NeType), neInfo.NeId, host.Port) host.GroupID = "1" + host.UpdateBy = neInfo.UpdateBy NewNeHost.Update(host) } } @@ -371,7 +372,7 @@ func (r *NeInfo) NeRunSSHCmd(neType, neId, cmd string) (string, error) { } // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() -// num 是网元主机telnet 1:4100 2:5200 +// num 是网元主机telnet 1:4100 2:5200(UPF标准版) func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTelnet, error) { neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) if neInfo.NeId != neId { @@ -406,6 +407,42 @@ func (r *NeInfo) NeRunTelnetClient(neType, neId string, num int) (*telnet.ConnTe return telnetClient, nil } +// NeRunRedisClient 网元主机的Redis客户端-为创建相关连接,注意结束后 Close() +// 暂时只有UDM有Redis配置项 +func (r *NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error) { + neInfo := r.SelectNeInfoByNeTypeAndNeID(neType, neId) + if neInfo.NeId != neId { + logger.Errorf("NeRunRedisClient NeType:%s NeID:%s not found", neType, neId) + return nil, fmt.Errorf("neinfo not found") + } + // 取主机信息 + if neInfo.HostIDs == "" { + logger.Errorf("NeRunRedisClient NeType:%s NeID:%s hostId not found", neType, neId) + return nil, fmt.Errorf("neinfo hostId not found") + } + hostIds := strings.Split(neInfo.HostIDs, ",") + if len(hostIds) <= 2 { + logger.Errorf("NeRunRedisClient hosts id %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host id not found") + } + hostId := hostIds[2] + neHost := NewNeHost.SelectById(hostId) + if neHost.HostID == "" || neHost.HostID != hostId { + logger.Errorf("NeRunRedisClient Hosts %s not found", neInfo.HostIDs) + return nil, fmt.Errorf("neinfo host not found") + } + + // 创建链接Redis客户端 + var connRedis redis.ConnRedis + neHost.CopyTo(&connRedis) + redisClient, err := connRedis.NewClient() + if err != nil { + logger.Errorf("NeRunRedisClient NewClient err => %s", err.Error()) + return nil, fmt.Errorf("neinfo redis client new err") + } + return redisClient, nil +} + // NeConfOAMReadSync 网元OAM配置文件读取 func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { oamData, err := r.neConfOAMRead(neType, neId, true) From 6a0d9ccf44b724d7f219b4c3cfff413d7907c9ea Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 16:42:57 +0800 Subject: [PATCH 41/69] =?UTF-8?q?style:=20=E7=BD=91=E5=85=83=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=AD=97=E6=AE=B5=E6=B3=A8=E9=87=8A=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=8E=92=E5=BA=8FSMSF=E3=80=81CHF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_element/model/ne_info.go | 2 +- src/modules/network_element/repository/ne_info.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/network_element/model/ne_info.go b/src/modules/network_element/model/ne_info.go index 373df591..71a1a756 100644 --- a/src/modules/network_element/model/ne_info.go +++ b/src/modules/network_element/model/ne_info.go @@ -14,7 +14,7 @@ type NeInfo struct { VendorName string `json:"vendorName" gorm:"vendor_name"` Dn string `json:"dn" gorm:"dn"` NeAddress string `json:"neAddress" gorm:"ne_address"` // MAC地址 - HostIDs string `json:"hostIds" gorm:"host_ids"` // 网元主机ID组 数据格式(ssh,telnet,telnet) + HostIDs string `json:"hostIds" gorm:"host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet) Status string `json:"status" gorm:"status"` // 0离线 1在线 2配置待下发 Remark string `json:"remark" gorm:"remark"` // 备注 CreateBy string `json:"createBy" gorm:"create_by"` // 创建者 diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index effa5554..0b835c63 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -30,7 +30,9 @@ var neListSort = []string{ "N3IWF", "MOCNGW", "SMSC", + "SMSF", "CBC", + "CHF", } // 实例化数据层 NeInfo 结构体 From 548090bfbe4927d3751c66e728641b74365120a9 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 16:44:15 +0800 Subject: [PATCH 42/69] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0.ssh=E5=AF=86=E9=92=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/ssh/ssh.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/framework/utils/ssh/ssh.go b/src/framework/utils/ssh/ssh.go index d70991e7..6a4a526a 100644 --- a/src/framework/utils/ssh/ssh.go +++ b/src/framework/utils/ssh/ssh.go @@ -212,11 +212,14 @@ func (c *ConnSSH) SendToAuthorizedKeys() error { if err != nil { return err } + // "sudo mkdir -p ~/.ssh && sudo chown omcuser:omcuser ~/.ssh && sudo chmod 700 ~/.ssh" + // "sudo touch ~/.ssh/authorized_keys && sudo chown omcuser:omcuser ~/.ssh/authorized_keys && sudo chmod 600 ~/.ssh/authorized_keys" + // "echo 'ssh-rsa AAAAB3= pc-host\n' | sudo tee -a ~/.ssh/authorized_keys" authorizedKeysEntry := fmt.Sprintln(strings.TrimSpace(publicKey)) cmdStrArr := []string{ - fmt.Sprintf("sudo mkdir -p /home/%s/.ssh && sudo chown %s:%s /home/%s/.ssh && sudo chmod 700 /home/%s/.ssh", c.User, c.User, c.User, c.User, c.User), - fmt.Sprintf("sudo touch /home/%s/.ssh/authorized_keys && sudo chown %s:%s /home/%s/.ssh/authorized_keys && sudo chmod 600 /home/%s/.ssh/authorized_keys", c.User, c.User, c.User, c.User, c.User), - fmt.Sprintf("echo '%s' | sudo tee -a /home/%s/.ssh/authorized_keys", authorizedKeysEntry, c.User), + fmt.Sprintf("sudo mkdir -p ~/.ssh && sudo chown %s:%s ~/.ssh && sudo chmod 700 ~/.ssh", c.User, c.User), + fmt.Sprintf("sudo touch ~/.ssh/authorized_keys && sudo chown %s:%s ~/.ssh/authorized_keys && sudo chmod 600 ~/.ssh/authorized_keys", c.User, c.User), + fmt.Sprintf("echo '%s' | sudo tee -a ~/.ssh/authorized_keys", authorizedKeysEntry), } _, err = c.RunCMD(strings.Join(cmdStrArr, " && ")) if err != nil { From 4897299ba32acd8216c1b3d9b87e91d2c343dc3d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 17:23:15 +0800 Subject: [PATCH 43/69] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eping=20?= =?UTF-8?q?=E7=BD=91=E5=85=83=E7=AB=AF=E7=89=88=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/tool/controller/ping.go | 24 +++++++++++++++++++++++- src/modules/tool/service/iperf.go | 9 +-------- src/modules/tool/service/ping.go | 15 +++++++++++++-- src/modules/tool/tool.go | 4 ++++ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go index 3f3f5b44..aa70e036 100644 --- a/src/modules/tool/controller/ping.go +++ b/src/modules/tool/controller/ping.go @@ -81,6 +81,28 @@ func (s *PingController) StatisticsOn(c *gin.Context) { } } +// ping 网元端版本信息 +// +// GET /v +func (s *PingController) Version(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeType string `form:"neType" binding:"required"` // 网元类型 + NeID string `form:"neId" binding:"required"` // 网元ID + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + output, err := s.pingService.Version(query.NeType, query.NeID) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + c.JSON(200, result.OkData(output)) +} + // ping 网元端UNIX运行 // // GET /run @@ -128,7 +150,7 @@ func (s *PingController) Run(c *gin.Context) { wsClient := s.wsService.ClientCreate(loginUser.UserID, nil, wsConn, clientSession) go s.wsService.ClientWriteListen(wsClient) - go s.wsService.ClientReadListen(wsClient, s.pingService.RunNE) + go s.wsService.ClientReadListen(wsClient, s.pingService.Run) // 等待1秒,排空首次消息 time.Sleep(1 * time.Second) diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index 84ec00b6..75ffaaeb 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -23,15 +23,8 @@ type IPerf struct{} // Version 查询版本信息 func (s *IPerf) Version(meType, neId string) (string, error) { - // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfo.NeRunSSHClient(meType, neId) - if err != nil { - return "", err - } - defer sshClient.Close() - // 检查是否安装iperf3 - output, err := sshClient.RunCMD("iperf3 --version") + output, err := neService.NewNeInfo.NeRunSSHCmd(meType, neId, "iperf3 --version") if err != nil { return "", fmt.Errorf("iperf3 not installed") } diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go index 1ce9b016..79f51a2a 100644 --- a/src/modules/tool/service/ping.go +++ b/src/modules/tool/service/ping.go @@ -10,6 +10,7 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/utils/ssh" "be.ems/src/framework/vo/result" + neService "be.ems/src/modules/network_element/service" "be.ems/src/modules/tool/model" wsModel "be.ems/src/modules/ws/model" probing "github.com/prometheus-community/pro-bing" @@ -134,8 +135,18 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) } } -// RunNE 接收ping终端交互业务处理 -func (s *Ping) RunNE(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { +// Version 查询版本信息 +func (s *Ping) Version(meType, neId string) (string, error) { + // 检查是否安装ping + output, err := neService.NewNeInfo.NeRunSSHCmd(meType, neId, "ping -V") + if err != nil { + return "", fmt.Errorf("ping not installed") + } + return strings.TrimSpace(output), err +} + +// Run 接收ping终端交互业务处理 +func (s *Ping) Run(client *wsModel.WSClient, reqMsg wsModel.WSRequest) { // 必传requestId确认消息 if reqMsg.RequestID == "" { msg := "message requestId is required" diff --git a/src/modules/tool/tool.go b/src/modules/tool/tool.go index 7a92d1d9..70385683 100644 --- a/src/modules/tool/tool.go +++ b/src/modules/tool/tool.go @@ -44,6 +44,10 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ping", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewPing.StatisticsOn, ) + pingGroup.GET("/v", + middleware.PreAuthorize(nil), + controller.NewPing.Version, + ) pingGroup.GET("/run", middleware.PreAuthorize(nil), collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.ping", collectlogs.BUSINESS_TYPE_OTHER)), From d06e5507baf93d944a18695fb965df49ede50f89 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Oct 2024 18:24:25 +0800 Subject: [PATCH 44/69] =?UTF-8?q?fix:=20AMF=20Event=E5=AF=BC=E5=87=BAcm-st?= =?UTF-8?q?ate=E7=B1=BB=E5=9E=8Bstatus=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/controller/amf.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index 746cbc3b..cc78b1e7 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -178,7 +178,7 @@ func (s *AMFController) UEExport(c *gin.Context) { timeStr = v.(string) } if v, ok := eventJSON["status"]; ok && v != nil { - eventResult = v.(string) + eventResult = fmt.Sprint(v) for _, v := range dictUEEventCmState { if eventResult == v.DictValue { eventResult = i18n.TKey(language, v.DictLabel) From d11ac9d23ab877b53d9f2473a16ea660e75a7a5c Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 17 Oct 2024 11:39:38 +0800 Subject: [PATCH 45/69] =?UTF-8?q?fix:=20UDM=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8C=89=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/controller/udm_auth.go | 55 +++++++++++-------- .../network_data/controller/udm_sub.go | 55 +++++++++++-------- 2 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index e4dd1fe1..8306a0af 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -349,32 +349,45 @@ func (s *UDMAuthController) Removes(c *gin.Context) { // POST /export func (s *UDMAuthController) 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 { + // 查询结果,根据查询条件结果,单页最大值限制 + querys := ctx.BodyJSONMap(c) + neId := querys["neId"].(string) + fileType := querys["type"].(string) + if neId == "" || fileType == "" { 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.errExportType"))) + if !(fileType == "csv" || fileType == "txt") { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) + return + } + + querys["pageNum"] = 1 + querys["pageSize"] = 10000 + data := s.udmAuthService.SelectPage(querys) + if parse.Number(data["total"]) == 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + rows := data["rows"].([]model.UDMAuthUser) + + // rows := s.udmAuthService.SelectList(model.UDMAuthUser{NeId: neId}) + if len(rows) <= 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - neId := "" - list := s.udmAuthService.SelectList(model.UDMAuthUser{NeId: neId}) // 文件名 - fileName := fmt.Sprintf("udm_auth_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type) + fileName := fmt.Sprintf("udm_auth_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - if body.Type == "csv" { + if fileType == "csv" { // 转换数据 data := [][]string{} data = append(data, []string{"imsi", "ki", "algo", "amf", "opc"}) - for _, v := range list { + for _, v := range rows { opc := v.Opc if opc == "-" { opc = "" @@ -389,10 +402,10 @@ func (s *UDMAuthController) Export(c *gin.Context) { } } - if body.Type == "txt" { + if fileType == "txt" { // 转换数据 data := [][]string{} - for _, v := range list { + for _, v := range rows { opc := v.Opc if opc == "-" { opc = "" @@ -400,8 +413,8 @@ func (s *UDMAuthController) Export(c *gin.Context) { data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc}) } // 输出到文件 - err = file.WriterFileTXT(data, ",", filePath) - if err != nil { + + if err := file.WriterFileTXT(data, ",", filePath); err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } @@ -497,13 +510,11 @@ func (s *UDMAuthController) Import(c *gin.Context) { if strings.Contains(resultMsg, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - neId := "" - go s.udmAuthService.InsertData(neId, "csv", data) + go s.udmAuthService.InsertData(neInfo.NeId, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXT(",", localFilePath) - neId := "" - go s.udmAuthService.InsertData(neId, "txt", data) + go s.udmAuthService.InsertData(neInfo.NeId, "txt", data) } } c.JSON(200, result.OkMsg(resultMsg)) diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 10718b2d..aec3100e 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -354,53 +354,64 @@ func (s *UDMSubController) Removes(c *gin.Context) { // 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 { + // 查询结果,根据查询条件结果,单页最大值限制 + querys := ctx.BodyJSONMap(c) + neId := querys["neId"].(string) + fileType := querys["type"].(string) + if neId == "" || fileType == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } - - if !(body.Type == "csv" || body.Type == "txt") { + if !(fileType == "csv" || fileType == "txt") { c.JSON(200, result.ErrMsg(i18n.TKey(language, "ne.udm.errImportUserSubFileFormat"))) return } - neId := "" - list := s.udmSubService.SelectList(model.UDMSubUser{NeId: neId}) + querys["pageNum"] = 1 + querys["pageSize"] = 10000 + data := s.udmSubService.SelectPage(querys) + if parse.Number(data["total"]) == 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + rows := data["rows"].([]model.UDMSubUser) + + // rows := s.udmSubService.SelectList(model.UDMSubUser{NeId: neId}) + if len(rows) <= 0 { + // 导出数据记录为空 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) + return + } + // 文件名 - fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type) + fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), fileType) filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName) - if body.Type == "csv" { + if fileType == "csv" { // 转换数据 data := [][]string{} data = append(data, []string{"IMSI", "MSISDN", "UeAmbrTpl", "NssaiTpl", "AreaForbiddenTpl", "ServiceAreaRestrictionTpl", "RatRestrictions", "CnTypeRestrictions", "SmfSel", "SmData", "EPSDat"}) - for _, v := range list { + for _, v := range rows { 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 { + if err := file.WriterFileCSV(data, filePath); err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } } - if body.Type == "txt" { + if fileType == "txt" { // 转换数据 data := [][]string{} - for _, v := range list { + for _, v := range rows { 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 { + if err := file.WriterFileTXT(data, ",", filePath); err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } @@ -480,13 +491,11 @@ func (s *UDMSubController) Import(c *gin.Context) { if strings.Contains(data, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - neId := "" - go s.udmSubService.InsertData(neId, "csv", data) + go s.udmSubService.InsertData(neInfo.NeId, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXT(",", localFilePath) - neId := "" - go s.udmSubService.InsertData(neId, "txt", data) + go s.udmSubService.InsertData(neInfo.NeId, "txt", data) } } c.JSON(200, result.OkMsg(data)) From 6b568461dce0c9e26d4ac4dffcd97bc8fcaf042e Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Thu, 17 Oct 2024 16:24:20 +0800 Subject: [PATCH 46/69] add: update sql for custom home page --- database/install/sys_config.sql | 1 + database/install/sys_dict_data1_i18n_zh.sql | 4 ++++ database/install/sys_dict_data2_i18n_en.sql | 4 ++++ database/install/sys_menu.sql | 3 ++- database/install/sys_role_menu.sql | 3 +++ database/upgrade/upg_sys_config.sql | 1 + database/upgrade/upg_sys_dict_data1_i18n_zh.sql | 4 ++++ database/upgrade/upg_sys_dict_data2_i18n_en.sql | 4 ++++ database/upgrade/upg_sys_menu.sql | 3 ++- database/upgrade/upg_sys_role_menu.sql | 3 +++ 10 files changed, 28 insertions(+), 2 deletions(-) diff --git a/database/install/sys_config.sql b/database/install/sys_config.sql index 22218554..65c5ad21 100644 --- a/database/install/sys_config.sql +++ b/database/install/sys_config.sql @@ -41,6 +41,7 @@ INSERT INTO `sys_config` VALUES (107, 'config.sys.copyright', 'sys.copyright', ' INSERT INTO `sys_config` VALUES (108, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nOpenRemark'); INSERT INTO `sys_config` VALUES (109, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nDefaultRemark'); INSERT INTO `sys_config` VALUES (110, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.lockTimeRemark'); +INSERT INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); UNLOCK TABLES; diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 63d464aa..a97e69c8 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -691,5 +691,9 @@ INSERT INTO `sys_dict_data` VALUES (2180, 2180, 'dictData.cdr_cause_code.47', ' INSERT INTO `sys_dict_data` VALUES (2181, 2181, 'dictData.cdr_cause_code.50', '请求的设施未订阅', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2182, 2182, 'job.exportSMSCCDR', '定期从短信话单表导出文件至指定目录', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2183, 2183, 'job.removeExportedFiles', '定期删除指定目录过期文件', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2184, 2184, 'config.sys.homePage', '自定义主页', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2185, 2185, 'config.sys.homePageRemark', '选择列表中的任一页面作为主页路径', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2186, 2186, 'menu.config.neOverview', '网元概览', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2187, 2187, 'menu.config.neOverviewRemark', '显示所有网元状态配置和license等概览信息', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 99bf6c1c..475a4682 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -691,5 +691,9 @@ INSERT INTO `sys_dict_data` VALUES (4180, 4180, 'dictData.cdr_cause_code.47', 'R INSERT INTO `sys_dict_data` VALUES (4181, 4181, 'dictData.cdr_cause_code.50', 'Requested Facility Not Subscribed', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4182, 4182, 'job.exportSMSCCDR', 'Export regularly from SMSC CDR table', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4183, 4183, 'job.removeExportedFiles', 'Regularly delete expired files in the specified directory', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4184, 4184, 'config.sys.homePage', 'Custom Home Page', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4185, 4185, 'config.sys.homePageRemark', 'Select any page in the list as the homepage', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4186, 4186, 'menu.config.neOverview', 'NE Overview', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4187, 4187, 'menu.config.neOverviewRemark', 'Displays overview information such as status, configuration and license of all network elements', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index 030f85d1..90ffc0a9 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -130,7 +130,7 @@ INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, '1 INSERT INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark'); INSERT INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark'); INSERT INTO `sys_menu` VALUES (2075, 'menu.config.neManage', 4, 1, 'neManage', 'configManage/neManage/index', '1', '0', 'M', '1', '0', 'configManage:neManage:index', 'icon-biaoqing', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neManageRemark'); -INSERT INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 3, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); +INSERT INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 100, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); INSERT INTO `sys_menu` VALUES (2079, 'menu.config.softwareManage', 4, 4, 'softwareManage', 'configManage/softwareManage/index', '1', '0', 'M', '1', '0', 'configManage:softwareManage:index', 'icon-huidingbu', 'supervisor', 1700000000000, NULL, 0, 'menu.config.softwareManageRemark'); INSERT INTO `sys_menu` VALUES (2080, 'menu.ueUser.onlineIMS', 5, 4, 'ims', 'neUser/ims/index', '1', '0', 'M', '1', '1', 'neUser:ims:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineIMSRemark'); INSERT INTO `sys_menu` VALUES (2081, 'menu.ueUser.onlineUE', 5, 6, 'ue', 'neUser/ue/index', '1', '0', 'M', '1', '1', 'neUser:ue:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineUERemark'); @@ -210,5 +210,6 @@ INSERT INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', ' INSERT INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:taskAnalyze:index', '#', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2163, 'menu.trace.tshark', 2083, 14, 'tshark', 'traceManage/tshark/index', '1', '0', 'M', '1', '1', 'traceManage:tshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2164, 'menu.trace.wireshark', 2083, 16, 'wireshark', 'traceManage/wireshark/index', '1', '0', 'M', '1', '1', 'traceManage:wireshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2165, 'menu.config.neOverview', 4, 1, 'neOverview', 'configManage/neOverview/index', '1', '0', 'M', '1', '1', 'configManage:neOverview:index', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neOverviewRemark'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/sys_role_menu.sql b/database/install/sys_role_menu.sql index 22428ff4..195e7317 100644 --- a/database/install/sys_role_menu.sql +++ b/database/install/sys_role_menu.sql @@ -149,6 +149,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2159); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); @@ -216,6 +217,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 5); @@ -270,6 +272,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 5); diff --git a/database/upgrade/upg_sys_config.sql b/database/upgrade/upg_sys_config.sql index 08cdc97d..78c08a09 100644 --- a/database/upgrade/upg_sys_config.sql +++ b/database/upgrade/upg_sys_config.sql @@ -36,5 +36,6 @@ INSERT IGNORE INTO `sys_config` VALUES (107, 'config.sys.copyright', 'sys.copyri INSERT IGNORE INTO `sys_config` VALUES (108, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nOpenRemark'); INSERT IGNORE INTO `sys_config` VALUES (109, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nDefaultRemark'); INSERT IGNORE INTO `sys_config` VALUES (110, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.lockTimeRemark'); +INSERT IGNORE INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index ed3447c8..e1ed676a 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -698,5 +698,9 @@ REPLACE INTO `sys_dict_data` VALUES (2180, 2180, 'dictData.cdr_cause_code.47', ' REPLACE INTO `sys_dict_data` VALUES (2181, 2181, 'dictData.cdr_cause_code.50', '请求的设施未订阅', 'i18n_zh', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2182, 2182, 'job.exportSMSCCDR', '定期从短信话单表导出文件至指定目录', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2183, 2183, 'job.removeExportedFiles', '定期删除指定目录过期文件', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2184, 2184, 'config.sys.homePage', '自定义主页', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2185, 2185, 'config.sys.homePageRemark', '选择列表中的任一页面作为主页路径', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2186, 2186, 'menu.config.neOverview', '网元概览', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2187, 2187, 'menu.config.neOverviewRemark', '显示所有网元状态配置和license等概览信息', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index e9250b47..bf846655 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -693,5 +693,9 @@ REPLACE INTO `sys_dict_data` VALUES (4180, 4180, 'dictData.cdr_cause_code.47', ' REPLACE INTO `sys_dict_data` VALUES (4181, 4181, 'dictData.cdr_cause_code.50', 'Requested Facility Not Subscribed', 'i18n_en', '', '', '1', 'supervisor', 1725877564156, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4182, 4182, 'job.exportSMSCCDR', 'Export regularly from SMSC CDR table', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4183, 4183, 'job.removeExportedFiles', 'Regularly delete expired files in the specified directory', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4184, 4184, 'config.sys.homePage', 'Custom Home Page', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4185, 4185, 'config.sys.homePageRemark', 'Select any page in the list as the homepage', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4186, 4186, 'menu.config.neOverview', 'NE Overview', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4187, 4187, 'menu.config.neOverviewRemark', 'Displays overview information such as status, configuration and license of all network elements', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index d94224b7..73ff6126 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -113,7 +113,7 @@ REPLACE INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, ' REPLACE INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark'); REPLACE INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark'); REPLACE INTO `sys_menu` VALUES (2075, 'menu.config.neManage', 4, 1, 'neManage', 'configManage/neManage/index', '1', '0', 'M', '1', '0', 'configManage:neManage:index', 'icon-biaoqing', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neManageRemark'); -REPLACE INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 3, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); +REPLACE INTO `sys_menu` VALUES (2078, 'menu.config.backupManage', 4, 100, 'backupManage', 'configManage/backupManage/index', '1', '0', 'M', '1', '0', 'configManage:backupManage:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.config.backupManageRemark'); REPLACE INTO `sys_menu` VALUES (2079, 'menu.config.softwareManage', 4, 4, 'softwareManage', 'configManage/softwareManage/index', '1', '0', 'M', '1', '0', 'configManage:softwareManage:index', 'icon-huidingbu', 'supervisor', 1700000000000, NULL, 0, 'menu.config.softwareManageRemark'); REPLACE INTO `sys_menu` VALUES (2080, 'menu.ueUser.onlineIMS', 5, 4, 'ims', 'neUser/ims/index', '1', '0', 'M', '1', '1', 'neUser:ims:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineIMSRemark'); REPLACE INTO `sys_menu` VALUES (2081, 'menu.ueUser.onlineUE', 5, 6, 'ue', 'neUser/ue/index', '1', '0', 'M', '1', '1', 'neUser:ue:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.onlineUERemark'); @@ -193,6 +193,7 @@ REPLACE INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', REPLACE INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:taskAnalyze:index', '#', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2163, 'menu.trace.tshark', 2083, 14, 'tshark', 'traceManage/tshark/index', '1', '0', 'M', '1', '1', 'traceManage:tshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2164, 'menu.trace.wireshark', 2083, 16, 'wireshark', 'traceManage/wireshark/index', '1', '0', 'M', '1', '1', 'traceManage:wireshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2165, 'menu.config.neOverview', 4, 1, 'neOverview', 'configManage/neOverview/index', '1', '0', 'M', '1', '1', 'configManage:neOverview:index', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.config.neOverviewRemark'); -- 指定记录条件更新 diff --git a/database/upgrade/upg_sys_role_menu.sql b/database/upgrade/upg_sys_role_menu.sql index 5464d6bb..e42a9438 100644 --- a/database/upgrade/upg_sys_role_menu.sql +++ b/database/upgrade/upg_sys_role_menu.sql @@ -160,6 +160,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2159); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); @@ -227,6 +228,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 5); @@ -281,6 +283,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 5); From 0a9c33423bcde7039f382ffb60828630da0ec33c Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Thu, 17 Oct 2024 17:09:14 +0800 Subject: [PATCH 47/69] update go.sum --- go.sum | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/go.sum b/go.sum index 4e2e53ee..714cab42 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,20 @@ +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= +gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/allegro/bigcache/v3 v3.1.0/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= @@ -22,6 +34,8 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,6 +49,8 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -49,6 +65,10 @@ github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-forks/fsnotify v1.4.7 h1:lyiU2Wqd4fNGCQDn9dZ4UxSiSFgeU1rM6yIfahk8haY= github.com/go-forks/fsnotify v1.4.7/go.mod h1:AU8mot+GznW5+B4jRJHxKg/2EeO+jMORGRkKSxs0biw= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -69,10 +89,14 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -81,6 +105,7 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -93,8 +118,12 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopacket/gopacket v1.2.0 h1:eXbzFad7f73P1n2EJHQlsKuvIMJjVXK5tXoSca78I3A= github.com/gopacket/gopacket v1.2.0/go.mod h1:BrAKEy5EOGQ76LSqh7DMAr7z0NNPdczWm2GxCG7+I8M= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -104,9 +133,26 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gosnmp/gosnmp v1.36.2-0.20231009064202-d306ed5aa998/go.mod h1:O938QjIS4vpSag1UTcnnBq9MfNmimuOGtvQsT1NbErc= github.com/gosnmp/gosnmp v1.38.0 h1:I5ZOMR8kb0DXAFg/88ACurnuwGwYkXWq3eLpJPHMEYc= github.com/gosnmp/gosnmp v1.38.0/go.mod h1:FE+PEZvKrFz9afP9ii1W3cprXuVZ17ypCcyyfYuu5LY= +github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.18.0/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= github.com/jasonlvhit/gocron v0.0.1 h1:qTt5qF3b3srDjeOIR4Le1LfeyvoYzJlYpqvG7tJX5YU= github.com/jasonlvhit/gocron v0.0.1/go.mod h1:k9a3TV8VcU73XZxfVHCHWMWF9SOqgoku0/QlY2yvlA4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= @@ -117,8 +163,10 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= @@ -145,6 +193,7 @@ github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f h1:sgU github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 h1:Bvq8AziQ5jFF4BHGAEDSqwPW1NJS3XshxbRCxtjFAZc= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linxGnu/gosmpp v0.3.0 h1:LL+eY+zc9Ei/YY0po9A6L6SHf8nPyGvqsLddttr/y/4= github.com/linxGnu/gosmpp v0.3.0/go.mod h1:Ba6SULQql3IbF2A5Mtj3DqMKoFbx1pEz/8xyiOh8ZOs= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= @@ -154,6 +203,7 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU669bE= github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= @@ -162,6 +212,8 @@ github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73 h1:4vKVhAdype/dej github.com/metaleap/go-util v0.0.0-20180330192724-a09253046f73/go.mod h1:l71/5fppWP5A6nqhcxz6wQAYok6pr/vM2+KHIy50/LY= github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f h1:eeJGcYszuvOpmuJxeq57LaOO8mJurfjpOHJJMfQSD0s= github.com/metaleap/go-xsd v0.0.0-20180330193350-61f7638f502f/go.mod h1:WK3zEKtwVd/v+NM3lh1ZE6MdDfHsdOFFOD5Ezi4Hutg= +github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -177,6 +229,10 @@ github.com/mssola/useragent v1.0.0 h1:WRlDpXyxHDNfvZaPEut5Biveq86Ze4o4EMffyMxmH5 github.com/mssola/useragent v1.0.0/go.mod h1:hz9Cqz4RXusgg1EdI4Al0INR62kP7aPSRNHnpU+b85Y= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -186,6 +242,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -233,6 +290,7 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -245,6 +303,7 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -297,6 +356,7 @@ github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY= github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ= @@ -311,8 +371,21 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= +go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= +go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= +go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -361,6 +434,7 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -447,6 +521,13 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -471,6 +552,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -501,6 +583,7 @@ modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= xorm.io/builder v0.3.13 h1:a3jmiVVL19psGeXx8GIurTp7p0IIgqeDmwhcR6BAOAo= xorm.io/builder v0.3.13/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= xorm.io/xorm v1.3.9 h1:TUovzS0ko+IQ1XnNLfs5dqK1cJl1H5uHpWbWqAQ04nU= From 5294950eb242a749ea37e577e29deff6f6679905 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 17 Oct 2024 17:16:03 +0800 Subject: [PATCH 48/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0ne=5Fhost?= =?UTF-8?q?=E8=A1=A8=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/upgrade/upg_ne_host.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/database/upgrade/upg_ne_host.sql b/database/upgrade/upg_ne_host.sql index 5a9dffd0..13a7e765 100644 --- a/database/upgrade/upg_ne_host.sql +++ b/database/upgrade/upg_ne_host.sql @@ -24,12 +24,12 @@ CREATE TABLE IF NOT EXISTS `ne_host` ( -- 20241016前旧表更新 ALTER TABLE `ne_host` ADD COLUMN IF NOT EXISTS `db_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '数据库名称' AFTER `pass_phrase`; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `host_id` bigint NOT NULL COMMENT '主机主键' FIRST; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '连接类型 ssh telnet redis' AFTER `host_id`; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `port` int NULL DEFAULT 22 COMMENT '端口 22 4100 6379' AFTER `addr`; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证用户名' AFTER `port`; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `create_by`; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间' AFTER `update_by`; -ALTER TABLE `ne_host` MODIFY COLUMN IF NOT EXISTS `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键'; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `host_id` bigint NOT NULL COMMENT '主机主键' FIRST; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `host_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '连接类型 ssh telnet redis' AFTER `host_id`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `port` int NULL DEFAULT 22 COMMENT '端口 22 4100 6379' AFTER `addr`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '认证用户名' AFTER `port`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `create_by`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `update_time` bigint NULL DEFAULT 0 COMMENT '更新时间' AFTER `update_by`; +ALTER TABLE `ne_host` MODIFY COLUMN IF EXISTS `host_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主机主键'; SET FOREIGN_KEY_CHECKS=1; From ed33f4412953c6ef9b8e39743a0f3d0ff797e35b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 17 Oct 2024 17:20:30 +0800 Subject: [PATCH 49/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0ne=5Fhost?= =?UTF-8?q?=E8=A1=A8=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/ne_host.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/database/install/ne_host.sql b/database/install/ne_host.sql index e531a7cc..59bae626 100644 --- a/database/install/ne_host.sql +++ b/database/install/ne_host.sql @@ -53,12 +53,12 @@ INSERT INTO `ne_host` VALUES (20, 'ssh', '1', 'UPF_001_22', '172.16.5.190', 22, INSERT INTO `ne_host` VALUES (21, 'telnet', '1', 'UPF_001_4100', '172.16.5.190', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); INSERT INTO `ne_host` VALUES (22, 'telnet', '1', 'UPF_001_5002', '172.16.5.190', 5002, 'admin', '0', '', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); INSERT INTO `ne_host` VALUES (23, 'ssh', '1', 'LMF_001_22', '172.16.5.200', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); -INSERT INTO `ne_host` VALUES (23, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); -INSERT INTO `ne_host` VALUES (24, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); -INSERT INTO `ne_host` VALUES (25, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); -INSERT INTO `ne_host` VALUES (26, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); -INSERT INTO `ne_host` VALUES (27, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); -INSERT INTO `ne_host` VALUES (28, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); -INSERT INTO `ne_host` VALUES (29, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (24, 'telnet', '1', 'LMF_001_4100', '172.16.5.200', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (25, 'ssh', '1', 'NEF_001_22', '172.16.5.210', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (26, 'telnet', '1', 'NEF_001_4100', '172.16.5.210', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (27, 'ssh', '1', 'MME_001_22', '172.16.5.220', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (28, 'telnet', '1', 'MME_001_4100', '172.16.5.220', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); +INSERT INTO `ne_host` VALUES (29, 'ssh', '1', 'N3IWF_001_22', '172.16.5.230', 22, 'omcuser', '2', '', '', '', '', '', 'supervisor', 1729063407329, 'supervisor', 1729063818372); +INSERT INTO `ne_host` VALUES (30, 'telnet', '1', 'N3IWF_001_4100', '172.16.5.230', 4100, 'admin', '0', 'NUBonCin4GZgl7o12YjeClE8ToQmYp9KWdhMjSNxc2M=', '', '', '', '', 'supervisor', 1729063407333, 'supervisor', 1729063818375); SET FOREIGN_KEY_CHECKS=1; From 4d0fd7f992a6835830b7b988f3e0199c614ec4d4 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 18 Oct 2024 10:15:52 +0800 Subject: [PATCH 50/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=8F=9C=E5=8D=95/=E8=A7=92=E8=89=B2=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/ne_info.sql | 2 +- database/install/sys_config.sql | 2 +- database/install/sys_dict_data1_i18n_zh.sql | 4 +- database/install/sys_dict_data2_i18n_en.sql | 4 +- database/install/sys_menu.sql | 13 ++-- database/install/sys_role_menu.sql | 48 +++++++------- database/upgrade/upg_sys_config.sql | 2 +- .../upgrade/upg_sys_dict_data1_i18n_zh.sql | 4 +- .../upgrade/upg_sys_dict_data2_i18n_en.sql | 4 +- database/upgrade/upg_sys_menu.sql | 15 +++-- database/upgrade/upg_sys_role_menu.sql | 66 +++++++------------ 11 files changed, 72 insertions(+), 92 deletions(-) diff --git a/database/install/ne_info.sql b/database/install/ne_info.sql index 0c295b60..9c99e09b 100644 --- a/database/install/ne_info.sql +++ b/database/install/ne_info.sql @@ -39,7 +39,7 @@ INSERT INTO `ne_info` VALUES (4, 'AUSF', '001', '4400HXAUSF001', 'AUSF_001', '17 INSERT INTO `ne_info` VALUES (5, 'UDM', '001', '4400HXUDM001', 'UDM_001', '172.16.5.140', 33030, 'PNF', '-', '-', '-', '-', '9,10,11', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (6, 'SMF', '001', '4400HXSMF001', 'SMF_001', '172.16.5.150', 33030, 'PNF', '-', '-', '-', '-', '12,13', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (7, 'PCF', '001', '4400HXPCF001', 'PCF_001', '172.16.5.160', 33030, 'PNF', '-', '-', '-', '-', '14,15', 0, '', '', 0, '', 0); -INSERT INTO `ne_info` VALUES (8, 'NSSF', '001', '4400HXNSF001', 'NSSF_001', '172.16.5.170', 33030, 'PNF', '-', '-', '-', '-', '16,17', 0, '', '', 0, '', 0); +INSERT INTO `ne_info` VALUES (8, 'NSSF', '001', '4400HXNSSF001', 'NSSF_001', '172.16.5.170', 33030, 'PNF', '-', '-', '-', '-', '16,17', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (9, 'NRF', '001', '4400HXNRF001', 'NRF_001', '172.16.5.180', 33030, 'PNF', '-', '-', '-', '-', '18,19', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (10, 'UPF', '001', '4400HXUPF001', 'UPF_001', '172.16.5.190', 33030, 'PNF', '-', '-', '-', '', '20,21,22', 0, '', '', 0, '', 0); INSERT INTO `ne_info` VALUES (11, 'LMF', '001', '4400HXLMF001', 'LMF_001', '172.16.5.200', 33030, 'PNF', '-', '-', '-', '-', '23,24', 0, '', '', 0, '', 0); diff --git a/database/install/sys_config.sql b/database/install/sys_config.sql index 65c5ad21..c6c43b52 100644 --- a/database/install/sys_config.sql +++ b/database/install/sys_config.sql @@ -41,7 +41,7 @@ INSERT INTO `sys_config` VALUES (107, 'config.sys.copyright', 'sys.copyright', ' INSERT INTO `sys_config` VALUES (108, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nOpenRemark'); INSERT INTO `sys_config` VALUES (109, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nDefaultRemark'); INSERT INTO `sys_config` VALUES (110, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.lockTimeRemark'); -INSERT INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); +INSERT INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', 'configManage/neOverview/index', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); UNLOCK TABLES; diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 04349f1f..e3190dfb 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -239,9 +239,9 @@ INSERT INTO `sys_dict_data` VALUES (1505, 1505, 'dictType.sys_yes_no', '系统 INSERT INTO `sys_dict_data` VALUES (1506, 1506, 'dictType.sys_oper_type', '操作类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1507, 1507, 'dictType.sys_common_status', '系统状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1508, 1508, 'dictType.trace_type', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '程序运行进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '进程运行程序', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1510, 1510, 'dictType.alarm_status', '告警日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '网络连接进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '进程网络连接', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1512, 1512, 'dictType.ne_version_status', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1513, 1513, 'dictType.i18n_en', '多语言-英文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1514, 1514, 'dictType.i18n_zh', '多语言-中文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 0ce22280..7c21626e 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -239,9 +239,9 @@ INSERT INTO `sys_dict_data` VALUES (3505, 3505, 'dictType.sys_yes_no', 'System o INSERT INTO `sys_dict_data` VALUES (3506, 3506, 'dictType.sys_oper_type', 'Operation Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3507, 3507, 'dictType.sys_common_status', 'System Status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3508, 3508, 'dictType.trace_type', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Program Running Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Process Running Program', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3510, 3510, 'dictType.alarm_status', 'Alarm Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Net Connection Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Process Net Connection', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3512, 3512, 'dictType.ne_version_status', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3513, 3513, 'dictType.i18n_en', 'Multi-language - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3514, 3514, 'dictType.i18n_en', 'Multi-language - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index 90ffc0a9..153e49ce 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -50,11 +50,12 @@ INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1' INSERT INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); INSERT INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); INSERT INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, 'menu.toolsRemark'); -INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); -INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); -INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); -INSERT INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 8, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); -INSERT INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 9, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); +INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); +INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 8, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); +INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 9, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); +INSERT INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 4, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); +INSERT INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 6, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); INSERT INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); INSERT INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); @@ -206,7 +207,7 @@ INSERT INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCDR INSERT INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '1', 'M', '0', '1', 'traceManage:pcap:index', '#', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '1', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '1', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', 'supervisor', 1724144595914, '', 0, ''); -INSERT INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', 'traceManage/task-hlr/index', '1', '0', 'M', '1', '1', 'traceManage:taskHLR:index', 'icon-chexiao', 'supervisor', 1724144595914, '', 0, ''); +INSERT INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', 'traceManage/task-hlr/index', '1', '0', 'M', '0', '1', 'traceManage:taskHLR:index', 'icon-chexiao', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:taskAnalyze:index', '#', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2163, 'menu.trace.tshark', 2083, 14, 'tshark', 'traceManage/tshark/index', '1', '0', 'M', '1', '1', 'traceManage:tshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2164, 'menu.trace.wireshark', 2083, 16, 'wireshark', 'traceManage/wireshark/index', '1', '0', 'M', '1', '1', 'traceManage:wireshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); diff --git a/database/install/sys_role_menu.sql b/database/install/sys_role_menu.sql index 195e7317..d5df548e 100644 --- a/database/install/sys_role_menu.sql +++ b/database/install/sys_role_menu.sql @@ -20,6 +20,11 @@ LOCK TABLES `sys_role_menu` WRITE; INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 63); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 64); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 100); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102); @@ -111,6 +116,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2118); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2120); @@ -149,11 +155,15 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2159); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); @@ -180,15 +190,13 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2120); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); @@ -215,12 +223,14 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2154); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2155); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2160); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 500); @@ -230,12 +240,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1048); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2084); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2085); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); @@ -244,17 +249,9 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2101); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2119); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2120); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2125); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2127); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2130); @@ -270,19 +267,18 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2160); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 112); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2087); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2131); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2132); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2165); UNLOCK TABLES; diff --git a/database/upgrade/upg_sys_config.sql b/database/upgrade/upg_sys_config.sql index 78c08a09..6b73bcf3 100644 --- a/database/upgrade/upg_sys_config.sql +++ b/database/upgrade/upg_sys_config.sql @@ -36,6 +36,6 @@ INSERT IGNORE INTO `sys_config` VALUES (107, 'config.sys.copyright', 'sys.copyri INSERT IGNORE INTO `sys_config` VALUES (108, 'config.sys.i18nOpen', 'sys.i18n.open', 'true', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nOpenRemark'); INSERT IGNORE INTO `sys_config` VALUES (109, 'config.sys.i18nDefault', 'sys.i18n.default', 'en_US', 'Y', 'supervisor', 1700000000000, NULL, 0, 'config.sys.i18nDefaultRemark'); INSERT IGNORE INTO `sys_config` VALUES (110, 'config.sys.lockTime', 'sys.lockTime', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.lockTimeRemark'); -INSERT IGNORE INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', '0', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); +INSERT IGNORE INTO `sys_config` VALUES (111, 'config.sys.homePage', 'sys.homePage', 'configManage/neOverview/index', 'Y', 'supervisor', 1704960008300, 'admin', 1706838764703, 'config.sys.homePageRemark'); SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index bcc12bb4..97c56cf6 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -246,9 +246,9 @@ REPLACE INTO `sys_dict_data` VALUES (1505, 1505, 'dictType.sys_yes_no', '系统 REPLACE INTO `sys_dict_data` VALUES (1506, 1506, 'dictType.sys_oper_type', '操作类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1507, 1507, 'dictType.sys_common_status', '系统状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1508, 1508, 'dictType.trace_type', '跟踪类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '程序运行进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1509, 1509, 'menu.tools.ps', '进程运行程序', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1510, 1510, 'dictType.alarm_status', '告警日志类型', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '网络连接进程', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (1511, 1511, 'menu.tools.net', '进程网络连接', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1512, 1512, 'dictType.ne_version_status', '网元软件版本状态', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1513, 1513, 'dictType.i18n_en', '多语言-英文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1514, 1514, 'dictType.i18n_zh', '多语言-中文', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index a89e4b77..eb03143d 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -240,9 +240,9 @@ REPLACE INTO `sys_dict_data` VALUES (3505, 3505, 'dictType.sys_yes_no', 'System REPLACE INTO `sys_dict_data` VALUES (3506, 3506, 'dictType.sys_oper_type', 'Operation Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3507, 3507, 'dictType.sys_common_status', 'System Status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3508, 3508, 'dictType.trace_type', 'Trace Types', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Program Running Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3509, 3509, 'menu.tools.ps', 'Process Running Program', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3510, 3510, 'dictType.alarm_status', 'Alarm Log Type', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Net Connection Process', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (3511, 3511, 'menu.tools.net', 'Process Network Connection', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3512, 3512, 'dictType.ne_version_status', 'Network element software version status', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3513, 3513, 'dictType.i18n_en', 'Multi-language - English', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3514, 3514, 'dictType.i18n_zh', 'Multi-language - Chinese', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index 73ff6126..0fe12b05 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -32,12 +32,13 @@ CREATE TABLE IF NOT EXISTS `sys_menu` ( REPLACE INTO `sys_menu` VALUES (1, 'menu.system', 0, 16, 'system', NULL, '1', '1', 'D', '1', '1', NULL, 'icon-xiangmu', 'supervisor', 1700000000000, NULL, 0, 'menu.systemRemark'); REPLACE INTO `sys_menu` VALUES (4, 'menu.config', 0, 3, 'configManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.configRemark'); REPLACE INTO `sys_menu` VALUES (5, 'menu.ueUser', 0, 7, 'neUser', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUserRemark'); -REPLACE INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1715413568692, 'supervisor', 1715413568692, 'menu.toolsRemark'); -REPLACE INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 1, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); -REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 4, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); -REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 6, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); -REPLACE INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 8, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); -REPLACE INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 9, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); +REPLACE INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, 'menu.toolsRemark'); +REPLACE INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', 'supervisor', 1708481172778, 'supervisor', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); +REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 8, 'ps', 'tool/ps/index', '1', '0', 'M', '1', '1', 'tool:ps:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641316028, ''); +REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 9, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); +REPLACE INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 4, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); +REPLACE INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 6, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); REPLACE INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); REPLACE INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); REPLACE INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); @@ -189,7 +190,7 @@ REPLACE INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smscCD REPLACE INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 2083, 12, 'pcap/inline/file', 'traceManage/pcap/file', '1', '1', 'M', '0', '1', 'traceManage:pcap:index', '#', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2159, 'menu.log.exportFile', 2089, 100, 'exportFile', 'logManage/exportFile/index', '1', '1', 'M', '1', '1', 'logManage:exportFile:index', 'icon-wenjian', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2160, 'menu.perf.kpiCReport', 2099, 100, 'kpiCReport', 'perfManage/kpiCReport/index', '1', '1', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', 'supervisor', 1724144595914, '', 0, ''); -REPLACE INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', 'traceManage/task-hlr/index', '1', '0', 'M', '1', '1', 'traceManage:taskHLR:index', 'icon-chexiao', 'supervisor', 1724144595914, '', 0, ''); +REPLACE INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 2083, 6, 'taskHLR', 'traceManage/task-hlr/index', '1', '0', 'M', '0', '1', 'traceManage:taskHLR:index', 'icon-chexiao', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2083, 2, 'task/inline/analyze', 'traceManage/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:taskAnalyze:index', '#', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2163, 'menu.trace.tshark', 2083, 14, 'tshark', 'traceManage/tshark/index', '1', '0', 'M', '1', '1', 'traceManage:tshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2164, 'menu.trace.wireshark', 2083, 16, 'wireshark', 'traceManage/wireshark/index', '1', '0', 'M', '1', '1', 'traceManage:wireshark:index', 'icon-gengduo', 'supervisor', 1724144595914, '', 0, ''); diff --git a/database/upgrade/upg_sys_role_menu.sql b/database/upgrade/upg_sys_role_menu.sql index e42a9438..a3009086 100644 --- a/database/upgrade/upg_sys_role_menu.sql +++ b/database/upgrade/upg_sys_role_menu.sql @@ -1,19 +1,3 @@ -/* - Navicat Premium Data Transfer - - Source Server : local_mariadb - Source Server Type : MariaDB - Source Server Version : 100338 (10.3.38-MariaDB) - Source Host : localhost:33066 - Source Schema : omc_db - - Target Server Type : MariaDB - Target Server Version : 100338 (10.3.38-MariaDB) - File Encoding : 65001 - - Date: 01/02/2024 16:05:38 -*/ - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; @@ -29,9 +13,15 @@ CREATE TABLE IF NOT EXISTS `sys_role_menu` ( -- ---------------------------- -- Records of sys_role_menu -- ---------------------------- + INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 63); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 64); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 100); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102); @@ -120,8 +110,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2109); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2111); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2118); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2120); @@ -160,11 +152,15 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2159); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2160); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); @@ -191,15 +187,13 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2111); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2119); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2120); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); @@ -226,12 +220,14 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2154); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2155); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2160); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 60); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 65); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 500); @@ -241,12 +237,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1048); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2084); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2085); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); @@ -255,17 +246,9 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2098); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2099); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2101); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2104); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2119); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2120); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2124); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2125); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2127); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2130); @@ -281,18 +264,17 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2160); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 1); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 5); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 112); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2080); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2081); -INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2082); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2087); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2131); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2132); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2165); SET FOREIGN_KEY_CHECKS = 1; From 33ca38d639cba24b822e07c29e549278772ce1f4 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 18 Oct 2024 10:45:30 +0800 Subject: [PATCH 51/69] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.2410.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 8 ++++++++ captrace/makefile | 2 +- crontask/makefile | 2 +- data2html/makefile | 2 +- makefile | 2 +- mkpkg.sh | 2 +- restagent/makefile | 2 +- src/framework/config/config/config.default.yaml | 2 +- sshsvc/makefile | 2 +- 9 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04b02475..ed8adf99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # 版本发布日志 +## 2.2410.2-20241018 + +- 新增 网元主机支持redis配置项 +- 新增 菜单功能iperf3/ping网络测试工具 +- 更新 抓包文件支持查看内容 +- 更新 初始网元相关表字段数据变更 +- 更新 UDM用户数据按查询条件导出 + ## 2.2410.1-20241012 - 新增 系统菜单新增工具栏目,网元SSH,网络测试,网络探针 diff --git a/captrace/makefile b/captrace/makefile index b2958d7a..ffc38920 100644 --- a/captrace/makefile +++ b/captrace/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2410.1 +VERSION = 2.2410.2 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/crontask/makefile b/crontask/makefile index cd4750f4..1b28282c 100644 --- a/crontask/makefile +++ b/crontask/makefile @@ -1,7 +1,7 @@ # Makefile for OMC-OMC-crontask project PROJECT = OMC -VERSION = 2.2410.1 +VERSION = 2.2410.2 LIBDIR = be.ems/lib BINNAME = crontask diff --git a/data2html/makefile b/data2html/makefile index 76ae773b..01f685a0 100644 --- a/data2html/makefile +++ b/data2html/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2410.1 +VERSION = 2.2410.2 RelDate = `date +%Y%m%d` Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) diff --git a/makefile b/makefile index dc530d07..ba83566d 100644 --- a/makefile +++ b/makefile @@ -3,7 +3,7 @@ ProjectL = omc ProjectU = OMC PROJECT = $(ProjectL) -VERSION = 2.2410.1 +VERSION = 2.2410.2 RelDate = `date +%Y%m%d` Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) diff --git a/mkpkg.sh b/mkpkg.sh index 13e0a797..c998a5b0 100644 --- a/mkpkg.sh +++ b/mkpkg.sh @@ -2,7 +2,7 @@ ProcList="restagent crontask sshsvc captrace data2html" ProjectL=omc -VERSION=2.2410.1 +VERSION=2.2410.2 RelDate=`date +%Y%m%d` Release=${RelDate} RelVer=${VERSION}-${RelDate} diff --git a/restagent/makefile b/restagent/makefile index 4690c60b..a8aa4ff5 100644 --- a/restagent/makefile +++ b/restagent/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2410.1 +VERSION = 2.2410.2 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/src/framework/config/config/config.default.yaml b/src/framework/config/config/config.default.yaml index 102fd4af..dc60eac3 100644 --- a/src/framework/config/config/config.default.yaml +++ b/src/framework/config/config/config.default.yaml @@ -1,7 +1,7 @@ # 项目信息 framework: name: "OMC" - version: "2.2410.1" + version: "2.2410.2" # 应用服务配置 server: diff --git a/sshsvc/makefile b/sshsvc/makefile index 6bb665f1..961ff039 100644 --- a/sshsvc/makefile +++ b/sshsvc/makefile @@ -1,7 +1,7 @@ # Makefile for OMC-OMC-crontask project PROJECT = OMC -VERSION = 2.2410.1 +VERSION = 2.2410.2 LIBDIR = be.ems/lib BINNAME = sshsvc From bac9f46cd926d8002357bc607e77642d87ebb93b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 18 Oct 2024 11:22:46 +0800 Subject: [PATCH 52/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=8F=9C=E5=8D=95=E9=87=8D=E5=A4=8D=E8=AE=B0=E5=BD=95?= =?UTF-8?q?62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_menu.sql | 1 - database/upgrade/upg_sys_menu.sql | 1 - 2 files changed, 2 deletions(-) diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index 153e49ce..7d01a9cd 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -56,7 +56,6 @@ INSERT INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 8, 'ps', 'tool/ps/index' INSERT INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 9, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); INSERT INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 4, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); INSERT INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 6, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); -INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); INSERT INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); INSERT INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); INSERT INTO `sys_menu` VALUES (102, 'menu.security.roleUser', 2113, 3, 'role/inline/auth-user/:roleId', 'system/role/auth-user', '1', '1', 'M', '0', '1', 'system:role:auth', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleUserRemark'); diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index 0fe12b05..c89bb83b 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -39,7 +39,6 @@ REPLACE INTO `sys_menu` VALUES (63, 'menu.tools.ps', 60, 8, 'ps', 'tool/ps/index REPLACE INTO `sys_menu` VALUES (64, 'menu.tools.net', 60, 9, 'net', 'tool/net/index', '1', '0', 'M', '1', '1', 'tool:net:list', 'icon-zhizuoliucheng', 'supervisor', 1724144595914, 'supervisor', 1728641333734, ''); REPLACE INTO `sys_menu` VALUES (65, 'menu.tools.ping', 60, 4, 'ping', 'tool/ping/index', '1', '0', 'M', '1', '1', 'tool:ping:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641367855, ''); REPLACE INTO `sys_menu` VALUES (66, 'menu.tools.iperf', 60, 6, 'iperf', 'tool/iperf/index', '1', '0', 'M', '1', '1', 'tool:iperf:index', 'icon-paixu', 'supervisor', 1728613881914, 'supervisor', 1728641382403, ''); -REPLACE INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', 'supervisor', 1700000000000, 'supervisor', 1728641453429, 'menu.tools.helpRemark'); REPLACE INTO `sys_menu` VALUES (100, 'menu.security.user', 2113, 1, 'user', 'system/user/index', '1', '1', 'M', '1', '1', 'system:user:list', 'icon-wocanyu', 'supervisor', 1700000000000, NULL, 0, 'menu.security.userRemark'); REPLACE INTO `sys_menu` VALUES (101, 'menu.security.role', 2113, 3, 'role', 'system/role/index', '1', '1', 'M', '1', '1', 'system:role:list', 'icon-anzhuo', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleRemark'); REPLACE INTO `sys_menu` VALUES (102, 'menu.security.roleUser', 2113, 3, 'role/inline/auth-user/:roleId', 'system/role/auth-user', '1', '1', 'M', '0', '1', 'system:role:auth', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.security.roleUserRemark'); From 9baa67cc00c6b54e4e7f13d117bee174113a13ce Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 22 Oct 2024 11:15:01 +0800 Subject: [PATCH 53/69] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c215d36..aef0640f 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,12 @@ manager/admin123 omcuser/a9tU53r ``` +# 系统工具依赖包 + +[ubuntu-iperf3](https://launchpad.net/ubuntu/+source/iperf3) +[ubuntu-libsctp1](https://launchpad.net/ubuntu/jammy/amd64/libsctp1/1.0.19+dfsg-1build1) +[ky10-aarch64](https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/aarch64/Packages/) + ## 开发 ```sh @@ -55,6 +61,10 @@ cd ./restagent # 下载依赖 go mod download +# 信令跟踪需要安装 libpcap-dev > 1.10.1-4build1 +apt install -y libpcap-dev +go env -w CGO_ENABLED='1' + # 调试启动 go run restagent.go -c ./etc/restconf.yaml --env local @@ -75,7 +85,7 @@ go env -w GOOS=windows cd ./restagent -go build -o restagent -v -ldflags="-s -w -X 'be.ems/lib/global.Version=2.240620.1' -X 'be.ems/lib/global.BuildTime=`date`' -X 'be.ems/lib/global.GoVer=`go version`'" +go build -o restagent -v -ldflags="-s -w -X 'be.ems/lib/global.Version=24.09.20' -X 'be.ems/lib/global.BuildTime=`date`' -X 'be.ems/lib/global.GoVer=`go version`'" go build -o crontask -v -ldflags="-s -w -X 'be.ems/lib/global.Version=2.240620.1' -X 'be.ems/lib/global.BuildTime=`date`' -X 'be.ems/lib/global.GoVer=`go version`'" From 55994fde448a3b8ef1e5f20f79fc60b3f1ff8843 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Tue, 22 Oct 2024 14:13:30 +0800 Subject: [PATCH 54/69] copyright 2023 change to 2024 --- database/install/sys_dict_data1_i18n_zh.sql | 2 +- database/install/sys_dict_data2_i18n_en.sql | 2 +- database/upgrade/upg_sys_dict_data1_i18n_zh.sql | 2 +- database/upgrade/upg_sys_dict_data2_i18n_en.sql | 2 +- database/upgvue3/upg_sys_dict_data1_i18n_zh.sql | 2 +- database/upgvue3/upg_sys_dict_data2_i18n_en.sql | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index e3190dfb..99ffa9ba 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -309,7 +309,7 @@ INSERT INTO `sys_dict_data` VALUES (1657, 1657, 'config..export.value', '参数 INSERT INTO `sys_dict_data` VALUES (1658, 1658, 'config..export.type', '系统内置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1659, 1659, 'config..export.remark', '参数说明', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1660, 1660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2023 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2024 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1662, 1662, 'config.noData', '没有可访问参数配置数据!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1663, 1663, 'config.errKey', '无效 key', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1664, 1664, 'config.errValueEq', '变更状态与旧值相等!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 7c21626e..40674c00 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -309,7 +309,7 @@ INSERT INTO `sys_dict_data` VALUES (3657, 3657, 'config..export.value', 'Config INSERT INTO `sys_dict_data` VALUES (3658, 3658, 'config..export.type', 'Built In', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3659, 3659, 'config..export.remark', 'Config Description', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3660, 3660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2023 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2024 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3662, 3662, 'config.noData', 'No parameter configuration data is accessible!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3663, 3663, 'config.errKey', 'Invalid key', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3664, 3664, 'config.errValueEq', 'Change state is equal to the old value!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index 97c56cf6..00281271 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -316,7 +316,7 @@ REPLACE INTO `sys_dict_data` VALUES (1657, 1657, 'config..export.value', '参数 REPLACE INTO `sys_dict_data` VALUES (1658, 1658, 'config..export.type', '系统内置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1659, 1659, 'config..export.remark', '参数说明', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1660, 1660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2023 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2024 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1662, 1662, 'config.noData', '没有可访问参数配置数据!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1663, 1663, 'config.errKey', '无效 key', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1664, 1664, 'config.errValueEq', '变更状态与旧值相等!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index eb03143d..0ee64ccf 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -310,7 +310,7 @@ REPLACE INTO `sys_dict_data` VALUES (3657, 3657, 'config..export.value', 'Config REPLACE INTO `sys_dict_data` VALUES (3658, 3658, 'config..export.type', 'Built In', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3659, 3659, 'config..export.remark', 'Config Description', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3660, 3660, 'config.sys.titleValue', 'AGrand EMS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2023 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2024 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3662, 3662, 'config.noData', 'No parameter configuration data is accessible!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3663, 3663, 'config.errKey', 'Invalid key', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3664, 3664, 'config.errValueEq', 'Change state is equal to the old value!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgvue3/upg_sys_dict_data1_i18n_zh.sql b/database/upgvue3/upg_sys_dict_data1_i18n_zh.sql index 8eaece9a..3108f432 100644 --- a/database/upgvue3/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgvue3/upg_sys_dict_data1_i18n_zh.sql @@ -322,7 +322,7 @@ INSERT IGNORE INTO `sys_dict_data` VALUES (1657, 1657, 'config..export.value', ' INSERT IGNORE INTO `sys_dict_data` VALUES (1658, 1658, 'config..export.type', '系统内置', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1659, 1659, 'config..export.remark', '参数说明', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1660, 1660, 'config.sys.titleValue', 'AGrandEMS', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2023 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (1661, 1661, 'config.sys.copyrightValue', 'Copyright ©2024 千通科技', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1662, 1662, 'config.noData', '没有可访问参数配置数据!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1663, 1663, 'config.errKey', '无效 key', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (1664, 1664, 'config.errValueEq', '变更状态与旧值相等!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgvue3/upg_sys_dict_data2_i18n_en.sql b/database/upgvue3/upg_sys_dict_data2_i18n_en.sql index 5d5625b5..d1293982 100644 --- a/database/upgvue3/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgvue3/upg_sys_dict_data2_i18n_en.sql @@ -322,7 +322,7 @@ INSERT IGNORE INTO `sys_dict_data` VALUES (3657, 3657, 'config..export.value', ' INSERT IGNORE INTO `sys_dict_data` VALUES (3658, 3658, 'config..export.type', 'Built In', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3659, 3659, 'config..export.remark', 'Config Description', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3660, 3660, 'config.sys.titleValue', 'AGrandEMS', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT IGNORE INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2023 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT IGNORE INTO `sys_dict_data` VALUES (3661, 3661, 'config.sys.copyrightValue', 'Copyright ©2024 AGrandTech', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3662, 3662, 'config.noData', 'No parameter configuration data is accessible!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3663, 3663, 'config.errKey', 'Invalid key', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT IGNORE INTO `sys_dict_data` VALUES (3664, 3664, 'config.errValueEq', 'Change state is equal to the old value!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); From 5d3e79a8fa61e0860da6138a7054b2b6c9f0c903 Mon Sep 17 00:00:00 2001 From: zhangsz Date: Tue, 22 Oct 2024 14:38:22 +0800 Subject: [PATCH 55/69] chmod 755 for shell script --- mkpkg.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 mkpkg.sh diff --git a/mkpkg.sh b/mkpkg.sh old mode 100644 new mode 100755 From a239ac557d584266fa937278bbb7645bd9bcbb22 Mon Sep 17 00:00:00 2001 From: zhangsz Date: Tue, 22 Oct 2024 14:39:30 +0800 Subject: [PATCH 56/69] chmod +x for sh --- misc/actpkg.sh | 0 misc/checkdisk.sh | 0 misc/checkproc.sh | 0 misc/cpnetools.sh | 0 misc/cpsshkey.sh | 0 misc/importdb.sh | 0 misc/nehosts | 0 misc/omcsvc.sh | 0 misc/rbkpkg.sh | 0 misc/rmexpfiles.sh | 0 misc/setomc.sh | 0 misc/sshcpid.sh | 0 12 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 misc/actpkg.sh mode change 100644 => 100755 misc/checkdisk.sh mode change 100644 => 100755 misc/checkproc.sh mode change 100644 => 100755 misc/cpnetools.sh mode change 100644 => 100755 misc/cpsshkey.sh mode change 100644 => 100755 misc/importdb.sh mode change 100644 => 100755 misc/nehosts mode change 100644 => 100755 misc/omcsvc.sh mode change 100644 => 100755 misc/rbkpkg.sh mode change 100644 => 100755 misc/rmexpfiles.sh mode change 100644 => 100755 misc/setomc.sh mode change 100644 => 100755 misc/sshcpid.sh diff --git a/misc/actpkg.sh b/misc/actpkg.sh old mode 100644 new mode 100755 diff --git a/misc/checkdisk.sh b/misc/checkdisk.sh old mode 100644 new mode 100755 diff --git a/misc/checkproc.sh b/misc/checkproc.sh old mode 100644 new mode 100755 diff --git a/misc/cpnetools.sh b/misc/cpnetools.sh old mode 100644 new mode 100755 diff --git a/misc/cpsshkey.sh b/misc/cpsshkey.sh old mode 100644 new mode 100755 diff --git a/misc/importdb.sh b/misc/importdb.sh old mode 100644 new mode 100755 diff --git a/misc/nehosts b/misc/nehosts old mode 100644 new mode 100755 diff --git a/misc/omcsvc.sh b/misc/omcsvc.sh old mode 100644 new mode 100755 diff --git a/misc/rbkpkg.sh b/misc/rbkpkg.sh old mode 100644 new mode 100755 diff --git a/misc/rmexpfiles.sh b/misc/rmexpfiles.sh old mode 100644 new mode 100755 diff --git a/misc/setomc.sh b/misc/setomc.sh old mode 100644 new mode 100755 diff --git a/misc/sshcpid.sh b/misc/sshcpid.sh old mode 100644 new mode 100755 From 85f7e3e4d862750962d551886163c52a2ada5fce Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 23 Oct 2024 11:09:09 +0800 Subject: [PATCH 57/69] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=8F=9C=E5=8D=95=E6=96=B0=E5=A2=9E=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E6=8C=87=E6=A0=87=E6=A6=82=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_dict_data1_i18n_zh.sql | 4 ++-- database/install/sys_dict_data2_i18n_en.sql | 4 ++-- database/install/sys_menu.sql | 6 +++--- database/upgrade/upg_sys_dict_data1_i18n_zh.sql | 4 ++-- database/upgrade/upg_sys_dict_data2_i18n_en.sql | 4 ++-- database/upgrade/upg_sys_menu.sql | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 99ffa9ba..ec6254e7 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -118,7 +118,7 @@ INSERT INTO `sys_dict_data` VALUES (1110, 1110, 'menu.fault.setRemark', '故障 INSERT INTO `sys_dict_data` VALUES (1111, 1111, 'menu.perfRemark', '性能目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1112, 1112, 'menu.perf.task', '任务管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1113, 1113, 'menu.perf.data', '性能数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.report', '性能报表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.kpiOverView', '关键指标概览', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (1115, 1115, 'menu.perf.threshold', '性能门限', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '关键指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1117, 1117, 'menu.perf.customTarget', '自定义指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -130,7 +130,7 @@ INSERT INTO `sys_dict_data` VALUES (1122, 1122, 'menu.mml.set', 'MML设置', 'i1 INSERT INTO `sys_dict_data` VALUES (1123, 1123, 'menu.mml.omc', 'OMC操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1124, 1124, 'menu.perf.taskRemark', '任务管理菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1125, 1125, 'menu.perf.dataRemark', '性能数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.reportRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.kpiOverViewRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1127, 1127, 'menu.perf.thresholdRemark', '性能门限菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1128, 1128, 'menu.perf.kpiRemark', '黄金指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1129, 1129, 'menu.perf.customTargetRemark', '自定义指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 40674c00..5ab33066 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -118,7 +118,7 @@ INSERT INTO `sys_dict_data` VALUES (3110, 3110, 'menu.fault.setRemark', 'Fault G INSERT INTO `sys_dict_data` VALUES (3111, 3111, 'menu.perfRemark', 'Performance Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3112, 3112, 'menu.perf.task', 'Performance Tasks', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); INSERT INTO `sys_dict_data` VALUES (3113, 3113, 'menu.perf.data', 'Performance Data', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); -INSERT INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.report', 'Performance Reports', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.kpiOverView', 'Key Performance Overview', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (3115, 3115, 'menu.perf.threshold', 'Performance Thresholds', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3116, 3116, 'menu.perf.kpi', 'Key Performance Indicators', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Indicator Management', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -130,7 +130,7 @@ INSERT INTO `sys_dict_data` VALUES (3122, 3122, 'menu.mml.set', 'MML Settings', INSERT INTO `sys_dict_data` VALUES (3123, 3123, 'menu.mml.omc', 'OMC Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3124, 3124, 'menu.perf.taskRemark', 'Task Management Menu', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); INSERT INTO `sys_dict_data` VALUES (3125, 3125, 'menu.perf.dataRemark', 'Performance Data Menu', 'i18n_en', '', '', '1', 'supervisor', 1700000000000, NULL, 0, ''); -INSERT INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.reportRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- INSERT INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.kpiOverViewRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3127, 3127, 'menu.perf.thresholdRemark', 'Performance Threshold Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3128, 3128, 'menu.perf.kpiRemark', 'Key Performance Indicator Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Indicator Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index 7d01a9cd..7ae57904 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -151,11 +151,11 @@ INSERT INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-setting INSERT INTO `sys_menu` VALUES (2099, 'menu.perf', 0, 5, 'perfManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perfRemark'); INSERT INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '1', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', 'supervisor', 1700000000000, 'admin', 1713177036412, 'menu.perf.taskRemark'); INSERT INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '1', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); -INSERT INTO `sys_menu` VALUES (2102, 'menu.perf.report', 2099, 3, 'perfReport', 'perfManage/perfReport/index', '1', '0', 'M', '0', '0', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.reportRemark'); +INSERT INTO `sys_menu` VALUES (2102, 'menu.perf.kpiOverView', 2099, 10, 'kpiOverView', 'perfManage/kpiOverView/index', '1', '0', 'M', '0', '1', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2103, 'menu.perf.threshold', 2099, 4, 'perfThreshold', 'perfManage/perfThreshold/index', '1', '0', 'M', '0', '0', 'perfManage:perfThreshold:index', 'icon-zhuanrang', 'supervisor', 1700000000000, 'supervisor', 1715417264697, 'menu.perf.thresholdRemark'); -INSERT INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 11, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); +INSERT INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 20, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); INSERT INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); -INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 13, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '0', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); +INSERT INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '0', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); INSERT INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-zhizuoliucheng', 'supervisor', 1700000000000, NULL, 0, 'menu.mmlRemark'); INSERT INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlManage/neOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:neOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.neRemark'); INSERT INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index 00281271..4554c269 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -125,7 +125,7 @@ REPLACE INTO `sys_dict_data` VALUES (1110, 1110, 'menu.fault.setRemark', '故障 REPLACE INTO `sys_dict_data` VALUES (1111, 1111, 'menu.perfRemark', '性能目录', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1112, 1112, 'menu.perf.task', '任务管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1113, 1113, 'menu.perf.data', '性能数据', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.report', '性能报表', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (1114, 1114, 'menu.perf.kpiOverView', '关键指标概览', 'i18n_zh', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (1115, 1115, 'menu.perf.threshold', '性能门限', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1116, 1116, 'menu.perf.kpi', '关键指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1117, 1117, 'menu.perf.customTarget', '自定义指标', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -137,7 +137,7 @@ REPLACE INTO `sys_dict_data` VALUES (1122, 1122, 'menu.mml.set', 'MML设置', 'i REPLACE INTO `sys_dict_data` VALUES (1123, 1123, 'menu.mml.omc', 'OMC操作', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1124, 1124, 'menu.perf.taskRemark', '任务管理菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1125, 1125, 'menu.perf.dataRemark', '性能数据菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.reportRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (1126, 1126, 'menu.perf.kpiOverViewRemark', '性能报表菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1127, 1127, 'menu.perf.thresholdRemark', '性能门限菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1128, 1128, 'menu.perf.kpiRemark', '黄金指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (1129, 1129, 'menu.perf.customTargetRemark', '自定义指标菜单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index 0ee64ccf..e54ff64b 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -123,7 +123,7 @@ REPLACE INTO `sys_dict_data` VALUES (3110, 3110, 'menu.fault.setRemark', 'Fault REPLACE INTO `sys_dict_data` VALUES (3111, 3111, 'menu.perfRemark', 'Performance Catalog', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3112, 3112, 'menu.perf.task', 'Performance Tasks', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3113, 3113, 'menu.perf.data', 'Performance Data', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.report', 'Performance Reports', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (3114, 3114, 'menu.perf.kpiOverView', 'Key Performance Overview', 'i18n_en', '', '', '1', 'supervisor', 1728640045875, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (3115, 3115, 'menu.perf.threshold', 'Performance Thresholds', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3116, 3116, 'menu.perf.kpi', 'Key Performance Indicators', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3117, 3117, 'menu.perf.customTarget', 'Custom Indicator Management', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -135,7 +135,7 @@ REPLACE INTO `sys_dict_data` VALUES (3122, 3122, 'menu.mml.set', 'MML Settings', REPLACE INTO `sys_dict_data` VALUES (3123, 3123, 'menu.mml.omc', 'OMC Operation', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3124, 3124, 'menu.perf.taskRemark', 'Task Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3125, 3125, 'menu.perf.dataRemark', 'Performance Data Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -REPLACE INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.reportRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +-- REPLACE INTO `sys_dict_data` VALUES (3126, 3126, 'menu.perf.kpiOverViewRemark', 'Performance Report Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3127, 3127, 'menu.perf.thresholdRemark', 'Performance Threshold Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3128, 3128, 'menu.perf.kpiRemark', 'Key Performance Indicator Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (3129, 3129, 'menu.perf.customTargetRemark', 'Custom Indicator Management Menu', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index c89bb83b..44726d40 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -134,11 +134,11 @@ REPLACE INTO `sys_menu` VALUES (2098, 'menu.fault.set', 2129, 100, 'fault-settin REPLACE INTO `sys_menu` VALUES (2099, 'menu.perf', 0, 5, 'perfManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perfRemark'); REPLACE INTO `sys_menu` VALUES (2100, 'menu.perf.task', 2099, 1, 'taskManage', 'perfManage/taskManage/index', '1', '1', 'M', '0', '1', 'perfManage:taskManage:index', 'icon-wofaqi', 'supervisor', 1700000000000, 'admin', 1713177036412, 'menu.perf.taskRemark'); REPLACE INTO `sys_menu` VALUES (2101, 'menu.perf.data', 2099, 2, 'perfData', 'perfManage/perfData/index', '1', '1', 'M', '0', '1', 'perfManage:perfData:index', 'icon-soutubiao', 'supervisor', 1700000000000, 'admin', 1713177042915, 'menu.perf.dataRemark'); -REPLACE INTO `sys_menu` VALUES (2102, 'menu.perf.report', 2099, 3, 'perfReport', 'perfManage/perfReport/index', '1', '0', 'M', '0', '0', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.reportRemark'); +REPLACE INTO `sys_menu` VALUES (2102, 'menu.perf.kpiOverView', 2099, 10, 'kpiOverView', 'perfManage/kpiOverView/index', '1', '0', 'M', '0', '1', 'perfManage:perfReport:index', 'icon-gonggaodayi', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2103, 'menu.perf.threshold', 2099, 4, 'perfThreshold', 'perfManage/perfThreshold/index', '1', '0', 'M', '0', '0', 'perfManage:perfThreshold:index', 'icon-zhuanrang', 'supervisor', 1700000000000, 'supervisor', 1715417264697, 'menu.perf.thresholdRemark'); -REPLACE INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 11, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); +REPLACE INTO `sys_menu` VALUES (2104, 'menu.perf.kpi', 2099, 20, 'goldTarget', 'perfManage/goldTarget/index', '1', '1', 'M', '1', '1', 'perfManage:goldTarget:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.perf.kpiRemark'); REPLACE INTO `sys_menu` VALUES (2105, 'menu.perf.customTarget', 2099, 99, 'customTarget', 'perfManage/customTarget/index', '1', '1', 'M', '1', '1', 'perfManage:customTarget:index', 'icon-fanhui1', 'supervisor', 1700000000000, 'admin', 1712807948673, 'menu.perf.customTargetRemark'); -REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 13, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '0', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); +REPLACE INTO `sys_menu` VALUES (2106, 'menu.perf.kpiKeyTarget', 2099, 12, 'kpiKeyTarget', 'perfManage/kpiKeyTarget/index', '1', '0', 'M', '0', '1', 'perfManage:kpiKeyTarget:index', 'icon-fuzhichenggong', 'supervisor', 1728642924734, 'supervisor', 1728642924734, ''); REPLACE INTO `sys_menu` VALUES (2107, 'menu.mml', 0, 8, 'mmlManage', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-zhizuoliucheng', 'supervisor', 1700000000000, NULL, 0, 'menu.mmlRemark'); REPLACE INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlManage/neOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:neOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.neRemark'); REPLACE INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); From 7be11324305f5fcbd9dd8ef2776d09b3dd3e4287 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 23 Oct 2024 16:14:45 +0800 Subject: [PATCH 58/69] fix: upgrade config file by upgconf.sh --- misc/upgconf.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 misc/upgconf.sh diff --git a/misc/upgconf.sh b/misc/upgconf.sh new file mode 100644 index 00000000..4383c72a --- /dev/null +++ b/misc/upgconf.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +config_file="/usr/local/omc/etc/restconf.yaml" +temp_file="/tmp/temp.yaml" + +declare -A insert_lines=( + [156]=" dataCoding: 0" + [157]=" serviceNumber: \"OMC\"" +) + +declare -A update_lines=( + ["deadLine: 10"]="deadLine: 600" +) + +# check if exist file +if [[ ! -f $config_file ]]; then + echo "NOT FOUND config file: $config_file" + exit 1 +fi + +insert_if_missing() { + local line_number="$1" + local line_content="$2" + local current_content=$(sed -n "${line_number}p" "$config_file") + + if [[ "$current_content" != "$line_content" ]]; then + # insert line to config file + echo -n "Inserting '$line_content' into line ${line_number} ... " + awk -v n="$line_number" -v line="$line_content" 'NR==n {print line} {print}' "$config_file" >"$temp_file" && mv "$temp_file" "$config_file" + if [ $? = 0 ]; then + echo "done" + fi + else + echo "Exist '$line_content' at line ${line_number}" + fi +} + +# function:update line content +update_lines_content() { + local old_line="$1" + local new_line="$2" + echo -n "Updating '$old_line' to line '$new_line' ..." + sed -i "s/$old_line/$new_line/" "$config_file" + if [ $? = 0 ]; then + echo "done" + fi +} + +#line_numbers=(156 157) +line_numbers=$(for key in "${!insert_lines[@]}"; do echo "$key"; done | sort -n) + +# insert process +#for line_number in "${line_numbers[@]}"; do +#for line_number in "${!insert_lines[@]}"; do +for line_number in $line_numbers; do + insert_if_missing "$line_number" "${insert_lines[$line_number]}" +done + +# update process +for old_line in "${!update_lines[@]}"; do + update_lines_content "$old_line" "${update_lines[$old_line]}" +done From 587e7a65f00e1d2d9f6209892354b2dae6746cda Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Thu, 24 Oct 2024 16:18:12 +0800 Subject: [PATCH 59/69] add: NBI get fille api --- features/features.go | 5 +- features/nbi/file/controller.go | 257 ++++++++++++++++++++++++++++++++ features/nbi/file/model.go | 47 ++++++ features/nbi/file/route.go | 26 ++++ features/nbi/service.go | 16 ++ lib/file/file_windows.go | 18 ++- 6 files changed, 359 insertions(+), 10 deletions(-) create mode 100644 features/nbi/file/controller.go create mode 100644 features/nbi/file/model.go create mode 100644 features/nbi/file/route.go create mode 100644 features/nbi/service.go diff --git a/features/features.go b/features/features.go index 343ff0bb..e4f68c75 100644 --- a/features/features.go +++ b/features/features.go @@ -3,6 +3,7 @@ package features import ( "be.ems/features/cm" "be.ems/features/lm" + "be.ems/features/nbi" "be.ems/features/pm" "be.ems/lib/log" "github.com/gin-gonic/gin" @@ -12,10 +13,10 @@ func InitServiceEngine(r *gin.Engine) { log.Info("======init feature group gin.Engine") // featuresGroup := r.Group("/") - // 注册 各个features 模块的路由 + // register features routers pm.InitSubServiceRoute(r) lm.InitSubServiceRoute(r) cm.InitSubServiceRoute(r) - + nbi.InitSubServiceRoute(r) // return featuresGroup } diff --git a/features/nbi/file/controller.go b/features/nbi/file/controller.go new file mode 100644 index 00000000..cc5edc88 --- /dev/null +++ b/features/nbi/file/controller.go @@ -0,0 +1,257 @@ +package nbi_file + +import ( + "archive/zip" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "time" + + "be.ems/lib/dborm" + "be.ems/lib/file" + "be.ems/lib/global" + "be.ems/lib/log" + "be.ems/lib/services" + "github.com/gin-gonic/gin" +) + +type SysJobResponse struct { + SysJob + TableName string `json:"tableName"` + TableDisplay string `json:"tableDisplay"` + FilePath string `json:"filePath"` +} + +type TargetParams struct { + Duration int `json:"duration"` + TableName string `json:"tableName"` + Columns string `json:"columns"` // exported column name of time string + TimeCol string `json:"timeCol"` // time stamp of column name + TimeUnit string `json:"timeUnit"` // timestamp unit: second/micro/milli + Extras string `json:"extras"` // extras condition for where + FilePath string `json:"filePath"` // file path +} + +func (m *FileNBI) GetFileList(c *gin.Context) { + var querys FileNBIQuery + + querys.Category = c.Param("category") + querys.Type = c.Param("type") + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + if querys.Path == "" { + tableName := "" + ok := false + switch querys.Category { + case "cdr": + tableName, ok = CDRTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) + return + } + case "log": + tableName, ok = LogTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) + return + } + default: + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) + return + } + + s := SysJob{} + where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) + _, err := dborm.XEngDB().Table(s.TableName()). + Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). + Where(where). + Get(&querys.Path) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + } + + files, err := file.GetFileInfo(querys.Path, querys.Suffix) + if err != nil { + log.Error("failed to GetFileInfo:", err) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + // split files list + lenNum := int64(len(files)) + start := (querys.PageNum - 1) * querys.PageSize + end := start + querys.PageSize + var splitList []file.FileInfo + if start >= lenNum { + splitList = []file.FileInfo{} + } else if end >= lenNum { + splitList = files[start:] + } else { + splitList = files[start:end] + } + total := len(files) + c.JSON(http.StatusOK, services.TotalDataResp(splitList, total)) +} + +func (m *FileNBI) Total(c *gin.Context) { + dir := c.Query("path") + + fileCount, dirCount, err := file.GetFileAndDirCount(dir) + if err != nil { + log.Error("failed to GetFileAndDirCount:", err) + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + total := fileCount + dirCount + c.JSON(http.StatusOK, services.TotalResp(int64(total))) +} + +func (m *FileNBI) GetSingleFileHandler(c *gin.Context) { + var querys FileNBIQuery + + querys.Category = c.Param("category") + querys.Type = c.Param("type") + querys.DateIndex = c.Param("dateIndex") + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + tableName := "" + if querys.Path == "" { + ok := false + switch querys.Category { + case "cdr": + tableName, ok = CDRTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) + return + } + case "log": + tableName, ok = LogTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) + return + } + default: + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) + return + } + + s := SysJob{} + where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) + _, err := dborm.XEngDB().Table(s.TableName()). + Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). + Where(where). + Get(&querys.Path) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + } + + fileName := tableName + "_export_" + querys.DateIndex + "0000" + ".csv" + filePath := filepath.Join(querys.Path, fileName) + + file, err := os.Open(filePath) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + defer file.Close() + + if _, err := os.Stat(filePath); os.IsNotExist(err) { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + c.Header("Content-Disposition", "attachment; filename="+fileName) + c.Header("Content-Type", "application/octet-stream") + c.File(filePath) +} + +func (m *FileNBI) GetMultiFileHandler(c *gin.Context) { + var querys FileNBIQuery + + querys.Category = c.Param("category") + querys.Type = c.Param("type") + if err := c.ShouldBindQuery(&querys); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + tableName := "" + if querys.Path == "" { + ok := false + switch querys.Category { + case "cdr": + tableName, ok = CDRTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid CDR file type: %s", querys.Type))) + return + } + case "log": + tableName, ok = LogTableMapper[querys.Type] + if tableName == "" || !ok { + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file type: %s", querys.Type))) + return + } + default: + c.JSON(http.StatusOK, services.ErrResp(fmt.Sprintf("invalid log file category: %s", querys.Category))) + return + } + + s := SysJob{} + where := fmt.Sprintf("invoke_target='%s' and status=1 and JSON_UNQUOTE(JSON_EXTRACT(target_params,'$.tableName'))='%s'", INVOKE_FILE_EXPORT, tableName) + _, err := dborm.XEngDB().Table(s.TableName()). + Select("JSON_UNQUOTE(JSON_EXTRACT(target_params, '$.filePath')) as file_path"). + Where(where). + Get(&querys.Path) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + } + + zipWriter := zip.NewWriter(c.Writer) + defer zipWriter.Close() + + for _, fileName := range querys.FileNames { + filePath := filepath.Join(querys.Path, fileName) + + file, err := os.Open(filePath) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + defer file.Close() + + if _, err := os.Stat(filePath); os.IsNotExist(err) { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + writer, err := zipWriter.Create(filepath.Base(fileName)) + if err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + if _, err := io.Copy(writer, file); err != nil { + c.JSON(http.StatusOK, services.ErrResp(err.Error())) + return + } + + } + zipFile := tableName + "_export_" + time.Now().Local().Format(global.DateData) + ".zip" + c.Header("Content-Disposition", "attachment; filename="+zipFile) + c.Header("Content-Type", "application/zip") + //c.File(filePath) +} diff --git a/features/nbi/file/model.go b/features/nbi/file/model.go new file mode 100644 index 00000000..5dcdd9fa --- /dev/null +++ b/features/nbi/file/model.go @@ -0,0 +1,47 @@ +package nbi_file + +import ( + "be.ems/lib/file" +) + +const ( + INVOKE_FILE_EXPORT = "exportTable" +) + +var CDRTableMapper map[string]string = map[string]string{ + "ims": "cdr_event_ims", + "smf": "cdr_event_smf", + "smsc": "cdr_event_smsc", + "sms": "cdr_event_smsc", +} + +var LogTableMapper map[string]string = map[string]string{ + "operate": "sys_log_operate", + "security": "sys_log_login", + "alarm": "alarm_log", +} + +type SysJob struct { + JobID int64 `gorm:"column:job_id;primary_key;auto_increment" json:"job_id"` //任务ID + InvokeTarget string `gorm:"column:invoke_target" json:"invoke_target"` //调用目标字符串 + TargetParams string `gorm:"column:target_params;type:json" json:"target_params,omitempty"` //调用目标传入参数 +} + +func (s *SysJob) TableName() string { + return "sys_job" +} + +type FileNBI struct { + file.FileInfo +} + +type FileNBIQuery struct { + Category string `form:"category" binding:"required"` + Type string `form:"type" binding:"required"` + DateIndex string `form:"dateIndex"` + Path string `json:"path" form:"path"` + FileNames []string `json:"fileName" form:"fileName"` + Suffix string `form:"suffix"` + PageNum int64 `form:"pageNum"` + PageSize int64 `form:"pageSize"` +} diff --git a/features/nbi/file/route.go b/features/nbi/file/route.go new file mode 100644 index 00000000..f0cb58f6 --- /dev/null +++ b/features/nbi/file/route.go @@ -0,0 +1,26 @@ +package nbi_file + +import ( + "be.ems/src/framework/middleware" + "github.com/gin-gonic/gin" +) + +// Register Routes for file_export +func Register(r *gin.RouterGroup) { + fileNBI := r.Group("/file") + { + var f *FileNBI + fileNBI.GET("/:category/:type/list", + middleware.PreAuthorize(nil), + f.GetFileList, + ) + fileNBI.GET("/:category/:type/:dateIndex", + middleware.PreAuthorize(nil), + f.GetSingleFileHandler, + ) + fileNBI.GET("/:category/:type", + middleware.PreAuthorize(nil), + f.GetMultiFileHandler, + ) + } +} diff --git a/features/nbi/service.go b/features/nbi/service.go new file mode 100644 index 00000000..7b913d5c --- /dev/null +++ b/features/nbi/service.go @@ -0,0 +1,16 @@ +// log management package + +package nbi + +import ( + nbi_file "be.ems/features/nbi/file" + "be.ems/lib/log" + "github.com/gin-gonic/gin" +) + +func InitSubServiceRoute(r *gin.Engine) { + log.Info("======init North-Bound Interface group gin.Engine") + + nbiGroup := r.Group("/nbi") + nbi_file.Register(nbiGroup) +} diff --git a/lib/file/file_windows.go b/lib/file/file_windows.go index fbcf9b3c..7c97f111 100644 --- a/lib/file/file_windows.go +++ b/lib/file/file_windows.go @@ -9,14 +9,15 @@ import ( ) type FileInfo struct { - FileType string `json:"fileType"` // 文件类型 - FileMode string `json:"fileMode"` // 文件的权限 - LinkCount int64 `json:"linkCount"` // 硬链接数目 - Owner string `json:"owner"` // 所属用户 - Group string `json:"group"` // 所属组 - Size int64 `json:"size"` // 文件的大小 - ModifiedTime int64 `json:"modifiedTime"` // 最后修改时间,单位为秒 - FileName string `json:"fileName"` // 文件的名称 + FileType string `json:"fileType"` // file type: file/directory + FileMode string `json:"fileMode"` // file mode + LinkCount int64 `json:"linkCount"` // link count + Owner string `json:"owner"` // owner + Group string `json:"group"` // group + Size int64 `json:"size"` // size: xx byte + ModifiedTime int64 `json:"modifiedTime"` // last modified time:seconds + FilePath string `json:"filePath"` // file path + FileName string `json:"fileName"` // file name } func GetFileInfo(dir, suffix string) ([]FileInfo, error) { @@ -48,6 +49,7 @@ func GetFileInfo(dir, suffix string) ([]FileInfo, error) { Group: "-", Size: info.Size(), ModifiedTime: info.ModTime().Unix(), + FilePath: dir, FileName: info.Name(), } files = append(files, fileInfo) From 9e5b4c1bf1d22273c18c87f6dd6e60f2a5ac36a1 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Thu, 24 Oct 2024 16:39:37 +0800 Subject: [PATCH 60/69] changle git local root dir --- .vscode/launch.json | 8 ++++---- captrace/etc/capconf.yaml | 2 +- crontask/etc/crontask.yaml | 4 ++-- makefile | 2 +- mkpkg.sh | 2 +- restagent/etc/restconf-t.yaml | 10 +++++----- restagent/etc/restconf.yaml | 6 +++--- sshsvc/etc/sshsvc.yaml | 4 ++-- tools/misc/dumpdb.sh | 2 +- tools/misc/dumpsql.sh | 2 +- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 305ed684..50fad3c4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,7 @@ "type": "go", "request": "launch", "mode": "debug", - "program": "d:/local.git/be.ems/restagent/", + "program": "d:/omc.git/be.ems/restagent/", "console": "integratedTerminal" }, { @@ -26,7 +26,7 @@ "type": "go", "request": "launch", "mode": "debug", - "program": "d:/local.git/be.ems/sshsvc/sshsvc.go", + "program": "d:/omc.git/be.ems/sshsvc/sshsvc.go", "console": "integratedTerminal" }, { @@ -34,7 +34,7 @@ "type": "go", "request": "launch", "mode": "debug", - "program": "d:/local.git/be.ems/crontask", + "program": "d:/omc.git/be.ems/crontask", "console": "integratedTerminal" }, { @@ -42,7 +42,7 @@ "type": "go", "request": "launch", "mode": "debug", - "program": "d:/local.git/be.ems/tools/encode", + "program": "d:/omc.git/be.ems/tools/encode", "console": "integratedTerminal" } ] diff --git a/captrace/etc/capconf.yaml b/captrace/etc/capconf.yaml index f918ef1b..899e7993 100644 --- a/captrace/etc/capconf.yaml +++ b/captrace/etc/capconf.yaml @@ -2,7 +2,7 @@ # level: /trace/debug/info/error/warn/error/fatal, default: debug # duration: saved days, default is 30 days logger: - file: d:/local.git/be.ems/captrace/log/captrace.log + file: d:/omc.git/be.ems/captrace/log/captrace.log level: trace duration: 24 count: 10 diff --git a/crontask/etc/crontask.yaml b/crontask/etc/crontask.yaml index afab47b6..7c01af60 100644 --- a/crontask/etc/crontask.yaml +++ b/crontask/etc/crontask.yaml @@ -2,7 +2,7 @@ # level: /trace/debug/info/error/warn/error/fatal, default: debug # duration: saved days, default is 30 days logger: - file: d:/local.git/be.ems/crontask/log/crontask.log + file: d:/omc.git/be.ems/crontask/log/crontask.log level: trace duration: 24 count: 10 @@ -26,7 +26,7 @@ database: port: 33066 name: omc_db connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True - backup: d:/local.git/be.ems/restagent/database + backup: d:/omc.git/be.ems/restagent/database # northbound interface, cm/pm # duration(day): saved days diff --git a/makefile b/makefile index ba83566d..a1aa4afb 100644 --- a/makefile +++ b/makefile @@ -9,7 +9,7 @@ Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) PLATFORM = amd64 ARMPLATFORM = aarch64 -GitLocalRoot = $(HOME)/local.git +GitLocalRoot = $(HOME)/omc.git EmsBuildRoot=$(GitLocalRoot)/build.ems BuildDir = $(EmsBuildRoot)/build BuildOMCDir = $(BuildDir)/usr/local/omc diff --git a/mkpkg.sh b/mkpkg.sh index c998a5b0..fc245950 100755 --- a/mkpkg.sh +++ b/mkpkg.sh @@ -10,7 +10,7 @@ Ky10Arch=ky10.aarch64 RpmPkgName=${ProjectL}-${RelVer}.ky10.aarch64.rpm RpmPkgRename=${ProjectL}-r${RelVer}-ky10.rpm DebPkgName=${ProjectL}-r${RelVer}-ub*.deb -GitLocalRoot=${HOME}/local.git +GitLocalRoot=${HOME}/omc.git EmsBEDir=${GitLocalRoot}/be.ems EmsBuildRoot=${GitLocalRoot}/build.ems RpmArch=`arch` diff --git a/restagent/etc/restconf-t.yaml b/restagent/etc/restconf-t.yaml index 9b447119..2ec34bdc 100644 --- a/restagent/etc/restconf-t.yaml +++ b/restagent/etc/restconf-t.yaml @@ -3,7 +3,7 @@ # duration: rotation time with xx hours, example: 1/12/24 hours # count: rotation count of log, default is 30 rotation logger: - file: d:/local.git/be.ems/restagent/log/restagent.log + file: d:/omc.git/be.ems/restagent/log/restagent.log level: trace duration: 24 count: 2 @@ -27,7 +27,7 @@ rest: webServer: enabled: false - rootDir: d:/local.git/fe.ems.vue3/dist + rootDir: d:/omc.git/fe.ems.vue3/dist listen: - addr: :80 schema: http @@ -46,7 +46,7 @@ database: port: 33066 name: omc_db connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True - backup: d:/local.git/be.ems/restagent/database + backup: d:/omc.git/be.ems/restagent/database # Redis 缓存数据,数据源声明全小写 redis: @@ -113,8 +113,8 @@ omc: binDir: ./bin backup: ./backup upload: ./upload - frontUpload: d:/local.git/fe.ems/upload - frontTraceDir: d:/local.git/fe.ems/trace + frontUpload: d:/omc.git/fe.ems/upload + frontTraceDir: d:/omc.git/fe.ems/trace software: ./software license: ./license gtpUri: gtp:192.168.2.219:2152 diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 61b3dbb0..fb366483 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -4,7 +4,7 @@ # count: rotation count of log, default is 30 rotation # pprof: false(default)/true to disable/enable pprof logger: - file: d:/local.git/be.ems/restagent/log/restagent.log + file: d:/omc.git/be.ems/restagent/log/restagent.log level: trace duration: 24 count: 2 @@ -24,7 +24,7 @@ rest: webServer: enabled: true - rootDir: d:/local.git/fe.ems.vue3/dist + rootDir: d:/omc.git/fe.ems.vue3/dist listen: - addr: :80 schema: http @@ -43,7 +43,7 @@ database: port: 33066 name: "omc_db" connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True - backup: d:/local.git/be.ems/restagent/database + backup: d:/omc.git/be.ems/restagent/database # Redis data cache redis: diff --git a/sshsvc/etc/sshsvc.yaml b/sshsvc/etc/sshsvc.yaml index 7a8435ab..e9019c4f 100644 --- a/sshsvc/etc/sshsvc.yaml +++ b/sshsvc/etc/sshsvc.yaml @@ -3,7 +3,7 @@ # duration: rotation time with xx hours, example: 1/12/24 hours # count: rotation count of log, default is 30 rotation logger: - file: d:/local.git/be.ems/sshsvc/log/sshsvc.log + file: d:/omc.git/be.ems/sshsvc/log/sshsvc.log level: trace duration: 24 count: 30 @@ -13,7 +13,7 @@ logger: # count: rotation count of log, default is 30 rotation # level: cmd/ret log cmd/log cmd & result logmml: - file: d:/local.git/be.ems/sshsvc/mmllog/omcmml.log + file: d:/omc.git/be.ems/sshsvc/mmllog/omcmml.log duration: 24 count: 30 level: ret diff --git a/tools/misc/dumpdb.sh b/tools/misc/dumpdb.sh index 94651e3e..6f2410f6 100644 --- a/tools/misc/dumpdb.sh +++ b/tools/misc/dumpdb.sh @@ -1,7 +1,7 @@ #!/bin/bash Home=/home/simon -GitLocalRoot=${Home}/local.git +GitLocalRoot=${Home}/omc.git EmsBEDir=${GitLocalRoot}/be.ems user="root" password="1000omc@kp!" diff --git a/tools/misc/dumpsql.sh b/tools/misc/dumpsql.sh index 847bd6fd..ea303294 100644 --- a/tools/misc/dumpsql.sh +++ b/tools/misc/dumpsql.sh @@ -1,7 +1,7 @@ #!/bin/bash Home=/home/simon -GitLocalRoot=${Home}/local.git +GitLocalRoot=${Home}/omc.git EmsBEDir=${GitLocalRoot}/be.ems EMSBuildDir=${GitLocalRoot}/build.ems user="root" From 18701c7c41e6d324ee765d81f0a1367c6deda664 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Fri, 25 Oct 2024 16:47:31 +0800 Subject: [PATCH 61/69] release main line version 2.2410.3 --- CHANGELOG.md | 2 +- captrace/makefile | 2 +- crontask/makefile | 2 +- data2html/makefile | 2 +- makefile | 2 +- mkpkg.sh | 2 +- restagent/makefile | 2 +- src/framework/config/config/config.default.yaml | 2 +- sshsvc/makefile | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed8adf99..0269e92c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # 版本发布日志 -## 2.2410.2-20241018 +## 2.2410.3-20241018 - 新增 网元主机支持redis配置项 - 新增 菜单功能iperf3/ping网络测试工具 diff --git a/captrace/makefile b/captrace/makefile index ffc38920..424aa83e 100644 --- a/captrace/makefile +++ b/captrace/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2410.2 +VERSION = 2.2410.3 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/crontask/makefile b/crontask/makefile index 1b28282c..d2ff7b30 100644 --- a/crontask/makefile +++ b/crontask/makefile @@ -1,7 +1,7 @@ # Makefile for OMC-OMC-crontask project PROJECT = OMC -VERSION = 2.2410.2 +VERSION = 2.2410.3 LIBDIR = be.ems/lib BINNAME = crontask diff --git a/data2html/makefile b/data2html/makefile index 01f685a0..2e8609d7 100644 --- a/data2html/makefile +++ b/data2html/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2410.2 +VERSION = 2.2410.3 RelDate = `date +%Y%m%d` Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) diff --git a/makefile b/makefile index a1aa4afb..27d00ccd 100644 --- a/makefile +++ b/makefile @@ -3,7 +3,7 @@ ProjectL = omc ProjectU = OMC PROJECT = $(ProjectL) -VERSION = 2.2410.2 +VERSION = 2.2410.3 RelDate = `date +%Y%m%d` Release = $(RelDate) RelVer = $(VERSION)-$(RelDate) diff --git a/mkpkg.sh b/mkpkg.sh index fc245950..322a7654 100755 --- a/mkpkg.sh +++ b/mkpkg.sh @@ -2,7 +2,7 @@ ProcList="restagent crontask sshsvc captrace data2html" ProjectL=omc -VERSION=2.2410.2 +VERSION=2.2410.3 RelDate=`date +%Y%m%d` Release=${RelDate} RelVer=${VERSION}-${RelDate} diff --git a/restagent/makefile b/restagent/makefile index a8aa4ff5..a0a4adad 100644 --- a/restagent/makefile +++ b/restagent/makefile @@ -1,7 +1,7 @@ # Makefile for rest agent project PROJECT = OMC -VERSION = 2.2410.2 +VERSION = 2.2410.3 PLATFORM = amd64 ARMPLATFORM = aarch64 BUILDDIR = ../../build diff --git a/src/framework/config/config/config.default.yaml b/src/framework/config/config/config.default.yaml index dc60eac3..062700f4 100644 --- a/src/framework/config/config/config.default.yaml +++ b/src/framework/config/config/config.default.yaml @@ -1,7 +1,7 @@ # 项目信息 framework: name: "OMC" - version: "2.2410.2" + version: "2.2410.3" # 应用服务配置 server: diff --git a/sshsvc/makefile b/sshsvc/makefile index 961ff039..5e45b0f1 100644 --- a/sshsvc/makefile +++ b/sshsvc/makefile @@ -1,7 +1,7 @@ # Makefile for OMC-OMC-crontask project PROJECT = OMC -VERSION = 2.2410.2 +VERSION = 2.2410.3 LIBDIR = be.ems/lib BINNAME = sshsvc From 0adc47628f9cfe9daea916e6129e4054c2bbcb48 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Fri, 25 Oct 2024 18:39:21 +0800 Subject: [PATCH 62/69] fix: remove session --- features/nbi/nbi.go | 3 +-- features/nbi/snmp.go | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/features/nbi/nbi.go b/features/nbi/nbi.go index 86721f4c..3686fe51 100644 --- a/features/nbi/nbi.go +++ b/features/nbi/nbi.go @@ -15,7 +15,6 @@ import ( "be.ems/lib/log" "be.ems/lib/oauth" "be.ems/lib/services" - "be.ems/lib/session" "be.ems/restagent/config" ) @@ -35,7 +34,7 @@ type ApiResponse struct { ResultMessage interface{} } -var globalSession = session.NewSessManager("restagent") +//var globalSession = session.NewSessManager("restagent") var ( MAX_RMUID_NUM int diff --git a/features/nbi/snmp.go b/features/nbi/snmp.go index 9317561c..1ab4c004 100644 --- a/features/nbi/snmp.go +++ b/features/nbi/snmp.go @@ -54,28 +54,28 @@ func GetNRMByUri(w http.ResponseWriter, r *http.Request) { // error processing ... // 401-1 response - token, ret := globalSession.IsCarriedToken(r) - if ret == false { - log.Error("AccessToken is not carried") - services.ResponseUnauthorized401AccessTokenNotCarried(w) - return - } + // token, ret := globalSession.IsCarriedToken(r) + // if ret == false { + // log.Error("AccessToken is not carried") + // services.ResponseUnauthorized401AccessTokenNotCarried(w) + // return + // } // 401-2 response - if globalSession.IsValidToken(token) == false { - log.Error("AccessToken fails or does not exist") - services.ResponseUnauthorized401AccessTokenNotExist(w) - return - } + // if globalSession.IsValidToken(token) == false { + // log.Error("AccessToken fails or does not exist") + // services.ResponseUnauthorized401AccessTokenNotExist(w) + // return + // } // response 403 Forbidden, permissions deny // todo... - plist := globalSession.GetPermissionFromSession(token) - log.Debug("permission list:", plist) - if len(plist) == 0 || plist[0] == false { - log.Error("User permission deny") - services.ResponseForbidden403NotPermission(w) - return - } + // plist := globalSession.GetPermissionFromSession(token) + // log.Debug("permission list:", plist) + // if len(plist) == 0 || plist[0] == false { + // log.Error("User permission deny") + // services.ResponseForbidden403NotPermission(w) + // return + // } vars := mux.Vars(r) qeuryUri := vars["apiCategory"] + "/" + vars["elementTypeValue"] + "/" + vars["objectTypeValue"] From 44536f34d480b18bc3ff47de7ebde4c6339581f6 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 28 Oct 2024 16:41:55 +0800 Subject: [PATCH 63/69] =?UTF-8?q?feat:=20=E7=9B=B4=E8=BF=9E=E7=BD=91?= =?UTF-8?q?=E5=85=83=E4=BF=A1=E6=81=AF=E5=8F=96=E5=BE=97hostname/os?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_element/fetch_link/ne_state.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/network_element/fetch_link/ne_state.go b/src/modules/network_element/fetch_link/ne_state.go index 9a5feb39..9da0547d 100644 --- a/src/modules/network_element/fetch_link/ne_state.go +++ b/src/modules/network_element/fetch_link/ne_state.go @@ -49,6 +49,8 @@ func NeState(neInfo model.NeInfo) (map[string]any, error) { "capability": resData["capability"], "sn": resData["serialNum"], "expire": resData["expiryDate"], + "hostname": resData["hostName"], + "os": resData["osInfo"], "cpu": resData["cpuUsage"], "mem": resData["memUsage"], "disk": resData["diskSpace"], From c6c40e55d944a7b833417e58ad02e0854fb2e66e Mon Sep 17 00:00:00 2001 From: lai <371757574@qq.com> Date: Tue, 29 Oct 2024 15:03:57 +0800 Subject: [PATCH 64/69] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=88=97=E4=BB=A5=E5=8F=8A=E6=96=B0=E5=A2=9E=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/controller/smf.go | 66 +++++++++++++++++----- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index d944f813..48bdee05 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -130,7 +130,16 @@ func (s *SMFController) CDRExport(c *gin.Context) { "G1": "Data Total Volume", "H1": "Duration", "I1": "Invocation Time", - "J1": "PDU Session Charging Information", + "J1": "User Identifier", + "K1": "SSC Mode", + "L1": "DNN ID", + "M1": "PDU Type", + "N1": "RAT Type", + "O1": "PDU IPv4 Address", + "P1": "PDU IPv6 Address Swith Prefix", + "Q1": "Record Network Function ID", + "R1": "Record Type", + "S1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -164,6 +173,7 @@ func (s *SMFController) CDRExport(c *gin.Context) { dataVolumeDownlink := []string{} // 数据总量 dataTotalVolume := []string{} + if v, ok := cdrJSON["listOfMultipleUnitUsage"]; ok && v != nil { usageList := v.([]any) if len(usageList) > 0 { @@ -198,32 +208,31 @@ func (s *SMFController) CDRExport(c *gin.Context) { invocationTimestamp = v.(string) } // 记录打开时间 - pduSessionChargingInformation := "" + User_Identifier := "" + SSC_Mode := "" + RAT_Type := "" + DNN_ID := "" + PDU_Type := "" + PDU_IPv4 := "" + PDU_IPv6 := "" if v, ok := cdrJSON["pDUSessionChargingInformation"]; ok && v != nil { pduInfo := v.(map[string]any) - User_Identifier := "" if v, ok := pduInfo["userIdentifier"]; ok && v != nil { User_Identifier = v.(string) } - SSC_Mode := "" if v, ok := pduInfo["sSCMode"]; ok && v != nil { SSC_Mode = v.(string) } - RAT_Type := "" if v, ok := pduInfo["rATType"]; ok && v != nil { RAT_Type = v.(string) } - DNN_ID := "" if v, ok := pduInfo["dNNID"]; ok && v != nil { DNN_ID = v.(string) } - PDU_Type := "" if v, ok := pduInfo["pDUType"]; ok && v != nil { PDU_Type = v.(string) } - PDU_IPv4 := "" - PDU_IPv6 := "" if v, ok := pduInfo["pDUAddress"]; ok && v != nil { pDUAddress := v.(map[string]any) if addr, ok := pDUAddress["pDUIPv4Address"]; ok && addr != nil { @@ -234,11 +243,29 @@ func (s *SMFController) CDRExport(c *gin.Context) { } } - pduSessionChargingInformation = fmt.Sprintf(`User Identifier: %s -SSC Mode: %s RAT Type: %s DNN ID: %s -PDU Type: %s -PDU IPv4 Address: %s -PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, PDU_Type, PDU_IPv4, PDU_IPv6) + // pduSessionChargingInformation = fmt.Sprintf(`User Identifier: %s + // SSC Mode: %s RAT Type: %s DNN ID: %s + // PDU Type: %s + // PDU IPv4 Address: %s + // PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, PDU_Type, PDU_IPv4, PDU_IPv6) + } + + // 记录网络参数ID + recordNFID := "" + if v, ok := cdrJSON["recordingNetworkFunctionID"]; ok && v != nil { + recordNFID = v.(string) + } + + //记录开始时间 + recordOpeningTime := "" + if v, ok := cdrJSON["recordOpeningTime"]; ok && v != nil { + recordOpeningTime = v.(string) + } + + //记录类型 + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = v.(string) } dataCells = append(dataCells, map[string]any{ @@ -251,7 +278,16 @@ PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, "G" + idx: strings.Join(dataTotalVolume, ","), "H" + idx: duration, "I" + idx: invocationTimestamp, - "J" + idx: pduSessionChargingInformation, + "J" + idx: User_Identifier, + "K" + idx: SSC_Mode, + "L" + idx: DNN_ID, + "M" + idx: PDU_Type, + "N" + idx: RAT_Type, + "O" + idx: PDU_IPv4, + "P" + idx: PDU_IPv6, + "Q" + idx: recordNFID, + "R" + idx: recordType, + "S" + idx: recordOpeningTime, }) } From 32852c95d813a9433092cf56d9864caea8ab6e37 Mon Sep 17 00:00:00 2001 From: lai <371757574@qq.com> Date: Tue, 29 Oct 2024 19:32:00 +0800 Subject: [PATCH 65/69] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/controller/smf.go | 84 +++++++++++++--------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 48bdee05..094b4843 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -123,26 +123,30 @@ func (s *SMFController) CDRExport(c *gin.Context) { headerCells := map[string]string{ "A1": "ID", "B1": "Charging ID", - "C1": "Subscriber ID Data", - "D1": "Subscriber ID Type", - "E1": "Data Volume Uplink", - "F1": "Data Volume Downlink", - "G1": "Data Total Volume", - "H1": "Duration", - "I1": "Invocation Time", - "J1": "User Identifier", - "K1": "SSC Mode", - "L1": "DNN ID", - "M1": "PDU Type", - "N1": "RAT Type", - "O1": "PDU IPv4 Address", - "P1": "PDU IPv6 Address Swith Prefix", - "Q1": "Record Network Function ID", - "R1": "Record Type", - "S1": "Record Opening Time", + "C1": "NE Name", + "D1": "Resource Unique ID", + "E1": "Subscriber ID Data", + "F1": "Subscriber ID Type", + "G1": "Data Volume Uplink", + "H1": "Data Volume Downlink", + "I1": "Data Total Volume", + "J1": "Duration", + "K1": "Invocation Time", + "L1": "User Identifier", + "M1": "SSC Mode", + "N1": "DNN ID", + "O1": "PDU Type", + "P1": "RAT Type", + "Q1": "PDU IPv4 Address", + "R1": "Network Function IPv4", + "S1": "PDU IPv6 Address Swith Prefix", + "T1": "Record Network Function ID", + "U1": "Record Type", + "V1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) + for i, row := range rows { idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map @@ -167,6 +171,15 @@ func (s *SMFController) CDRExport(c *gin.Context) { subscriptionIDData = sub["subscriptionIDData"].(string) } } + + // 网络功能 IPv4 地址 + networkFunctionIPv4Address := "" + if v, ok := cdrJSON["nFunctionConsumerInformation"]; ok && v != nil { + if conInfo, conInfoOk := v.(map[string]any); conInfoOk && conInfo != nil { + networkFunctionIPv4Address = conInfo["networkFunctionIPv4Address"].(string) + } + } + // 数据量上行链路 dataVolumeUplink := []string{} // 数据量下行链路 @@ -271,23 +284,26 @@ func (s *SMFController) CDRExport(c *gin.Context) { dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, "B" + idx: chargingID, - "C" + idx: subscriptionIDData, - "D" + idx: subscriptionIDType, - "E" + idx: strings.Join(dataVolumeUplink, ","), - "F" + idx: strings.Join(dataVolumeDownlink, ","), - "G" + idx: strings.Join(dataTotalVolume, ","), - "H" + idx: duration, - "I" + idx: invocationTimestamp, - "J" + idx: User_Identifier, - "K" + idx: SSC_Mode, - "L" + idx: DNN_ID, - "M" + idx: PDU_Type, - "N" + idx: RAT_Type, - "O" + idx: PDU_IPv4, - "P" + idx: PDU_IPv6, - "Q" + idx: recordNFID, - "R" + idx: recordType, - "S" + idx: recordOpeningTime, + "C" + idx: row.NeName, + "D" + idx: row.RmUID, + "E" + idx: subscriptionIDData, + "F" + idx: subscriptionIDType, + "G" + idx: strings.Join(dataVolumeUplink, ","), + "H" + idx: strings.Join(dataVolumeDownlink, ","), + "I" + idx: strings.Join(dataTotalVolume, ","), + "J" + idx: duration, + "K" + idx: invocationTimestamp, + "L" + idx: User_Identifier, + "M" + idx: SSC_Mode, + "N" + idx: DNN_ID, + "O" + idx: PDU_Type, + "P" + idx: RAT_Type, + "Q" + idx: PDU_IPv4, + "R" + idx: networkFunctionIPv4Address, + "S" + idx: PDU_IPv6, + "T" + idx: recordNFID, + "U" + idx: recordType, + "V" + idx: recordOpeningTime, }) } From a1010c84e5f6c71f533a34388b1a330128ed19dc Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Tue, 29 Oct 2024 19:40:04 +0800 Subject: [PATCH 66/69] dpkg debian package for general and BA tag --- makefile | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/makefile b/makefile index 27d00ccd..8e0abff1 100644 --- a/makefile +++ b/makefile @@ -12,14 +12,17 @@ ARMPLATFORM = aarch64 GitLocalRoot = $(HOME)/omc.git EmsBuildRoot=$(GitLocalRoot)/build.ems BuildDir = $(EmsBuildRoot)/build +CustomizedDir = $(EmsBuildRoot)/customized BuildOMCDir = $(BuildDir)/usr/local/omc BuildOMCBinDir = $(BuildOMCDir)/bin BuildOMCEtcDir = $(BuildOMCDir)/etc BuildLibDir = $(BuildDir)/lib BuildLibSystemDir = $(BuildLibDir)/systemd/system DebBuildDir = $(EmsBuildRoot)/debbuild +DebBuildOMCDir = $(EmsBuildRoot)/debbuild/usr/local/omc DebFEBuildDir = $(EmsBuildRoot)/debbuild/usr/local/omc/htdocs DebBuild2204Dir = $(EmsBuildRoot)/debbuild/22.04 +DebBuild2204OMCDir = $(EmsBuildRoot)/debbuild/22.04/usr/local/omc DebFEBuild2204Dir = $(EmsBuildRoot)/debbuild/22.04/usr/local/omc/htdocs RpmBuildDir = $(EmsBuildRoot)/rpmbuild RpmFEBuildDir = $(RpmBuildDir)/BUILD/usr/local/omc/htdocs @@ -54,11 +57,14 @@ RestagentSize = 29525312 BinWriterDir = $(HOME)/bin ifeq ($(shell grep VERSION_ID /etc/os-release), VERSION_ID="22.04") DebBuildDir := $(DebBuild2204Dir) +DebBuildOMCDir := $(DebBuild2204OMCDir) DebFEBuildDir := $(DebFEBuild2204Dir) #DebPkgFile := $(PROJECT)-$(VERSION)-22.04-$(Release).$(PLATFORM).deb DebPkgFile := $(PROJECT)-r$(VERSION)-$(Release)-ub22.deb +DebPkgFileBA := $(PROJECT)-r$(VERSION)-$(Release)-ub22-ba.deb else ifeq ($(shell grep VERSION_ID /etc/os-release), VERSION_ID="18.04") DebPkgFile := $(PROJECT)-r$(VERSION)-$(Release)-ub18.deb +DebPkgFileBA := $(PROJECT)-r$(VERSION)-$(Release)-ub18-ba.deb endif .PHONY: all $(RESTAGENT) $(CRONTASK) $(SshSvcBin) $(CapTraceBin) $(Data2htmlBin) @@ -101,7 +107,7 @@ dist: --exclude=../crontask/crontask \ --exclude=../initems/initems -deb: $(BINNAME) +prep_deb: $(BINNAME) # clear build cache rm -rf $(FrontBuildDir)/front/* rm -rf $(DebFEBuildDir)/front/* @@ -123,6 +129,14 @@ deb: $(BINNAME) chmod 755 $(DebBuildDir)/DEBIAN/postinst chmod 755 $(DebBuildDir)/DEBIAN/postrm cp -rf $(BuildDir)/* $(DebBuildDir)/ + +replace_chinese: + @find $(DebBuildOMCDir)/etc/db -type f -name '*.sql' -exec sed -i '' 's/[一-龥]//g' {} + + @echo "Replace all chinese charecter." + +deb: prep_deb + cp -rf $(CustomizedDir)/agt.d $(DebBuildOMCDir)/static + cp -rf $(CustomizedDir)/omc.d $(DebBuildOMCDir)/static #cp -rf $(BuildDir)/nginx/* $(DebBuildDir)/etc/nginx/conf.d #cp -rf $(BuildDir)/systemd/*.service $(DebBuildDir)/lib/systemd/system/ chmod +x $(DebBuildDir)/usr/local/omc/bin/* @@ -131,6 +145,16 @@ deb: $(BINNAME) perl -0777 -i -pe 's/ne:\n user: root/ne:\n user: omcuser/g' $(DebBuildDir)/usr/local/omc/etc/default/restconf.yaml dpkg -b $(DebBuildDir) $(ReleaseDebs)/$(DebPkgFile) +ba-deb: prep_deb replace_chinese + cp -rf $(CustomizedDir)/ba.d $(DebBuildOMCDir)/static + #cp -rf $(BuildDir)/nginx/* $(DebBuildDir)/etc/nginx/conf.d + #cp -rf $(BuildDir)/systemd/*.service $(DebBuildDir)/lib/systemd/system/ + chmod +x $(DebBuildDir)/usr/local/omc/bin/* + #sed -i.bak 's/YYYYMMDD/$(shell date +"%Y%m%d")/g' $(DebBuildDir)/DEBIAN/control + sed -i 's/YYYYMMDD/$(shell date +"%Y%m%d")/g' $(DebBuildDir)/DEBIAN/control + perl -0777 -i -pe 's/ne:\n user: root/ne:\n user: omcuser/g' $(DebBuildDir)/usr/local/omc/etc/default/restconf.yaml + dpkg -b $(DebBuildDir) $(ReleaseDebs)/$(DebPkgFileBA) + rpm: $(BINNAME) # clear build cache rm -rf $(FrontBuildDir)/front/* From 8ab91bab70fb3aa8901eba43761a6fe1a6056c41 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 30 Oct 2024 09:35:35 +0800 Subject: [PATCH 67/69] make package support ba deb --- mkpkg.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mkpkg.sh b/mkpkg.sh index 322a7654..48114084 100755 --- a/mkpkg.sh +++ b/mkpkg.sh @@ -53,7 +53,13 @@ case "$1" in make deb cd $ReleaseDir/"$1"s/$RelArch rm -f omc-md5sum.txt -# rpm --addsign *.rpm + md5sum $DebPkgName >omc-md5sum.txt + ;; + ba-deb) + cd $EmsBEDir + make ba-deb + cd $ReleaseDir/"$1"s/$RelArch + rm -f omc-md5sum.txt md5sum $DebPkgName >omc-md5sum.txt ;; *) From 8348ecc30bbd0c26a5d705857e49b5d669be7a87 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 30 Oct 2024 11:14:43 +0800 Subject: [PATCH 68/69] update make package --- makefile | 6 +++--- mkpkg.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/makefile b/makefile index 8e0abff1..07d31ef9 100644 --- a/makefile +++ b/makefile @@ -107,7 +107,7 @@ dist: --exclude=../crontask/crontask \ --exclude=../initems/initems -prep_deb: $(BINNAME) +pre_build: $(BINNAME) # clear build cache rm -rf $(FrontBuildDir)/front/* rm -rf $(DebFEBuildDir)/front/* @@ -134,7 +134,7 @@ replace_chinese: @find $(DebBuildOMCDir)/etc/db -type f -name '*.sql' -exec sed -i '' 's/[一-龥]//g' {} + @echo "Replace all chinese charecter." -deb: prep_deb +deb: pre_build cp -rf $(CustomizedDir)/agt.d $(DebBuildOMCDir)/static cp -rf $(CustomizedDir)/omc.d $(DebBuildOMCDir)/static #cp -rf $(BuildDir)/nginx/* $(DebBuildDir)/etc/nginx/conf.d @@ -145,7 +145,7 @@ deb: prep_deb perl -0777 -i -pe 's/ne:\n user: root/ne:\n user: omcuser/g' $(DebBuildDir)/usr/local/omc/etc/default/restconf.yaml dpkg -b $(DebBuildDir) $(ReleaseDebs)/$(DebPkgFile) -ba-deb: prep_deb replace_chinese +badeb: pre_build replace_chinese cp -rf $(CustomizedDir)/ba.d $(DebBuildOMCDir)/static #cp -rf $(BuildDir)/nginx/* $(DebBuildDir)/etc/nginx/conf.d #cp -rf $(BuildDir)/systemd/*.service $(DebBuildDir)/lib/systemd/system/ diff --git a/mkpkg.sh b/mkpkg.sh index 48114084..58ce1b0b 100755 --- a/mkpkg.sh +++ b/mkpkg.sh @@ -55,15 +55,15 @@ case "$1" in rm -f omc-md5sum.txt md5sum $DebPkgName >omc-md5sum.txt ;; - ba-deb) + badeb) cd $EmsBEDir - make ba-deb + make badeb cd $ReleaseDir/"$1"s/$RelArch rm -f omc-md5sum.txt md5sum $DebPkgName >omc-md5sum.txt ;; *) echo "make omc package" - echo "Usage: $0 rpm|deb " + echo "Usage: $0 rpm|deb|badeb " ;; esac \ No newline at end of file From e335c75b536a6f55788744740420544b86e3df98 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 30 Oct 2024 17:14:53 +0800 Subject: [PATCH 69/69] support agt customized --- misc/setomc.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/misc/setomc.sh b/misc/setomc.sh index d1c83353..955292d4 100755 --- a/misc/setomc.sh +++ b/misc/setomc.sh @@ -20,6 +20,9 @@ check_args() { elif [ "${C_ARG_LOWER}" == "omc" ]; then C_ARG_UPPER="OMC" sed -i 's/VENDORS=.*/VENDORS=OMC/' /usr/local/omc/etc/omc.conf + elif [ "${C_ARG_LOWER}" == "agt" ]; then + C_ARG_UPPER="AGT" + sed -i 's/VENDORS=.*/VENDORS=AGT/' /usr/local/omc/etc/omc.conf fi ;; m)